你能告訴我return self::__construct()
和return new self()
之間的確切區別嗎?self :: __ construct()和new self()之間的確切區別
當創建該對象時,似乎實際上可以從__construct()
調用中返回self::__construct()
,並返回該對象本身,就好像第一個__construct()
從未被調用過一樣。
你能告訴我return self::__construct()
和return new self()
之間的確切區別嗎?self :: __ construct()和new self()之間的確切區別
當創建該對象時,似乎實際上可以從__construct()
調用中返回self::__construct()
,並返回該對象本身,就好像第一個__construct()
從未被調用過一樣。
這代碼最佳地示出:
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();
返回調用對象的類的新實例。
這對我來說很清楚:)謝謝! – 2012-04-05 08:45:53
@DaveRandom我認爲一個PHP構造函數應該只返回他創建的對象,而不是一個值。 – 2013-11-14 19:37:13
我認爲new self()
會創建類的新實例,而self::__construct()
只調用類__construct
方法。
而'__construct'方法通常不會有返回值。 – 2012-04-04 15:45:00
@Rocket - '__construct'總是有一個返回值 - 創建的對象。 – 2012-04-04 15:46:32
@ N.B。情況並非如此,[是的](http://codepad.org/nMRedKBa)?構造不返回類的實例,它在實例化過程中被調用並返回NULL。實際上,至少。 – DaveRandom 2012-04-04 15:51:08
確切的區別是,你會因'self :: __ construct()'得到一個致命錯誤,因爲構造函數隱含是一個靜態的 - 這個php沒有(至少不是我的5.3.10)使用)。 'new self()'會正確創建對象。當然,這很大程度上取決於上下文,比如你從哪裏調用這些語句。 – 2012-04-04 15:45:39
@ N.B。 [5.2.5中沒有致命錯誤](http://codepad.org/WBo164MK)...無論如何,當你認爲你可以合法地做'parent :: __ construct()'時,你的論點就會分崩離析... – DaveRandom 2012-04-04 15:55:15
@DaveRandom - 我確實說過「這取決於上下文」,是不是? – 2012-04-04 19:46:51