Ответ 1
Просто позвоните в родительский элемент parent:: __ construct.
class Form extends Tag
{
function __construct()
{
parent::__construct();
// Called second.
}
}
Мне было интересно, можно ли его вызвать __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;
}
}
Имеют смысл?
Спасибо! Мэтт Мюллер
Просто позвоните в родительский элемент 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, если есть код, который ничего не должен делать с данными, тогда на самом деле вам нечего делать, чтобы не хранить его. Существуют библиотеки и такие, которые помогают создавать песочницы, но его трудно изолировать от объекта.
Изменить: почему-то я пропустил ответ Артефакто, и я полагаю, что он прав (я никогда не пробовал писать расширение для этого). Тем не менее, реализация этого превзошла ожидания разработчиков, в то же время затруднившись увидеть код, чтобы объяснить, что происходит.