Чтение онлайн

ЖАНРЫ

Курс "Язык программирования PHP"

Савельева Нина Владимировна

Шрифт:

// метод отображает информацию о личности

echo ("<h2>" . $this->first_name . " " .

$this->last_name . "</h2>");

}

}

class Programmer extends Person{

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

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

var $langs = array ("Lisp");

// константным массивом

// задать переменную в var можно

function set_lang($new_lang){

//
метод добавляет еще

// один язык к списку известных

$this->langs[] = $new_lang;

}

}

?>

Класс Programmer имеет те же переменные и функции, что и класс Person, плюс переменную $langs, в которой содержится список изученных программистом языков, и функцию set_lang для добавления еще одного языка к списку изученных. Создать представителя класса программистов можно обычным способом с помощью конструкции new. После этого можно устанавливать и получать список языков, которые знает программист, и в то же время можно использовать функции, заданные для класса Person, т.е. устанавливать и получать имя и фамилию программиста и отображать сведения о нем в браузере:

<?php

$progr = new Programmer;

$progr -> set_lang("PHP");

// методы, определенные для

// класса Programmer

print_r ($progr->langs);

// методы, определенные для класса Person

$progr->make_person("Bill","Gates");

$progr->show_person;

?>

Отношения, в которых состоят созданные нами классы Person и Programmer, называют также отношениями родитель–потомок. Класс Person – родитель, а его потомки, такие как класс Programmer, создаются, основываясь на нем, с помощью расширений. Любой класс может стать родительским и соответственно породить потомков.

Порядок определения классов имеет значение. Нельзя сначала определить класс Programmer, расширяющий класс Person, а уже потом сам класс Person. Класс должен быть определен перед тем, как он будет использоваться (расширяться).

Конструкторы

Теперь, после знакомства с механизмом наследования в PHP, мы можем прокомментировать различие между конструкторами PHP4 и PHP3 и более подробно рассказать о конструкторах вообще. Напомним, что в PHP3 конструктор – это функция, имя которой совпадает с именем класса. А в PHP4 – функция, имя которой совпадает с именем класса, в котором она определена.

<?php

class Programmer extends Person{

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

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

var $langs = array ("Lisp");

function Programmer{

// этот конструктор будет

// работать и в PHP3, и в PHP4

$this->make_person("Иван","Петров");

}

}

?>

Здесь функция 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, т.е. свойства объекта

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

?>

Приведенные примеры будут работать и в 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;

Поделиться с друзьями: