Невозможно получить доступ к глобальной переменной во включенном файле - PullRequest
3 голосов
/ 25 мая 2011

У меня неожиданная проблема с областью действия.Документация include (также относится к require_once) говорит, что требуемый файл должен иметь доступ ко всем переменным в той строке, в которой он был необходим.

По какой-то причине я не могу получить доступ к классу, созданному с глобальной областью действия внутри функции, которая требовалась в.

Кто-нибудь знает почему?Я, очевидно, что-то упускаю.

Я получил это через ссылку на $GLOBALS[], но я все еще хочу знать, почему это не работает.

ОБНОВЛЕНИЕ:
Я получаю ошибку:

Fatal error: Call to a member function isAdmin() on a non-object in <path>.php on <line>

Код:

$newClass = new myClass();

require_once("path to my file");

----- inside required file -----
function someFunction() {
     $newClass->someMethod(); // gives fatal error. (see above).
}

Ответы [ 2 ]

3 голосов
/ 25 мая 2011

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

Область переменных

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

О включенных файлах, в ручном состоянии :

Когда файлвключен, код, который он содержит, наследует переменную область видимости строки, в которой происходит включение.

Таким образом, если вы включаете что-то в функцию, область действия включаемого файла будет той же, что и у функции.

ОБНОВЛЕНИЕ: Глядя на ваш пример кода, отредактированный в вопросе, global $newClass; как первая строка функции должна заставить его работать.

$newClass = new myClass();
require_once("path to my file");

----- inside required file -----
function someFunction() {
     global $newClass;
     $newClass->someMethod(); 
}

Будьте внимательны, хотячто использование global может быстро усложнить поддержку вашего кода.Не полагайтесь на глобальную область, вы можете передать объект в функцию в качестве параметра или использовать класс Singleton / Registry (некоторые склонны спорить с последним, но в зависимости от случая это может быть более чистое решение).

2 голосов
/ 25 мая 2011

Включенный код не имеет области видимости, отличной от кода, его окружающего.Например:

function a() {
    echo $b;
}

Это не удастся, даже если echo $b находится во включенном файле.Если вы замените вышеприведенное на:

function a() {
    include 'file.php';
}

... и file.php содержит:

echo $b;

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

function a() {
    echo $b;
}

Думайте об этом так: всякий раз, когда вы используете include / require, содержимое включенного файла будет заменять оператор include / require, как если бы вы удалили оператори вставил содержимое файла на свое место.

Он не делает ничего другого, что касается области видимости.

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