PHP :: Наследование
Наследование в PHP, ключевое слово extends
Наследование представляет собой еще один хорошо зарекомендовавший себя принцип объектно-ориентированного программирования, который широко используется в объектной модели PHP.
Наследование – это механизм объектно-ориентированного программирования, который используется для описания новых классов на основе уже существующего.
Исходный класс, на основе которого происходит наследование свойств и методов, называют родительским классом, а классы, получающиеся в результате наследования – классами-потомками.
При объявлении класса-потомка после его имени используется ключевое слово extends, а также указывается имя родительского класса, от которого выполняется наследование (см. пример №1).
<?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).
<?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).
<?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 не применимо.