Почему 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**

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

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

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

4 ответов


классы Java имеют значение по умолчанию, без конструктора args.

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

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

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

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

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


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

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

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

  1. никогда не делайте этого, просто очистите конструктор
  2. если вы строите структуру, сделайте функции init основной концепцией, так как это даже хорошая практика.

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

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

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


строку

parent::__construct();

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

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

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