Области функций в отношении включений в PHP - PullRequest
1 голос
/ 21 июня 2011

У меня возникли некоторые проблемы с пониманием, включая функции и области действия в PHP, и немного поиска в Google не дало успешных результатов. Но вот проблема:

Это не работает:

function include_a(){
    // Just imagine some complicated code
    if(isset($_SESSION['language'])){
        include 'left_side2.php';
    } else {
        include 'left_side.php';
    }
    // More complicated code to determine which file to include
}

function b() {
    include_a();
    print_r($lang); // Will say that $lang is undefined
}

Итак, по сути, существует массив с именами $lang в left_side.php и left_side2.php. Я хочу получить к нему доступ внутри b(), но приведенный выше код установки скажет, что $lang не определено. Однако, когда я копирую и вставляю точный код в include_a() в самом начале b(), он будет работать нормально. Но, как вы можете себе представить, я не хочу копировать и вставлять код в каждую функцию, которая мне нужна.

Как мне решить эту проблему и что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 21 июня 2011

Если массив $lang определен внутри функции include_a(), он распространяется только на эту функцию, даже если эта функция вызывается из b().Чтобы получить доступ к $lang внутри b(), необходимо вызвать его глобально.

Это происходит потому, что вы include 'left_side2.php'; внутри функции include_a().Если внутри включений определено несколько переменных, и вы хотите, чтобы они находились в глобальной области видимости, вам необходимо определить их как таковые.

Внутри left_side.php определите их как:

$GLOBALS['lang'] = whatever...;

Затем в функции, которая их вызывает, попробуйте это:

function b() {
    include_a();
    print_r($GLOBALS['lang']); // Now $lang should be known.
}
1 голос
/ 21 июня 2011

Считать «глобальными» считается неуместным, если в этом нет необходимости (не то, на что я согласен, но общепринятый). Лучше всего передавать по ссылке, добавляя амперсанд перед переданной переменной, чтобы вы могли редактировать значение.

Так что внутри left_side или left_side2 у вас будет:

b($lang);

и b будет:

function b(&$lang){...}

Для дальнейших определений в переменных областях проверьте это

...