Язык программирования PHP | страница 56




>

>class Programmer extends Person{

> // определяем класс

> // Programmer, расширяющий Person

> var $langs = array ("Lisp");

> function Programmer($n = "Иван",

> $f = "Петров"){

> // это конструктор

> $this->make_person($n,$f);

> }

>}

>$default_progr = new Programmer();

> // создаст программиста Ивана Петрова

>$new_progr = new Programmer("Вася",

> "Сидоров");

> // создаст программиста Васю Сидорова

>print_r($new_progr);

>/* выведет информацию о переменной

>$new_progr, т.е. свойства объекта

>и их значения */

>?>


Приведенные примеры будут работать и в PHP3, и в PHP4, конечно если дописать в них определение базового класса Person. Допустим, ситуация немного другая: конструктор имеется только у базового класса Person:


>

>class Person { // определяем класс Личности

> var $first_name;

> var $last_name;

> function Person($t,$a){ // конструктор

> $this->first_name = $t;

> $this->last_name = $a;

> }

> /* ... */

>}

>class Programmer extends Person{

> // определяем класс

> // Programmer, расширяющий Person

> var $langs = array ("Lisp");

> function set_lang($new_lang){

> $this->langs[] = $new_lang;

> }

>}

>$new_progr = new Programmer("Вася",

> "Сидоров");

>?>


Что произойдет в этом случае при создании объекта класса Programmer, будет ли автоматически вызвана какая-либо функция? В PHP3 ничего не произойдет, поскольку в этом классе нет функции с именем Programmer() (здесь конструктор – это функция, имя которой совпадает с именем класса). В PHP4 будет вызван конструктор базового класса, если он существует, т.е. вызовется функция Person() из класса Person (здесь конструктор – функция, имя которой совпадает с именем класса, в котором она определена).


Еще одна ситуация – в базовом классе есть функция, имя которой совпадает с именем расширяющего класса, а в расширяющем классе нет конструктора.


>

>class Person { // определяем класс Личности

> var $first_name;

> var $last_name;

> function Person($t,$a){ // конструктор

> $this->first_name = $t;

> $this->last_name = $a;

> }

> function Programmer($new_lang){

> echo "Я – программист";

> }

>}

>class Programmer extends Person{

> // определяем класс

> // Programmer, расширяющий Person

> var $langs = array ("Lisp");

> function set_lang($new_lang){

> $this->langs[] = $new_lang;

> }

>}

>$new_progr = new Programmer("Вася",

> "Сидоров");

>?>


В этом случае PHP3 вызовет в качестве конструктора функцию Programmer() из описания класса Person. Поскольку конструктор – это функция, у которой то же имя, что и у класса. И неважно, определена ли эта функция в самом классе или она наследуется из базового класса. В PHP4 класс Programmer не будет иметь своего конструктора, поэтому вызовется конструктор базового класса.