2012-04-04 3 views
4

Можете ли вы рассказать мне точную разницу между return self::__construct() и return new self()?Точная разница между self :: __ construct() и новым self()

Кажется, что на самом деле можно вернуть self::__construct() с вызова __construct(), когда объект создан, возвращая сам объект, как если бы первый __construct() никогда не назывался.

+1

Точная разница заключается в том, что вы получите фатальную ошибку с 'self :: __ construct()', потому что конструктор подразумевается как статический, который php не имеет (по крайней мере, не мой 5.3.10, что я использования). 'new self()' правильно создаст объект. Конечно, многое зависит от контекста, например, где вы вызываете эти утверждения. –

+1

@ N.B. [Нет фатальной ошибки в 5.2.5] (http://codepad.org/WBo164MK) ... и ваш аргумент разваливается в любом случае, если учесть, что вы можете законно выполнять 'parent :: __ construct()' ... – DaveRandom

+0

@DaveRandom - Я действительно сказал: «Это зависит от контекста», не так ли? –

ответ

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

Это довольно ясно для меня :) Спасибо! –

+0

@DaveRandom Я думал, что PHP-конструктор должен возвращать только объект, который он создает, а не значение. –

5

Я считаю, что new self() создаст новый экземпляр класса, а self::__construct() вызовет только классы __construct.

+1

И методы '__construct' обычно не имеют возвращаемых значений. –

+1

@Rocket - '__construct' всегда имеет возвращаемое значение - созданный объект. –

+2

@ N.B. Это не так, [это] (http://codepad.org/nMRedKBa)? Construct не возвращает экземпляр класса, он вызывается во время создания экземпляра и возвращает NULL. На практике, по крайней мере. – DaveRandom

Смежные вопросы