PHP :: Наследование
Наследование в PHP, ключевое слово extends
Наследование представляет собой еще один хорошо зарекомендовавший себя принцип объектно-ориентированного программирования, который широко используется в объектной модели PHP.
Наследование – это механизм объектно-ориентированного программирования, который используется для описания новых классов на основе уже существующего.
Исходный класс, на основе которого происходит наследование свойств и методов, называют родительским классом, а классы, получающиеся в результате наследования – классами-потомками.
При объявлении класса-потомка после его имени используется ключевое слово extends, а также указывается имя родительского класса, от которого выполняется наследование (см. пример №1).
htmlCodes
<?php
//Объявили родительский класс
class first_name{
//Объявили, но неинициализировали свойство класса
public $my_first_name;
//Метод устанавливает имя
function set_first_name($text){
$this->my_first_name=$text;
}
}
//Создаем новый объект
$person=new first_name();
//Установили значение имени
$person->set_first_name('Иван');
//Вызовет ошибку, т.к. метод не существует!!!
//$person->set_last_name('Кожемяко');
/* Расширим наш класс, добавив новое свойство и метод для установки фамилии */
//Создаем класс-потомок
class full_name extends first_name{
//Добавили новое свойство
public $my_last_name;
//Добавили новый метод, который
function set_last_name($text){
//устанавливает фамилию
$this->my_last_name=$text;
}
}
//Создаем новый объект класса-потомка
$person_2=new full_name();
//Установили значение имени
$person_2->set_first_name('Иван');
//Установили значение фамилии
$person_2->set_last_name('Кожемяко');
//Выведет 'Иван Кожемяко'
echo $person_2->my_first_name.' '.$person_2->my_last_name;
/* Не забываем набирать код в редакторе. Для временного изолирования ненужного
кода, например, в строке 11, можно применять его комментирование */
?>
Пример №1. Создание классов-потомков
Классы-потомки наследуют все доступные свойства и методы своего родительского класса, а также константы. Кроме того, они могут переопределять их (включая константы, но за исключением случаев, когда метод родительского класса объявлен как final), а также добавлять собственные константы, свойства и методы.
Когда в классе-потомке переопределяются методы родительского класса, число и типы их аргументов должны оставаться прежними, иначе будет вызвана ошибка. Это не относится к методам-конструкторам (о них чуть позже), которые могут быть переопределены с другими параметрами.
Наследование нескольких классов в PHP недопустимо, поэтому у каждого класса-потомка может быть не более одного родительского класса, который должен объявляться до момента объявления любого из своих классов-потомков.
Конструкции self:: и parent::
Для доступа изнутри метода класса-потомка к собственным или родительским свойствам и методам, а также константам используются соответствующие конструкции self:: и parent:: (см. пример №2).
htmlCodes
<?php
//Объявили родительский класс
class parent_class{
//Объявили свойство класса
public $my_var='value ';
//Объявили константу класса
const parent_const='parent_constant ';
//Определяем метод
function my_func(){
//Выводим значение свойства
echo $this->my_var;
}
}
//Создаем класс-потомок
class descendant_class extends parent_class{
//Объявили константу класса-потомка
const self_const='self_constant ';
//Переопределяем родительский метод
function my_func(){
//Вызываем родительский метод, и дополняем его выводом
//константы (тут можно и $this::my_const;)
parent::my_func();
echo parent::parent_const.'<br>';
}
//Определяем новый метод класса-потомка
function self_func(){
//Вызываем метод текущего класса-потомка,
//хотя можно и привычным способом $this->my_func();
self::my_func();
//Выводим константу класса-потомка
//Здесь можно использовать и $this::self_const;
echo self::self_const.'<br>';
}
}
//Создаем новый объект
$descendant_obj=new descendant_class();
//Вызываем метод объекта класса-потомка
$descendant_obj->my_func();
//Вызываем метод объекта класса-потомка
$descendant_obj->self_func();
//Выводим константу класса-потомка
echo $descendant_obj::self_const.'<br>';
?>
Пример №2. Использование конструкций parent:: и self::
Ключевое слово final
Что касается ключевого слова final, то использование его перед объявлениями методов класса делает их недоступными для переопределения в классах-потомках. Если же ключевое слово final присутствует во время определения самого класса, то весь класс становится недоступным для наследования (см. пример №3).
htmlCodes
<?php
//Объявили родительский класс
class parent_class{
//Объявили свойство класса
public $my_var='value ';
//Определяем и финализируем метод
final function my_func(){
//Выводим значение свойства
echo $this->my_var;
}
}
//Создаем класс-потомок
class descendant_class extends parent_class{
//Переопределение вызовет ошибку!!!
function my_func(){
parent::my_func();
echo 'Нельзя переопределять финализированный метод';
}
}
?>
Пример №3. Использование ключевого слова final
Следует помнить, что финальными могут быть объявлены только методы и классы, к свойствам ключевое слово final не применимо.