#php #function #variables
#php #функция #переменные
Вопрос:
В JavaScript вы можете иметь:
var blabla = function(arg){
...
};
Есть ли что-то подобное в PHP?
Я знаю о create_function()
, но это действительно сложно — поместить ваш код в строковый аргумент.
Комментарии:
1. Мне любопытно, какой вариант использования для этого. Я обнаружил, что анонимные функции в архитектуре OO (при правильном выполнении) редко требуются. Возможно , вы используете неправильное решение для вашей конкретной проблемы (возможно, я слишком углубляюсь в вопрос, поскольку на него был дан конкретный ответ, но мне все еще любопытно :))
2. В данном случае я не использую ООП, я все еще новичок в этой области 🙂 в принципе, у меня есть функция A, и мне нужно создать внутри нее небольшую функцию B, которая мне нужна только внутри A. Если я определяю функцию нормально, то она конфликтует с внешними функциями, которые имеют то же имя (и я думаю, что к ней тоже можно получить доступ извне, чего я не хочу). Вот почему мне было интересно, могу ли я использовать ее в качестве переменной…
Ответ №1:
Начиная с PHP 5.3, вы можете создавать анонимные функции, подобные этой:
$var = 1;
$func = function( $arg ) use ($var) {
return $arg $var;
};
use
Предложение требуется для доступа к переменным, определенным вне анонимной функции.
Если вы хотите изменить внешнюю переменную в анонимной функции, вы должны объявить ее как ссылку (добавив amp;
перед $
) в use
части:
$var = 1;
$func = function() use ( amp;$var ) {
$var = 42;
}
$func();
// $var == 42 now
В противном случае изменения, сделанные в анонимной функции, не будут распространяться наружу.
Комментарии:
1. Спасибо! Мне было интересно, возможно ли использовать внешние переменные, потому что я не мог этого сделать с помощью create_function : (Если вы измените
$var
, изменится ли это и снаружи?2. Да, это так;
use
позволяет изменять внешние переменные. Просто интересно, работает ли объявлениеglobal $var;
в анонимной функции?3. По умолчанию нельзя изменять внешние переменные, но вы можете использовать ссылку, чтобы разрешить это. Я обновил свой ответ.
4. @Sven — Явное «передавать по ссылке» устарело, поскольку не включено в 5.3 ( php.net/manual/en/language.references.pass.php ). Я бы предположил, что это относится и к этой ситуации?
5. @Demian: Пример, предоставленный Sven, не является примером «передачи по ссылке во время вызова». Использование ссылочного оператора в этой ситуации совершенно законно. «передача во время вызова по ссылке» — это когда вы добавляете оператор ссылки к аргументу, передаваемому в функцию, например
$b = func(amp;$a);
— это устарело.
Ответ №2:
Они называются анонимными функциями. В PHP >= 5.3 вы можете сделать:
$func = function($a, $b) {
return $a $b;
};
$result = $func(3, 4); // returns 7
У вас даже могут быть замыкания:
$c = 5;
$func = function($a, $b) use ($c) {
return ($a $b) * $c;
};
$result = $func(3, 4); // returns 35
Но имейте в виду: следующий фрагмент JavaScript может быть воспроизведен в PHP только с использованием ссылок:
var c = 5;
var f = function(a, b) {
return (a b) * c;
};
var r = f(3, 4); // returns 35
c = 6;
r = f(3, 4); // returns 42
В PHP это должно выглядеть как:
$c = 5;
$func = function($a, $b) use (amp;$c) {
return ($a $b) * $c;
};
$result = $func(3, 4); // returns 35
$c = 6;
$result = $func(3, 4); // returns 42
До версии 5.3 вы должны были использовать create_function()
для создания анонимных функций.
Ответ №3:
Да, она доступна в php 5.3.X
http://php.net/manual/en/functions.anonymous.php
<?php
$greet = function($name)
{
printf("Hello %srn", $name);
};
$greet('World');
$greet('PHP');
?>
Ответ №4:
Анонимные функции доступны начиная с PHP 5.3.0. ссылка
Ответ №5:
Синтаксис очень похож на синтаксис JavaScript; для вашего конкретного примера это было бы что-то вроде следующего:
$blabla = function($arg){
...
};
Единственное отличие заключается в замене «var» на «$» и добавлении «$» перед «arg».