Как получить доступ к переменной из области родительской функции? - PullRequest
3 голосов
/ 06 декабря 2011

Я хочу, чтобы моя функция обращалась к внешней переменной, в частности из ее родительской функции. Однако использование ключевого слова global устанавливает слишком широкую область; Мне нужно ограничить это. Как мне заставить этот код выплевывать «Уровень 2» вместо «Уровень 1»? Должен ли я сделать урок?

<?php
$a = "Level 1";

function first() {
    $a = "Level 2";

    function second() {
        global $a;
        echo $a.'<br />';
    }

    second();
}

first();
//outputs 'Level 1'
?>

Ответы [ 2 ]

27 голосов
/ 06 декабря 2011

Просто для примера, если я понимаю, что вы пытаетесь сделать, вы можете использовать замыкание (PHP 5.3+), так как " Замыкания также могут наследовать переменные из родительская область действия"с ключевым словом use.

$a = "Level 1";

function first() {
    $a = "Level 2";

    $func = function () use ($a) {
        echo $a.'<br />';
    };

    $func();
}

first();
// prints 'Level 2<br />'

Замыкания чаще всего используются для функций обратного вызова. Однако это может быть не лучший сценарий для его использования. Как и предполагали другие, то, что вы можете что-то сделать, не означает, что это лучшая идея.

9 голосов
/ 06 декабря 2011

PHP не имеет понятия о вложенных функциях или областях, и это ужасная практика - вкладывать функции. В результате PHP просто встречает объявление функции и создает обычную функцию second. Если вы попытаетесь вызвать first снова, PHP снова столкнется с объявлением функции для second и сбоем, поскольку функция second уже объявлена. Поэтому не объявляйте функции внутри функций.

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

...