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

Я задавался вопросом если его возможное для вызова родителей __ конструкция () перед ребенком __ конструкция () с наследованием в 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

29
задан Matt 20 June 2010 в 16:33
поделиться

4 ответа

Просто вызовите parent::__construct в дочернем.

class Form extends Tag
{
    function __construct()
    {
        parent::__construct();
        // Called second.
    }
}
46
ответ дан 28 November 2019 в 01:32
поделиться

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

3
ответ дан 28 November 2019 в 01:32
поделиться

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

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

3
ответ дан 28 November 2019 в 01:32
поделиться

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

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

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

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

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

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

1
ответ дан 28 November 2019 в 01:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: