Вызов родительского конструктора перед дочерним конструктором в PHP - PullRequest
29 голосов
/ 20 июня 2010

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

Пример:

class Tag {
     __construct() {
         // Called first.
     }
}

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

new Form();

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

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

РЕДАКТИРОВАТЬ: Извините, я забыл добавить это .. Я бы предпочел не вызывать родительский класс из дочернего класса.Это просто потому, что он предоставляет некоторые личные данные (для родителя) ребенку, когда вы передаете их в качестве аргумента

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

$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;
     }
} 

Имеет смысл?

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

Ответы [ 4 ]

46 голосов
/ 20 июня 2010

Просто вызовите parent :: __ construct в потомке.

class Form extends Tag
{
    function __construct()
    {
        parent::__construct();
        // Called second.
    }
}
3 голосов
/ 20 июня 2010

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

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

3 голосов
/ 20 июня 2010

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

1 голос
/ 20 июня 2010

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...