#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 Тогда почему я не получаю уведомление, предупреждение или фатальную ошибку?