Доступ к переменной, определенной в родительской функции - PullRequest
16 голосов
/ 08 февраля 2011

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

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

    function inner()
    {
        // print $foo
    }

    inner();
}

outer();

Ответы [ 5 ]

43 голосов
/ 08 февраля 2011

PHP <5.3 не поддерживает замыкания, поэтому вам придется либо передать $ foo в inner (), либо сделать глобальный $ foo как из external (), так и inner () (BAD).В PHP 5.3 вы можете сделать <pre><code>function outer() { $foo = "..."; $inner = function() use ($foo) { print $foo; }; $inner(); } outer(); outer();

1 голос
/ 08 февраля 2011

Или я упускаю что-то более сложное, что вы пытаетесь сделать?

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

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

    inner($foo);
}

outer();

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

0 голосов
/ 08 февраля 2011

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

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

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

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

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

0 голосов
/ 08 февраля 2011

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

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

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

0 голосов
/ 08 февраля 2011

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

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

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