Закрытие или анонимная функция 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'); };
Можно ли их вызывать без присвоения идентификатора, как в 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]
.