Можно ли получить доступ к внешней локальной переменной в PHP? - PullRequest
22 голосов
/ 09 марта 2010

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

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

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

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

Ответы [ 3 ]

38 голосов
/ 09 марта 2010

Возможно, вы могли бы использовать Closure, чтобы сделать это ...


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

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

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

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


Пара примечаний:

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

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

6 голосов
/ 09 марта 2010

Вы должны использовать ключевое слово 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 голосов
/ 13 декабря 2018

Вы можете прочитать значение по умолчанию:

function(){
    return preg_match(
                     "yourVar = \d+"
                   ,  str_file_get_contents(functionFile)
                  ,   arrayToPutFieldsValue
           );
 }

Если вы используете две функции одновременно - это как если бы кто-то использовал ложку, и вы хотите взять еду с этой ложки - вы потеряете пищу, или некоторые из вас умрут от голода. В любом случае - вам придется как-то жестко установить указатель. Невозможно получить какое-либо поле из другой функции или класса, не вызывая его к жизни. Функции / методы подобны экземпляру - их нужно вызывать.

Совместное использование общих полей путем доступа к глобальным полям с синхронизированными функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...