У мене несподівана проблема з обсягом. 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
, як якщо б ви видалили оператор і вставили вміст файлу на його місце.
Він не робить нічого іншого, що стосується сфери застосування.