2012-04-04 55 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

相关问题