Как работать с анонимной функцией в PHP

#php

#php

Вопрос:

После чтения документации по анонимным функциям в PHP я сталкиваюсь с чем-то особенным в синтаксисе.

Этот оператор выполняет анонимную функцию в одной строке, но я не понимаю, почему:

 echo (function () {
     return 'hi';
})();
  

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

Комментарии:

1. Так что анонимная функция может состоять из нескольких строк?

2. @Phoenix Что это значит? Я вас не понимаю

3. Анонимная функция похожа на литерал для функции. Там, где литерал int создает значение int, анонимная функция создает объект функции, не присваивая ему имя

Ответ №1:

Это способ определения и немедленного вызова функции. Это поддерживается только PHP7 .

Альтернативой для PHP5.3 было бы

 call_user_func(function() {
    echo "Hi";
});
  

Итак, если вы хотите определить функцию «на лету», так сказать, и использовать ее немедленно — это правильный путь.

Комментарии:

1. Я, вероятно, не совсем ясно выразился: я говорил об этом синтаксисе, подобном javascript. Не стесняйтесь соответствующим образом редактировать мой ответ, для этого я плохо владею английским языком.

Ответ №2:

Вместо того, чтобы напрямую передавать значение в метод, вы можете создавать анонимные функции.

 $example = array(1,2,3);
(function () use ($example) { return $example[0] -1; })();
  

Разделители () используются как BODMA в математике, где (4 * 2) 2 будет равно 10. Вы сообщаете компилятору, что хотите установить закрытие перед его выполнением.

Длинная версия будет

 $closure = function () { ....
$closure();
  

Это работает с экземплярами классов и другими вариантами, такими как:

 (new Object)->method();
  

(сделайте это сначала) сделайте это после того, как получите результат того, что было сделано первым

Комментарии:

1. Вместо добавления нового ответа обратите внимание, что согласно php.net/manual/en/class.closure.php анонимная функция выдает объект закрытия, что делает его похожим на (new Object)() .

2. когда наступит 12:56, я не могу назвать вещи такими блестящими, но я приму ваш подход к будущим ответам @JonStirling

3. Интересный ответ!!! Для дополнительного, что вы можете сказать об этом коде: echo "start".true ? "if" : "else"."end"; ///output "if" когда я смогу написать этот код следующее: echo "start".(true ? "if" : "else")."end"; /// output "startifend" нужно объяснение

4. Вы выводите start в виде строки, затем вы запускаете троичное выражение вокруг истинного логического значения, которое всегда будет возвращать значение после ? а затем, наконец, присоединить к ней конечную строку. Первая строка завершается ошибкой на полпути, потому что вы пропустили разделители () вокруг выражения true @MaximPro

5. @KyleThomas Тогда почему я не получаю уведомление, предупреждение или фатальную ошибку?