Это лучше всего виден в коде:
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();
возвращает новый экземпляр класса класса вызывающего объекта.
Точная разница заключается в том, что вы получите фатальную ошибку с 'self :: __ construct()', потому что конструктор подразумевается как статический, который php не имеет (по крайней мере, не мой 5.3.10, что я использования). 'new self()' правильно создаст объект. Конечно, многое зависит от контекста, например, где вы вызываете эти утверждения. –
@ N.B. [Нет фатальной ошибки в 5.2.5] (http://codepad.org/WBo164MK) ... и ваш аргумент разваливается в любом случае, если учесть, что вы можете законно выполнять 'parent :: __ construct()' ... – DaveRandom
@DaveRandom - Я действительно сказал: «Это зависит от контекста», не так ли? –