Подтвердить что ты не робот

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

Закрытие или анонимная функция 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');
};
4b9b3361

Ответ 1

Можно ли их вызвать без присваивание идентификатору, как мы это делаем в 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 через ключевое слово use в 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.

Ответ 2

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

Ответ 3

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

Этот код:

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

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

Ответ 4

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

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