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



belarusweb.net

Основы создания сайтов...

PHP+MySQL >>>

                          Учебник Задачник Справочник

6.8. Перегрузка в PHP

Под перегрузкой в программировании подразумевается возможность использования функций и методов, имеющих одинаковые имена. Однако в PHP понятие 'перегрузки' интерпретируется не так, как в других объектно-ориентированных языках. В PHP перегрузка означает возможность получения доступа при помощи специальных методов перегрузки, называемых еще магическими или волшебными методами, к недоступным обычными способами свойствам или методам. К таковым относятся свойства и методы, которые не были объявлены или не видны в текущей области видимости. При этом методы перегрузки, объявляемые в текущем классе, должны иметь область видимости public, не могут принимать аргументы по ссылке и вызываются только в случае обращения к указанным свойствам или методам. Перечислим методы перегрузки, имеющиеся в PHP:

Перечислим методы перегрузки, имеющиеся в PHP:

Отметим, что функция isset(), определяет установлена ли переменная, переданная ей в качестве аргумента, значением отличным от null, а функция empty() проверяет, считается ли переменная пустой (переменная считается пустой, если она не существует или её значение равно false). Что касается функции unset(), то она удаляет переменную, переданную ей в качестве аргумента. К данным функциям мы вернемся во второй части учебника. Теперь же рассмотрим пример 6.20, в котором показаны некоторые ситуации перегрузки свойств.

<?php
class my_class{
	public $var_1=5;		      //К доступным свойствам перегрузка не применяется
	
	private $private_var_1=10; //В отношении закрытых свойств методы перегрузки 
	private $private_var_2;	   //вызываются только при доступе вне класса, где 
									   //они недоступны обычными способами
	
	//Метод автоматически вызывается в случае обращения к недоступным свойствам
	public function __set($name, $value){ 
     	$this->$name=$value;    //Устанавливаем значение недоступного свойства
	}
	
	//Метод возвращает значение недоступного свойства, если оно установлено,  
	//или выводит сообщение, если такого свойства нет или оно не инициализировано
	public function __get($name){
		//Если переменная установлена значением отличным от null
		if(isset($this->$name)){
			return  $this->$name;//возвращаем значение недоступного свойства
		}else{
			echo "Свойство {$name} отсутствует или не определено в данном классе.";
		}
	}
	
	public function __isset($name){
      return isset($this->$name); //возвращаем результат вызова функции isset(),  
	}										 //вызванной для недоступного свойства
	
	public function __unset($name){
      unset($this->$name);  		 //удаляем недоступное свойство 
   }										 
}

$obj_1=new my_class(); 	 			  //Создаем объект класса my_class
			 		 
echo $obj_1->private_var_1.'<br>'; //Выведет 10, что возможно благодаря определенному 
										//в классе методу перегрузки __get()
$obj_1->private_var_1=20; 		//Изменяем значение закрытого свойства вне класса,
										//что возможно благодаря методу перегрузки __set()
echo $obj_1->private_var_1.'<br>';			//Выведет 20

echo isset($obj_1->private_var_1).'<br>'; //Выведет '1', т.е. true
unset($obj_1->private_var_1); //Удаляем закрытое свойство вне класса, что стало
										//возможным благодаря методу перегрузки __unset()
echo isset($obj_1->private_var_1).'<br>'; //Выведет '', т.е. false - свойство удалено

echo $obj_1->private_var_2.'<br>';	//Метод перегрузки __get() выведет сообщение	
$obj_1->private_var_2=5; 		//Устанавливаем значение закрытого св-ва вне класса
echo $obj_1->private_var_2.'<br>';	//Выведет 5					 
					
echo $obj_1->private_var_3.'<br>';	//Метод перегрузки __get() выведет сообщение												 
?> 

Пример 6.20. Перегрузка свойств

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

Что касается последних двух методов перегрузки, то первый из них предназначен для работы с недоступными методами в контексте объекта, а второй – для работы с недоступными статическими методами (см. пример 6.21).

<?php
class my_class{

	private function my_func(){ //Определяем частный метод
		echo 'Получен доступ к частной функции!'.'<br>';
	}
	//Определяем статический частный метод
	private static function static_func(){//
		echo 'Получен доступ к статической частной функции!'.'<br>';
	}
	//Определяем метод перегрузки  
	public function __call($name, $arguments){
		$this->my_func(); 
			 
	}
	//Определяем метод перегрузки в статическом контексте
   public static function __callStatic($name, $arguments){
      self::static_func();  
   }
}

$obj_1=new my_class(); 	 		//Создаем объект класса my_class
			 		 
echo $obj_1->my_func();   		//Выведет строку функции my_func() благодаря 
										//определению в классе метода перегрузки __call()
echo $obj_1::static_func();   //Выведет строку функции my_func() благодаря 
										//наличию метода перегрузки __callStatic()
?> 

Пример 6.21. Перегрузка методов

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

  1. Что называют перегрузкой в PHP? Перечислите методы перегрузки имеющиеся в PHP.

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

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.
Связаться с автором
Наверх