Вызов родительского конструктора перед дочерним конструктором в PHP

Мне было интересно, можно ли его вызвать __construct () перед дочерним __construct () с наследованием в PHP.

Пример:

class Tag { __construct() { // Called first. } } class Form extends Tag { __construct() { // Called second. } } new Form(); 

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

Причина, по которой я хочу сделать это, – загрузить кучу настроек по умолчанию, специфичных для тега, которые Form может использовать при вызове __construct ().

EDIT: Извините, забыл добавить это. Я бы предпочел не вызывать родительский класс из дочернего класса. Это просто потому, что он предоставляет некоторые частные данные (для родителя) для ребенка, когда вы передаете его в качестве аргумента

Это то, что я хочу сделать:

 $tag = new Tag($privateInfo, $publicInfo); $tag->extend(new Form()); // Ideal function, prob doesn't work with inheritance. 

Tag.php

 class Tag { private $privateInfo; public $publicInfo; __construct($private, $public) { $this->privateInfo = $private; $this->publicInfo = $public; } } 

form.php

 class Form extends Tag { __construct() { echo $this->publicInfo; } } 

Имеют смысл?

Благодаря! Мэтт Мюллер

Solutions Collecting From Web of "Вызов родительского конструктора перед дочерним конструктором в PHP"

Просто вызовите parent :: __ construct в дочернем элементе.

 class Form extends Tag { function __construct() { parent::__construct(); // Called second. } } 

да просто вызывайте parent::__construct() в вашей конструкции

Да, но только внутри (то есть, написав расширение PHP), поэтому, если бы я был вами, я бы согласился с вызовом parent::__construct() . См. Этот раздел в вики PHP.

Извините, PHP не является Java. Я думаю, что не требовать (неявно или эксплицитно) супер-конструктора, который будет называться, было очень плохим дизайнерским решением.

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

У дочернего класса есть возможность переопределить родительский конструктор, не вызывая его вообще. Я бы рекомендовал иметь окончательный метод в родительском классе. Таким образом, все знают, что вы не хотите, чтобы это было переоценено, и любой унаследованный класс (по праву) имеет доступ к тому, что он хочет в конструкторе.

 class Father { private $_privateData; final function setPrivateData($privateData) { $this->_privateData = $privateData; } } 

Другим, не рекомендованным, более «изобретать колесо», было бы определение функции в родительском классе, скажем, _construct (), которое вызывается в его собственной конструкции. Это не совсем понятно, не использует языковые функции / конструкции и очень специфично для одного приложения.

Последнее, что нужно иметь в виду: вы не можете скрыть информацию от дочернего класса. С Reflection, serialize, var_dump, var_export и всеми этими другими удобными API-интерфейсами на языке php, если есть код, который ничего не должен делать с данными, тогда вы действительно не можете сделать так, чтобы не хранить его. Существуют библиотеки и такие, которые помогают создавать песочницы, но его трудно изолировать от объекта.

Редактировать: Как-то я пропустил ответ Артефакто, и я полагаю, что он прав (я никогда не пробовал писать расширение для этого). Тем не менее, реализация этого превзошла ожидания разработчиков, в то же время затруднившись увидеть код, чтобы объяснить, что происходит.