2012-04-04 89 views
4

你能告訴我return self::__construct()return new self()之間的確切區別嗎?self :: __ construct()和new self()之間的確切區別

當創建該對象時,似乎實際上可以從__construct()調用中返回self::__construct(),並返回該對象本身,就好像第一個__construct()從未被調用過一樣。

+1

確切的區別是,你會因'self :: __ construct()'得到一個致命錯誤,因爲構造函數隱含是一個靜態的 - 這個php沒有(至少不是我的5.3.10)使用)。 'new self()'會正確創建對象。當然,這很大程度上取決於上下文,比如你從哪裏調用這些語句。 – 2012-04-04 15:45:39

+1

@ N.B。 [5.2.5中沒有致命錯誤](http://codepad.org/WBo164MK)...無論如何,當你認爲你可以合法地做'parent :: __ construct()'時,你的論點就會分崩離析... – DaveRandom 2012-04-04 15:55:15

+0

@DaveRandom - 我確實說過「這取決於上下文」,是不是? – 2012-04-04 19:46:51

回答

6

這代碼最佳地示出:

class MyClass { 

    public $arg; 

    public function __construct ($arg = NULL) { 
    if ($arg !== NULL) $this->arg = $arg; 
    return $this->arg; 
    } 

    public function returnThisConstruct() { 
    return $this->__construct(); 
    } 

    public function returnSelfConstruct() { 
    return self::__construct(); 
    } 

    public function returnNewSelf() { 
    return new self(); 
    } 

} 

$obj = new MyClass('Hello!'); 
var_dump($obj); 
/* 
    object(MyClass)#1 (1) { 
    ["arg"]=> 
    string(6) "Hello!" 
    } 
*/ 

var_dump($obj->returnThisConstruct()); 
/* 
    string(6) "Hello!" 
*/ 

var_dump($obj->returnNewSelf()); 
/* 
    object(MyClass)#2 (1) { 
    ["arg"]=> 
    NULL 
    } 
*/ 

var_dump($obj->returnSelfConstruct()); 
/* 
    string(6) "Hello!" 
*/ 

return self::__construct()返回通過將對象__construct方法返回。它還會再次在構造函數中運行代碼。當從類__construct方法本身調用時,返回self::__construct()實際上將返回構造的類本身,如方法通常所做的那樣。

return new self();返回調用對象的類的新實例

+0

這對我來說很清楚:)謝謝! – 2012-04-05 08:45:53

+0

@DaveRandom我認爲一個PHP構造函數應該只返回他創建的對象,而不是一個值。 – 2013-11-14 19:37:13

5

我認爲new self()會創建類的新實例,而self::__construct()只調用類__construct方法。

+1

而'__construct'方法通常不會有返回值。 – 2012-04-04 15:45:00

+1

@Rocket - '__construct'總是有一個返回值 - 創建的對象。 – 2012-04-04 15:46:32

+2

@ N.B。情況並非如此,[是的](http://codepad.org/nMRedKBa)?構造不返回類的實例,它在實例化過程中被調用並返回NULL。實際上,至少。 – DaveRandom 2012-04-04 15:51:08

相關問題