есть __construct () эквивалент для расширенных классов - PullRequest
3 голосов
/ 21 декабря 2009

У меня есть родительский класс:

Abstract Class Base {
    function __construct($registry) {
        // stuff
    }
}

У меня есть как минимум 2 класса, которые расширяют этот класс

class Cms extends Base {
   // a few functions here
}

и этот

class Index extends Base {
   // a few functions here
}

Для класса CMS пользователь должен будет войти в систему. Сеанс уже инициирован, и я хочу проверить, что пользователь вошел в систему, используя сеанс var. Так что я хотел бы сделать:

class Cms extends Base {
   function __construct()
   {
        // check the user session is valid
   }
   // a few functions here
}

но, конечно, это перезапишет родительский класс конструкции и все, что он установил. Есть ли способ иметь метод типа __construct (), который можно определить в дочернем классе?

Ответы [ 3 ]

8 голосов
/ 21 декабря 2009

Из дочернего конструктора вы можете вызвать родительский:

class Cms extends Base {
   function __construct()
   {
       parent::__construct();
        // check the user session is valid
   }
   // a few functions here
}

См. Примеры на странице Конструкторы и деструкторы руководства и примечание (цитирование) :

Примечание: Родительские конструкторы не являются вызывается неявно, если дочерний класс определяет конструктор.
В порядке запустить родительский конструктор, вызов parent::__construct() в пределах требуется дочерний конструктор.

6 голосов
/ 21 декабря 2009

Вызов конструктора класса не всплывает автоматически в php. Вы должны добавить вызов к конструктору родителя вручную. (И я считаю это недостатком.)

class Cms extends Base {
   function __construct()
   {
       parent::__construct(); 
       // check the user session is valid
   }
   // a few functions here
}

PHP: Оператор разрешения области (::) говорит:

Когда расширяющий класс переопределяет определение метода для родителей, PHP не будет вызывать метод родителя. Это зависит от расширенного класса от того, вызывается ли родительский метод или нет. Это также относится к определениям конструкторов и деструкторов, перегрузок и магических методов.
0 голосов
/ 21 декабря 2009

Это решение также применяется ко всем магическим методам php при работе с расширениями классов, т.е. если вы переопределяете __set (), вы можете использовать тот же код (метод parent :: __), чтобы гарантировать, что вы получите все поведение, указанное в родительский класс.

VolkerK: Почему это было бы ошибкой? Предполагается, что если вы переопределяете поведение базовых классов для метода, вы хотите заменить это поведение, если только вы не заявите об обратном. Мне было бы очень неприятно, если бы я мог расширить метод, но всегда вызывал поведение по умолчанию в родительском классе, а также все, что я делал. Другие языки ОО реализуют это таким образом?

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