Есть ли функциональная переменная в PHP, как в JavaScript?

#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».