Конструкторы
Теперь, после знакомства с механизмом наследования в PHP, мы можем прокомментировать различие между конструкторами PHP4 и PHP3 и более подробно рассказать о конструкторах вообще. Напомним, что в PHP3 конструктор – это функция, имя которой совпадает с именем класса. А в PHP4 – функция, имя которой совпадает с именем класса, в котором она определена.
<?php class Programmer extends Person{ // определяем класс // Programmer, расширяющий Person var $langs = array ("Lisp"); function Programmer(){ // этот конструктор будет // работать и в PHP3, и в PHP4 $this->make_person("Иван","Петров"); } } ?>
Пример 6.4. Использование конструктора (html, txt)
Здесь функция Programmer() является конструктором, т.е. выполняется сразу после создания любого представителя класса Programmer, задавая ему имя «Иван» и фамилию «Петров». Конструкторы, как и любые другие функции, могут иметь аргументы. В этом случае, создавая представителя класса, нужно указать значения этих параметров. Аргументы конструктора могут иметь и значения по умолчанию. Если все аргументы имеют значения по умолчанию, тогда можно создавать экземпляр класса без параметров.
<?php 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, т.е. свойства объекта и их значения */ ?>
Пример 6.5. Использование конструктора (html, txt)
Приведенные примеры будут работать и в PHP3, и в PHP4, конечно если дописать в них определение базового класса Person. Допустим, ситуация немного другая: конструктор имеется только у базового класса Person:
<?php 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 (здесь конструктор – функция, имя которой совпадает с именем класса, в котором она определена).
Еще одна ситуация – в базовом классе есть функция, имя которой совпадает с именем расширяющего класса, а в расширяющем классе нет конструктора.
<?php 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 не будет иметь своего конструктора, поэтому вызовется конструктор базового класса.
Ни в PHP 3, ни в PHP 4 конструктор базового класса не вызывается автоматически из конструктора порожденного класса.