Почему PHP не автоматически вызывает родительские конструкторы?
Довольно простой вопрос. В С++ родительский конструктор будет неявным образом вызываться перед дочерним конструктором, так что же логика для PHP не делать так?
РЕДАКТИРОВАТЬ: У меня есть хороший ответ от Лукмана, но я надеялся, что побольше причин, почему есть разница. Может быть, вопрос в том, почему С++ не позволяет настраивать вызов родительских конструкторов? Я предполагаю, что другой вопрос.
Ответы
Ответ 1
Я думаю, что хорошо, что 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();
}
Смысл, вы можете вызвать родительский конструктор в любом месте дочернего элемента, и вы можете делать что-то до и после вызова. Разве это не особенность?
Ответ 2
Когда у вас нет конструктора в дочернем классе, автоматически вызывается родительский.
Если вы решили добавить конструктор к дочернему классу, то, конечно, вам нужно явно вызвать родительский конструктор. Если вы уже нашли время, чтобы добавить конструктор к вашему дочернему классу, добавление еще одной строки кода parent::__construct();
, похоже, не имеет большого значения. Но переопределение на самом деле является удобной гибкостью.
Ответ 3
чтобы избежать жесткой связи, почему наследование (расширение ключевого слова в java) является злом, а класс интерфейса предпочтительнее, см. статью Javaworld:
http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html
И все же было бы здорово, если бы была какая-то инструкция, чтобы вызвать родителя в какой-то момент со специальным ключевым словом, таким как forward, но я еще не видел этого ни на одном языке (даже Rebol), кроме как на незнакомом языке, изобретенном Полом Алленом ( да, соучредитель Microsoft), который является Openscript.