Доступ к переменной, определенной в родительской функции

Есть ли способ получить доступ к $foo из inner()?

function outer()
{
    $foo = "...";

    function inner()
    {
        // print $foo
    }

    inner();
}

outer();

Ответ 1

PHP < 5.3 не поддерживает замыкания, поэтому вам нужно либо передать $foo в inner(), либо сделать глобальный глобальный foo как внутри external(), так и inner() (BAD).

В PHP 5.3 вы можете сделать

function outer()
{
  $foo = "...";
  $inner = function() use ($foo)
  {
    print $foo;
  };
  $inner();
}
outer();
outer();

Ответ 2

Или мне не хватает чего-то более сложного, что вы пытаетесь сделать?

function outer()
{
    $foo = "...";

    function inner($foo)
    {
        // print $foo
    }

    inner($foo);
}

outer();

edit Хорошо, я думаю, я вижу, что вы пытаетесь сделать. Вы можете сделать это с помощью классов с использованием глобальных, но не уверены в этом конкретном случае

Ответ 3

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

function outer()
{
    global $foo;
    $foo = "Let us see and understand..."; // (Thanks @Emanuil)

    function inner()
    {
        global $foo;
        print $foo;
    }

    inner();
}

outer();

Это выведет: -

Let us see and understand...

Вместо того, чтобы писать этот путь, вы могли бы написать следующий фрагмент кода: -

function outer()
{
    $foo = "Let us see improved way...";

    inner($foo);

    print "\n";
    print $foo;
}

function inner($arg_foo)
{
    $arg_foo .= " and proper way...";
    print $arg_foo;
}

outer();

Этот последний фрагмент кода выводит: -

Let us see improved way... and proper way...
Let us see improved way...

Но, наконец, вы всегда будете решать, какой процесс вы собираетесь использовать. Поэтому надеюсь, что это поможет.

Ответ 4

Я знаю, что это можно сделать с помощью классов, однако с автономными функциями я был уверен, что вы не сможете выполнить поиск без установки общедоступной/частной переменной.

Но единственный возможный способ, с которым я могу думать (не испытывая этого типа вещей), - передать foo поверх внутреннего, делая эхо или печать.:)

Ответ 5

Я не думаю, что это возможно.

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

http://www.php.net/manual/en/language.variables.scope.php#77693

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

http://www.php.net/manual/en/language.variables.scope.php#20407