html.okpython.net
HTML и CSS для начинающих

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

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

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

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

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

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

PHP Результат 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).

PHP Результат 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).

PHP 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 не применимо.

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