你能告诉我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