Наследование в PHP
http://belarusweb.net
Основы создания сайтов

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

Наследование в PHP, ключевое слово extends

Наследование представляет собой еще один хорошо зарекомендовавший себя принцип объектно-ориентированного программирования, который широко используется в объектной модели 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::

Для доступа изнутри метода класса-потомка к собственным или родительским свойствам и методам, а также константам используются соответствующие конструкции 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, то использование его перед объявлениями методов класса делает их недоступными для переопределения в классах-потомках. Если же ключевое слово 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 не применимо.

Быстрый переход к другим страницам