belarusweb.net
© Петр Романовский Минск, 2016-2017.



belarusweb.net

Основы создания сайтов...
PHP+MySQL >>>
                          Учебник Задачник Справочник

6.3. Наследование в PHP

Наследование представляет собой еще один хорошо зарекомендовавший себя принцип объектно-ориентированного программирования, который широко используется в объектной модели PHP.

Наследование – это механизм объектно-ориентированного программирования, который используется для описания новых классов на основе уже существующего.

Исходный класс, на основе которого происходит наследование свойств и методов, называют родительским классом, а классы, получающиеся в результате наследования – классами-потомками.

При объявлении класса-потомка после его имени используется ключевое слово extends, а также указывается имя родительского класса, от которого выполняется наследование (см. пример 6.5).

<?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, можно применять его комментирование  */
?>

Пример 6.5. Создание классов-потомков

Классы-потомки наследуют все доступные свойства и методы своего родительского класса, а также константы. Кроме того, они могут переопределять их (включая константы, но за исключением случаев, когда метод родительского класса объявлен как final), а также добавлять собственные константы, свойства и методы.

Когда в классе-потомке переопределяются методы родительского класса, число и типы их аргументов должны оставаться прежними, иначе будет вызвана ошибка. Это не относится к методам-конструкторам (о них чуть позже), которые могут быть переопределены с другими параметрами.

Наследование нескольких классов в PHP недопустимо, поэтому у каждого класса-потомка может быть не более одного родительского класса, который должен объявляться до момента объявления любого из своих классов-потомков.

Для доступа изнутри метода класса-потомка к собственным или родительским свойствам и методам, а также константам используются соответствующие конструкции self:: и parent:: (см. пример 6.6).

<?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(){ 				//Переопределяем родительский метод  
		parent::my_func();       	//Вызываем родительский метод, и дополняем его
		echo parent::parent_const.'<br>';//выводом константы (тут можно и $this::my_const;)
	}
	
	function self_func(){ 		 //Определяем новый метод класса-потомка 
		self::my_func();       	 //Вызываем метод текущего класса-потомка, 
										 //хотя можно и привычным способом $this->my_func();
		echo self::self_const.'<br>';//Выводим константу класса-потомка 
										 //Здесь можно использовать и $this::self_const;
	}
} 

$descendant_obj=new descendant_class(); //Создаем новый объект 
$descendant_obj->my_func();   			 //Вызываем метод объекта класса-потомка 
$descendant_obj->self_func();    		 //Вызываем метод объекта класса-потомка 
echo $descendant_obj::self_const.'<br>';//Выводим константу класса-потомка 
?>

Пример 6.6. Использование конструкций parent:: и self::

Что касается ключевого слова final, то использование его перед объявлениями методов класса делает их недоступными для переопределения в классах-потомках. Если же ключевое слово final присутствует во время определения самого класса, то весь класс становится недоступным для наследования (см. пример 6.7).

<?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 'Нельзя переопределять финализированный метод';	
	}
} 
?>

Пример 6.7. Использование ключевого слова final

Следует помнить, что финальными могут быть объявлены только методы и классы, к свойствам ключевое слово final не применимо.

Контрольные вопросы и задания

  1. Что понимается под процессом наследования? Как создаются классы классы-потомки?
  2. Для чего применяются конструкции self:: и parent::?
  3. Как убрать возможность дальнейшего переопределения методов или сделать класс недоступным для наследования?

Словарь новых английских слов

one-off [wʌnˈɒf] – одноразовый.
partial [ˈpɑːʃ(ə)l] – частичный.
class [klɑːs] – класс.
new [njuː] – новый.
empty [ˈempti] – пустой.
constant [ˈkɒnst(ə)nt] – константа.
person [ˈpəːs(ə)n] – личность, персона.
object [ˈɒbdʒɪkt] – объект.
method [ˈmɛθəd] – метод.
property [ˈprɒpəti] – свойство.
public [ˈpʌblɪk] – открытый, общественный.
protected [prəˈtektɪd] – защищенный.
private [ˈprʌɪvət] – закрытый, частный.
this [ðɪs] – это, этот.
static [ˈstatɪk] – статичный, неподвижный.
extend [ɪkˈstɛnd] – расширять.
self [self] – собственный.
parent [ˈpɛːr(ə)nt] – родитель, предок.
exit [ˈeksɪt] – выход, выйти.
nest [nest] – вставлять один предмет в другой.
final [ˈfʌɪn(ə)l] – заключительный, окончательный.
construct [kənˈstrʌkt] – создавать, конструировать.
destruct [dɪˈstrʌkt] – разрушать, уничтожать.
descendant [dɪˈsɛnd(ə)nt] – потомок.
abstract [ˈæbstrækt] – абстрактный, отвлеченный.
interface [ˈɪntəfeɪs] – интерфейс, область контакта.
implement [ˈɪmplɪment] – осуществлять, реализовывать.
trait [treɪt] – особенность, черта.
use [ˈjuːs] – употреблять, использовать.
instead [ɪnˈstɛd] – вместо, взамен.
as [æz] – как.
anonymous [əˈnɒnɪməs] – безымянный, анонимный.
clone [kləʊn] – клон, двойник.
set [set] – устанавливать.
unset [ʌnˈsɛt] – удалять.
get [ɡet] – получать.
call [kɔːl] – вызывать, звать.

Комментарии (0)
Петр Романовский
1. Приветствуются комментарии, которые содержат дополнения к материалу текущей страницы, а также ваши ответы на вопросы других пользователей.
2. Если вам что-то непонятно - спрашивайте, не забывая написать, что именно и с какого места.
Показаны все комментарии
Чтобы оставить свой комментарий, авторизуйтесь, пожалуйста!    
     
belarusweb.net © Петр Романовский, Минск, 2016-2017.
Связаться с автором
Наверх