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

Почему PHP не имеет конструктора по умолчанию?

Почему я не могу использовать такой код?

<?php

class NoConstructor {
}

class ChildWithConstructor extends NoConstructor {
    public function __construct() {
        parent::__construct();
        // do something
    }
}

$foo = new ChildWithConstructor();
// **Fatal error: Cannot call constructor in file.php on line 8**

Eg. В классах Java по умолчанию нет конструктора args. Его можно вызывать, даже если он явно не определен.

Поведение PHP может вызвать проблемы при удалении конструктора args из родительского класса, например. когда мы считаем, что он больше не нужен.

Кто-нибудь знает, почему создатели PHP сделали это таким образом?

4b9b3361

Ответ 1

В классах Java по умолчанию нет конструктора args.

Кто-нибудь знает, почему создатели PHP сделали это таким образом?

Java - это плановый язык. Это было строго учтено и формально определено с самого начала. Он должен был длиться как можно дольше с минимальными изменениями для обратной и передовой совместимости, для простоты для разработчиков и разработчиков. Определенно не получилось так, как они надеялись, но вы все равно можете взять код Java 1.0, скомпилировать его и запустить на современных виртуальных машинах.

Разработчики PHP никогда не планировали язык до такой степени. Они делают это, когда они идут. К лучшему или худшему, они умеренно готовы отбросить язык и перестроить его в следующей версии. Он изменился неузнаваемо с тех пор, как PHP 1 и 2. Даже недавно, в PHP 5, у вас было резкое изменение от байтовой стоимости к ссылочной семантике для объектов. Это та самая блестящая методология, которая принесла нам магические кавычки, отсутствие Unicode, непоследовательно названных (и часто переименованных) функций, и парсер, который без даже намека на ошибку (даже с error_reporting(-1);) будет весело интерпретировать числовой литерал 09 как 0.

Поведение PHP может вызвать проблемы при удалении конструктора args из родительского класса, например. когда мы считаем, что он больше не нужен.

Вы можете потребовать, чтобы это было изменено на bugs.php.net, но, скорее всего, они проигнорируют его или сфотографируют с помощью "Извините, но ваша проблема не подразумевает проблемы с самим PHP...".

Ответ 2

Как мы видели с 5.3.7 катастрофа, для разработки PHP может потребоваться еще одна стабильность. Кроме того, PHP отличается разными способами.

  • Enterprise Backup не входит в одну лигу (без Oracle, без IBM и т.д.).
  • PHP старый, а иногда и непоследовательный
  • PHP Interpreter (Zend Engine) должен уметь много делать, поддерживая так много устаревших конструкций и парадигм программирования.
  • Начало PHP - это простой язык script для любителей.

Мне очень нравится PHP и ежедневно работаю с ним, но иногда это просто немного причуда. С другой стороны, если вы удалите __construct(), вам следует рассмотреть две вещи.

  • Никогда не делайте этого, просто пустите конструктор
  • Если вы создаете фреймворк, то init выполняет основную концепцию, так как это даже хорошая практика.

Я имею в виду это:

class BaseClass {
  public function __construct() {
      if(method_exists($this, 'init') {
          $this->init();
      }
  }
}

Ответ 3

До PHP 5 конструктор имел то же имя, что и класс, например JAVA. В PHP 5 класс может иметь метод конструктора с тем же именем, что и класс (если не в пространстве имен) или с именем __construct. Может быть, это как-то связано с этим.

Ответ 4

Линия

parent::__construct();

- вызов EXPLICIT конструктору родительского класса. "PHP" дает вам ошибку, потому что ее не существует.

Можете ли вы на самом деле явно вызвать родительский несуществующий конструктор в Java и не получить ошибку?

Помните, что конструктор класса, расширяющий родительский класс, переопределит конструктор родительского класса при построении расширяющегося класса. Вызов родительского конструктора подразумевает, что вы ожидаете, что он что-то сделает. Если конструктор не существует, ваш вызов ему не принадлежит коду, если интерпретатор дает вам ошибку или нет.