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



belarusweb.net

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

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

Понятие анонимной функции

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

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

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

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

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

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

Наследование переменных замыканиями,
служебное слово use

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