/ / Неможливо отримати доступ до глобальної змінної у включеному файлі - php, include, scope, global-variables

Неможливо отримати доступ до глобальної змінної у включеному файлі - php, include, scope, global-variables

У мене несподівана проблема з обсягом. include документація (також стосується require_once) говорить, що необхідний файл повинен мати доступ до всієї змінної в рядку, який йому потрібно.

З якихось причин я не можу отримати доступ до класу з екземпляром глобальної області всередині функції, яка була потрібна в.

Хтось знав би чому? Мені, очевидно, чогось не вистачає.

Я змусив це працювати через посилання на $GLOBALS[], але я все одно хочу знати, чому це не працює.

UPDATE:
Помилка, яку я отримую:

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

Відповіді:

3 для відповіді № 1

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

Перемінна сфера

в межах визначених користувачем функцій локальний введено область функцій. Будь-який Змінна, яка використовується всередині функції - це за замовчуванням обмежується локальною функцією сфера застосування

Про включені файли, в посібнику зазначено:

Коли файл включений, кодуйте його містить успадковує змінну область дії рядка, на якому включено відбувається.

Отже, якщо ви включите щось у функцію, обсяг включеного файлу буде таким, як функція.

UPDATE: Переглядаючи приклад коду, відредагований у питанні, global $newClass; оскільки перший рядок функції повинен змусити її працювати.

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

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

Майте на увазі, що використання global може швидко ускладнити ваш кодпідтримувати. Не покладайтесь на глобальну область, ви можете передати об'єкт функції як параметр або використовувати клас Singleton / Registry (деякі, як правило, сперечаються проти останнього, але залежно від випадку це може бути чистішим рішенням).


2 для відповіді № 2

Включений код не має області, що відрізняється від коду, що його оточує. Наприклад:

function a() {
echo $b;
}

Це не вдасться, навіть якщо echo $b є у включеному файлі. Якщо замінити вищезазначене на:

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

... і file.php містить:

echo $b;

... тоді це те саме, що якби ви написали:

function a() {
echo $b;
}

Подумайте про це так: щоразу, коли ви використовуєте include / require, вміст включеного файлу буде замінено include / require , як якщо б ви видалили оператор і вставили вміст файлу на його місце.

Він не робить нічого іншого, що стосується сфери застосування.