Довольно простой вопрос. В C++ родительского конструктора неявно вызовут перед дочерним конструктором, поэтому что логика там для PHP, чтобы не сделать вещи этот путь?
Править: У меня есть хороший ответ от Lukman, но я надеялся по большему количеству причины, почему существует различие. Возможно, вопрос должен состоять в том, почему C++ не позволяет пользовательский вызов родительских конструкторов? Я предполагаю, что это - другой вопрос все же.
Я думаю, что PHP заставляет вас вызывать родительский конструктор вручную, потому что он позволяет дочернему конструктору, например:
public function __construct() {
// set up variables that parent::__construct() requires
$var1 = get_stuff_from_db();
$var2 = get_stuff_from_webservice();
parent::__construct($var1, $var2);
// continue setting up $this var
$this->default = 'Default';
$this->do_some_secret_stuff();
}
Или даже:
public function __construct($param) {
// call differently based on condition
if (is_array($param))
$param['id'] = 0;
parent::__construct($param);
}
else {
parent::__construct($param, 0, TRUE);
}
// continue setting up $this var
$this->default = 'Default';
$this->do_some_secret_stuff();
}
Это означает, что вы можете вызывать родительский конструктор в любом месте дочернего конструктора, и вы можете делать что-то до и после вызов. Разве это не особенность?
, чтобы избежать тесной связи, поэтому наследование (расширение ключевого слова в java) является злом, а класс интерфейса является предпочтительным, см. статью в Javaworld: http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html
Было бы здорово, если бы в какой-то момент появилась инструкция вызывать родителя со специальным ключевым словом типа forward, но я еще не видел этого ни на одном языке (даже Rebol), кроме неизвестного языка, изобретенного Полом Алленом (да, соучредителем Microsoft), которым является Openscript.
.