Подтвердить что ты не робот

Вызов родительского конструктора перед дочерним конструктором в 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;
     }
} 

Имеют смысл?

Спасибо! Мэтт Мюллер

4b9b3361

Ответ 1

Просто позвоните в родительский элемент parent:: __ construct.

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

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

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

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