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