Я задавался вопросом если его возможное для вызова родителей __ конструкция () перед ребенком __ конструкция () с наследованием в PHP.
Пример:
class Tag {
__construct() {
// Called first.
}
}
class Form extends Tag {
__construct() {
// Called second.
}
}
new Form();
Идеально, я смог бы сделать что-то промежуточное их. Если бы это не возможно, существует ли альтернатива, которая позволила бы мне делать это?
Причина, которую я хочу сделать, это должно смочь загрузить набор настроек по умолчанию, характерных для Тега, который может использовать Форма, когда __ конструкцию () называют.
Править: Извините забыл добавлять это.. Я не назвал бы родительский класс от дочернего класса. Это просто, потому что это выставляет некоторые частные данные (для родителя) ребенку при передаче его как аргумента
Это - то, что я хочу сделать:
$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;
}
}
Иметь смысл?
Спасибо! Matt Mueller
Просто вызовите parent::__construct в дочернем.
class Form extends Tag
{
function __construct()
{
parent::__construct();
// Called second.
}
}
да, просто вызовите parent :: __ construct ()
в своей конструкции
Да, но только внутренне (т.е. путем написания расширения PHP), поэтому на вашем месте я бы остановился на вызове parent::__construct()
. См. этот раздел на PHP wiki.
Извините, PHP - это не Java. Я думаю, что отсутствие требования (неявного или явного) вызова суперконструктора было очень плохим решением.
Судя по всему, вы захотите пересмотреть свой дизайн, чтобы не передавать параметры в конструкторе. Если вы не думаете, что это можно сделать, задайте этот вопрос, и вы можете быть удивлены некоторыми предложениями.
Дочерний класс имеет возможность переопределять конструктор родителя, не вызывая его вообще. Я бы рекомендовал иметь финальный метод в родительском классе. Таким образом, все знают, что вы не хотите, чтобы этот метод переопределялся, и любой наследуемый класс (по праву) имеет доступ делать в конструкторе все, что захочет.
class Father {
private $_privateData;
final function setPrivateData($privateData) {
$this->_privateData = $privateData;
}
}
Другим, не рекомендуемым, более "изобретающим колесо" решением было бы определение функции в родительском классе, скажем, _construct(), которая вызывается в собственной конструкции. Это не совсем понятно, не использует возможности языка/конструкций, и очень специфично для отдельного приложения.
И последнее, о чем следует помнить: вы не можете скрыть информацию от дочернего класса. С Reflection, serialize, var_dump, var_export и всеми другими удобными API в языке php, если есть код, который не должен ничего делать с данными, то вы не можете сделать ничего, кроме как не хранить их. Существуют библиотеки и тому подобное, которые помогают создавать песочницы, но трудно отгородить объект от самого себя.
Edit: Почему-то я пропустил ответ Artefacto, и я полагаю, что он прав (я никогда не пытался написать расширение для этого). Тем не менее, реализация этого нарушает ожидания разработчиков и усложняет реальный код, чтобы объяснить, что происходит.