Создание и вызов анонимной функции в одном выражении

Закрытие или анонимная функция php используется для создания функции без указания ее имени.

Можно ли их вызывать без присвоения идентификатора, как в JavaScript? например

(function(){ echo('anonymous function'); })(); 

Каково правильное использование конструкции use при определении анонимной функции и каков статус анонимной функции в общедоступном методе с возможностью доступа к приватным свойствам?

 $anon_func = function($my_param) use($this->object_property){ //use of $this is erroneous here echo('anonymous function'); }; 

Solutions Collecting From Web of "Создание и вызов анонимной функции в одном выражении"

Можно ли их вызывать без присвоения идентификатора, как в JavaScript? например

Не в PHP 5.x; если вы не посчитаете это, когда ваш метод принимает обратный вызов в качестве аргумента. например:

 $square = array_map(function ($v) { return $v*$v; }, $array); 

Какое правильное использование конструкции использования при определении анонимной функции

Ключевое слово use указывает, какие переменные из текущей лексической области должны быть импортированы в закрытие. Вы даже можете передать их по ссылке и изменить передаваемую переменную, например:

 $total = 0; array_walk($array, function ($v) use (&$total) { $total += $v; }); // $total is now the sum of elements in $array 

каков статус анонимной функции в общедоступном методе с возможностью доступа к частной собственности?

Закрытия, определенные внутри класса, имеют полный доступ ко всем его свойствам и методам, включая частные, без необходимости импортировать $this через использование ключевого слова в PHP 5.4 :

 // this works fine in PHP 5.4 $anon_func = function($my_param) { $thing = $my_param + $this->object_property; echo('anonymous function'); }; 

Обратите внимание, что по какой-то странной причине поддержка $this в закрытии была удалена в PHP 5.3 . В этой версии вы можете обойти это ограничение, используя что-то вроде:

 // a workaround for PHP 5.3 $temp = $this; $anon_func = function($my_param) use ($temp) { $thing = $my_param + $temp->object_property; echo('anonymous function'); }; 

Но это дает вам доступ только к публичным участникам, попытка доступа к закрытым членам все равно даст вам ошибку.

Также обратите внимание, что попытка импортировать $this (через use ), независимо от версии PHP, приведет к фатальной ошибке. Cannot use $this as lexical variable .

 call_user_func(function() use(closure-vars){ ... }); 

PHP 7 добавил возможность сделать это.

Этот код:

 (function() { echo "This works as expected in PHP 7.\n"; })(); 

работает так, как можно было бы ожидать в PHP 7. (Он все еще не работает ни в одной версии PHP 5.x.)

Не похоже на это, поскольку они все еще должны быть объявлены с помощью function() {} нотации, а в моей установке 5.3.2, попробуйте, чтобы ваше примерное представление возвращало unexpected '(' ошибку unexpected '(' синтаксическая ошибка. Это тоже.

Возможно, это станет возможным после того, как они somefunction()[2] парсер, чтобы разрешить разыменование массива somefunction()[2] .