Подтвердить что ты не робот

Почему PHP не автоматически вызывает родительские конструкторы?

Довольно простой вопрос. В С++ родительский конструктор будет неявным образом вызываться перед дочерним конструктором, так что же логика для PHP не делать так?

РЕДАКТИРОВАТЬ: У меня есть хороший ответ от Лукмана, но я надеялся, что побольше причин, почему есть разница. Может быть, вопрос в том, почему С++ не позволяет настраивать вызов родительских конструкторов? Я предполагаю, что другой вопрос.

4b9b3361

Ответ 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.