Почему я не могу использовать такой код?
<?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 сделали это так?
В классах 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 …» .
Как мы видели с потерей 5.3.7 , развитие PHP может потребовать некоторой стабильности. Кроме того, PHP отличается многими другими способами.
Мне очень нравится PHP и ежедневно работаю с ним, но иногда это просто немного причуда. С другой стороны, если вы удалите __construct (), вам следует рассмотреть две вещи.
Я имею в виду следующее:
class BaseClass { public function __construct() { if(method_exists($this, 'init') { $this->init(); } } }
До PHP 5 конструктор имел то же имя, что и класс, например JAVA. В PHP 5 класс может иметь метод конструктора с тем же именем, что и класс (если не в пространстве имен) или с именем __construct. Может быть, это как-то связано с этим.
Линия
parent::__construct();
является вызовом EXPLICIT конструктору родительского класса. «PHP» дает вам ошибку, потому что ее не существует.
Можете ли вы на самом деле явно назвать несуществующий конструктор родителя в Java и не получить ошибку?
Помните, что конструктор класса, расширяющий родительский класс, переопределит конструктор родительского класса при построении расширяющегося класса. Вызов родительского конструктора подразумевает, что вы ожидаете, что он что-то сделает. Если конструктор не существует, ваш вызов ему не принадлежит коду, если интерпретатор дает вам ошибку или нет.