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



belarusweb.net

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

PHP+MySQL >>>

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

5.6. Анонимные функции

Анонимные функции, также известные в программировании как замыкания (от англ. closures), представляют собой функции, не имеющие определенных имен. Замыкания определяются и присваиваются переменным как обычные значения, поэтому в конце операции присвоения анонимной функции нужно не забывать ставить точку с запятой. Кроме того, анонимные функции, в отличие от именованных, создаются только в тот момент, когда до них доходит выполнение, соответственно, и воспользоваться ими можно только после их определения (см. пример 5.17).

<?php
//$my_func('test'); //Выведет ошибку, т.к. анонимные функции определяются только
						  //в момент их первого использования, в отличие от именованных
						  //функций, которые доступны из любой точки программы, за
					     //исключением случаев, когда они, например, определены условно

$my_func = function($str){ 	//Определяем анонимную функцию
   echo $str;
};    				  //Обязательно ставим точку с запятой

$my_func('test');   //Выведет строку 'test'
?>

Пример 5.17. Создание анонимных функций

Важной особенностью замыканий является то, что они могут наследовать переменные из родительской области видимости. Делается это при помощи служебного слова use (см. пример 5.18).

<?php
$str='test №1'; 	 //Создаем переменную в родительской области видимости

$my_func_1 = function() use ($str){  //Наследуем внешнюю переменную
   echo $str.'<br>';  
};    
$my_func_1(); 		 //Выведет также строку 'test №1'

$str='test №2'; 	 //Изменяем переменную в родительской области видимости
$my_func_1();  	 //Выведет унаследованное значение переменной $str, т.е. 
						 //строку 'test №1', т.к. значение унаследованной переменной 
						 //задается там, где функция определена, а не там, где вызвана!!!


						 
$my_func_2 = function() use (&$str){ 		 //Наследуем внешнюю переменную по ссылке
   echo $str.'<br>';  
};    
$my_func_2($str);  //Выведет строку 'test №2'
			 
$str='test №3'; 	 //Изменяем переменную в родительской области видимости						 
$my_func_2();  	 //Выведет строку 'test №3', т.к. переменная наследовалась по ссылке						 


					 
$my_func_3 = function($str_1) use ($str){  //Аргументы передаются обычным способом
   echo $str_1.$str.'<br>';  
}; 
   
$str_1='Это '; 	 //Создаем переменную в родительской области видимости
$my_func_3($str_1);//Выведет строку 'Это test №3'						 
?>

Пример 5.18. Наследование переменных замыканиями из родительской области видимости

Как видно из примера, значение унаследованной переменной задается там, где функция определяется, а не там, где вызывается. Кроме того, если внешняя переменная была унаследована не по ссылке, то при изменении ее значения в родительской области видимости, унаследованная копия остается неизмененной.

Следует отметить, что наследование переменных из родительской области видимости не то же самое, что использование глобальных переменных, поскольку глобальные переменные существуют в глобальной области видимости, которая не меняется вне зависимости от того, какая функция выполняется в данный момент. В тоже время родительская область видимости не обязательно совпадает с глобальной областью и вполне может оказаться локальной областью функции, в которой было объявлено данное замыкание (см. пример 5.19).

<?php
function sale_func($price){ 		//Внешняя функция
  	
	$start_price = function() use ($price){  //Наследуем локальную переменную
		return $price;  //При использовании вернет начальное значение $price
	}; 
	
	$price*=0.2; 		 //Вычисляем 20% от начальной цены
	$price=$start_price()-$price; //Получаем цену со скидкой
	echo 'Цена со скидкой в 20% составит '.$price.' у.е.';
}    

sale_func(50);  		 //Выведет строку 'Цена со скидкой в 20% составит 40 у.е.'

/* В примере замыкание использовалось в локальной области видимости, которая 
является для нее родительской областью видимости. При использовании же 
ключевого слова global, ссылка всегда ведет к переменной в глобальной
области видимости */
?>

Пример 5.19. Использование замыканий в локальной области видимости

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

  1. Что такое замыкание? Как оно создается?
  2. Каким образом замыкания наследуют переменные из родительской области видимости?
  3. Как влияет изменение значения переменой в родительской области видимости на значение
    унаследованной замыканием ее копии?

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

function [ˈfʌŋ(k)ʃ(ə)n] – функция.
return [rɪˈtəːn] – возвращать.
argument [ˈɑːɡjʊm(ə)nt] – аргумент.
closure [ˈkləʊʒə] – замыкание.
Комментарии (0)
Петр Романовский
1. Приветствуются комментарии, которые содержат дополнения к материалу текущей страницы, а также ваши ответы на вопросы других пользователей.
2. Если вам что-то непонятно - спрашивайте, не забывая написать, что именно и с какого места.
Показаны все комментарии
Чтобы оставить свой комментарий, авторизуйтесь, пожалуйста!    
     
belarusweb.net © Петр Романовский, Минск, 2016-2017.
Связаться с автором
Наверх