2010-03-09 3 views
19

Возможно ли получить доступ к внешнему локальному varialbe в подфункции PHP?Возможно ли получить доступ к внешней локальной переменной в PHP?

В приведенном ниже коде я хочу получить доступ к переменной $l во внутренней функциональной панели. Объявление $l как global $l в баре не работает.

function foo() 
{ 
    $l = "xyz"; 

    function bar() 
    { 
     echo $l; 
    } 
    bar(); 
} 
foo(); 

ответ

33

Я не думаю, что это возможно с помощью PHP 5.2 ...

С PHP 5.3, хотя, вероятно, можно использовать Closure, чтобы сделать только что ...


Edit: потребовалось некоторое время, чтобы вспомнить синтаксис, но вот то, что это будет выглядеть так:

function foo() 
{ 
    $l = "xyz"; 
    $bar = function() use ($l) 
    { 
     var_dump($l); 
    }; 
    $bar(); 
} 
foo(); 

И, запустив скрипт, вы получите:

$ php temp.php 
string(3) "xyz" 


Пара ноты:

  • Вы должны положить ; после описания функции!
  • Вы можете use переменные по ссылке, с & прежде, чем это имя: use (& $l)

Для получения дополнительной информации, в качестве ссылки, вы можете взглянуть на этой странице в руководстве: Anonymous functions

+0

Почему вы вообще используете вложенные функции? –

+0

Кто знает ^^ Это был не вопрос ^^ ;; с PHP 5.3 и анонимными функциями, это может быть очень полезно для Closures ;;; До PHP 5.3 ... Я никогда не использовал вложенную функцию с PHP <5.3. –

+2

@PascalMARTIN Важно, что вложенные функции до PHP 5.3 _do not exist_. Несмотря на то, что они выглядят так, как будто они объявлены локально, они попадают в глобальную сферу. Я думаю, что то же самое верно сейчас, поэтому вы должны использовать анонимные функции для достижения какой-либо вложенности. – Izkata

4

В PHP 5.3 вы должны использовать ключевое слово use.

$bar = function() use(&$l) { 
}; 
$bar(); 

В PHP 5.2 и ранее это не сработает. Синтаксис, который у вас есть, - это не закрытие, а определение глобальной функции.

function foo() { function bar() { } } 

работает так же, как:

function foo() { include "file_with_function_bar.php"; } 

При выполнении функции foo дважды, PHP будет жаловаться, что вы пытались заново определить (глобальные) функции bar.

+0

Слишком много местоимений! Что будет умирать при втором исполнении? Внешняя переменная или переменная, так как она используется во внутренней функции? И что означает смерть (не злая, просто хочу знать). Ли умирает означает, что переменная не может быть использована или что она должна быть восстановлена ​​другими способами? Я предполагаю, что он умирает (в каком бы то ни было смысле), потому что его общее местоположение, на которое они указывают, не может быть переназначено после первого выполнения? Что делать, если переменная сделана статической, а затем отключена сразу? – Anthony

+0

die означает 'die (« Fatal Error »)'.В PHP <= 5.2 не существует закрытий и внутренних функций <= 5.2 - функция внутри функции не допускается, и факт, что она не является синтаксической ошибкой, случайна (это должна быть ошибка sytnax). PHP 5.3 совершенно другой. Он позволяет выполнять функции внутри функций, но с немного отличающимся синтаксисом. Как только вы получите правильный синтаксис, в PHP 5.3+ он будет работать так, как вы ожидали бы на других языках. – Kornel

Смежные вопросы