Почему PHP не вызывает автоматически родительские конструкторы? - PullRequest
26 голосов
/ 15 декабря 2009

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

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

Ответы [ 3 ]

25 голосов
/ 15 декабря 2009

Я думаю, это хорошо, что 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();
}

Это означает, что вы можете свободно вызывать родительский конструктор в любом месте дочернего элемента, и вы можете делать вещи до и после вызова. Разве это не особенность?

8 голосов
/ 14 марта 2015

Если в дочернем классе нет конструктора, автоматически вызывается родительский.

Если вы решили добавить конструктор в дочерний класс, то, конечно, вам нужно явно вызвать родительский конструктор. Если вы уже тратите время на добавление конструктора в свой дочерний класс, то добавление еще одной строки кода parent::__construct(); не кажется большой проблемой. Но переопределение - это на самом деле удобная гибкость.

1 голос
/ 21 декабря 2009

во избежание тесной связи, поэтому наследование (ключевое слово extends в java) является злым, и интерфейс предпочтителен, см. Статью Javaworld: http://www.javaworld.com/javaworld/jw-08-2003/jw-0801-toolbox.html

Тем не менее, было бы замечательно, если бы в какой-то момент была инструкция по вызову родителя с помощью специального ключевого слова, например forward, но я еще не видел этого ни на одном языке (даже на Rebol), кроме как на неизвестном языке, изобретенном Полом Алленом ( да, соучредитель Microsoft), который является Openscript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...