2011-09-08 187 views
2

爲什麼構造函數返回對象,而不是返回值(boolean)?構造函數返回一個對象,而不是值

class A{ 

    function __construct($stuff){ 

    return ($this->load($stuff) !== false); 
    } 
} 

$aaa = new A($stuff); 

if(!$aaa) die('error'); // never happens 


print_r($aaa); // it's a object... 
+0

這個問題的第一個答案將幫助您http://stackoverflow.com/questions/2214724/php-constructor-to-return-a-null – doNotCheckMyBlog

回答

1

構造函數只能返回一個對象的新實例。 你可以嘗試使用一個靜態函數調用來調用構造函數,並返回false或新對象。

+2

那麼爲什麼返回允許他們? – Boxxy

4

構造函數:你做錯了。

Constructors做他們的名字所暗示的:構造一個對象的新實例。因此構造函數返回唯一有意義的東西就是該對象的一個​​實例。請注意,您幾乎從不會看到構造函數具有明確的return聲明。

的更清潔的方式來完成我相信你想要做的就是使用exceptions

class A { 
    function __construct($stuff) { 
     if ($this->load($stuff) === false) { 
      throw new Exception('Unable to load'); 
     } 
    } 
} 

try { 
    $aaa = new A($stuff); 
} catch (Exception $e) { 
    die('error' . $e->getMessage()); 
} 

他們允許的,所以有可能是一個令人信服的理由。現在想不出來。

0

構造函數的返回值被new運算符忽略。 new運算符將始終返回一個對象。當代碼如

class A { 
    function __construct() { 
     return 1; 
    } 
} 
class B extends A { 
    function __construct() { 
     var_dump(parent::__construct()); 
    } 
} 
new B(); 

你可以看到構造函數有一個返回值。編寫這樣的代碼當然沒什麼意義。

爲了處理構造函數中的錯誤,你必須使用異常。另一種方法是某種工廠方法。

class C { 
    private function __construct() { } 
    private function init() { 
     if (something_goes_wrong()) { 
      return false; 
     } 
    } 

    public static createInstance() { 
     $retval = new self; 
     if (!$retval->init()) { 
      return false; 
     } 
     return $retval; 
    } 
} 
相關問題