Язык программирования PHP | страница 57
Ни в PHP 3, ни в PHP 4 конструктор базового класса не вызывается автоматически из конструктора порожденного класса.
Оператор ::
Иногда внутри описания класса возникает необходимость сослаться на функции или переменные из базового класса. Бывает, что нужно ссылаться на функции в классе, ни один представитель которого еще не создан. Как быть в таком случае? В PHP4 для этого существует специальный оператор «::»
Например, вот так можно вызвать в описании класса Programmer функцию show_name() из базового класса Person и функцию say_hello(), заданную в описании класса Programmer, когда ни один объект этого класса еще не был создан:
>
>class Person { // определяем класс Личности
> var $first_name;
> var $last_name;
> function Person($t,$a){ // конструктор
> $this->first_name = $t;
> $this->last_name = $a;
> }
>function show_name(){
> // метод отображает информацию о личности
> echo ("Меня зовут, " .
> $this->first_name . " " .
> $this->last_name . "!
");
> }
>}
>class Programmer extends Person{
> // определяем класс
> // Programmer, расширяющий Person
> function set_lang($new_lang){
> // метод добавляет еще
> // один язык к списку известных
> $this->langs[] = $new_lang;
> Person::show_name();
> // вызываем функцию из базового класса
> echo "И я знаю теперь еще и " .
> $new_lang;
> }
> function show_name(){
> echo ("Я программист, " .
> $this->first_name . " " .
> $this->last_name . "!
");
> }
> function say_hello(){
> echo "Привет!
";
> }
>}
>Programmer::say_hello();
> // вызываем функцию, когда ни
> // один объект ее класса еще не создан
>$new_progr = new Programmer("Вася","Сидоров");
>$new_progr->set_lang("PHP");
>?>
В результате работы этой программы получим следующее:
>Привет!
>Меня зовут Вася Сидоров!
>И я знаю теперь еще и PHP
С помощью команды Programmer::say_hello(); мы вызываем функцию say_hello класса Programmer как таковую, а не как метод, применяемый к объекту данного класса. В этот момент переменных класса нет. Поэтому функции, вызываемые до создания объекта, не могут пользоваться переменными класса и конструкцией this, но могут пользоваться локальными и глобальными переменными.
В определении класса Programmer мы переопределили функцию show_name(), поэтому вызвать функцию show_name() из базового класса Person можно только с помощью оператора «::» Вообще говоря, внутри определения класса мы можем вызывать любые методы и свойства, заданные в его базовом классе с помощью обычного $this, если только порожденный класс не переопределяет эти свойства и методы, как в нашем примере.