Подтвердить что ты не робот

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

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

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

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

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

Ответ 1

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


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

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

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

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


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

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

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

Ответ 2

Вы должны use ключевое слово use.

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

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

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

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

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

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

Ответ 3

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

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

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

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