Переменная PHP из другого файла возвращается как NULL - PullRequest
0 голосов
/ 14 декабря 2009

В одном файле PHP у меня есть этот код:

require_once $_SERVER['DOCUMENT_ROOT'] . '/custom/functions.php';
global $testVar;
var_dump($testVar);

В файле functions.php у меня есть это в начале, а затем несколько других функций:

<code>function pr($s) {
    echo '<pre>', htmlspecialchars(print_r($s,true)), '
'; } $ testVar = 'привет мир';

При запуске первого файла переменная возвращается как NULL. Я добавил бит global, но в этом нет необходимости. Это часть модуля Joomla, но у меня никогда не было проблем с включением файлов, он должен просто работать как обычный PHP. Почему это может происходить?

Ответы [ 2 ]

1 голос
/ 14 декабря 2009

Сначала попробуйте использовать константы пути Joomla, такие как JPATH_BASE вместо $_SERVER['DOCUMENT_ROOT']. У Joomla есть много полезных констант, проверьте их документацию.

Я прочитал ваш ответ и, прочитав php документацию, попытался найти причину, по которой вам нужно дважды использовать ключевое слово global.

Сначала Область действия переменной .

The scope of a variable is the context within which it is defined. For the most 
part all PHP variables only have a single scope.

(...)

However, within user-defined functions a local function scope is introduced. 
Any variable used inside a function is by default limited to the local 
function scope. 

Переменная не входит в область действия функции, поэтому мы подумали, что NULL - странное поведение.

Но потом я прочитал включая и обнаружил кое-что интересное:

(...)
Any variables available at that line in the calling file will be available 
within the called file, from that point forward. However, all **functions** 
and **classes** defined in the included file have the global scope. 

Я не вижу упоминания о глобальных переменных в этом параграфе. Итак, он видит, что, будучи громоздким или нет, ваше решение является правильным решением, когда вы хотите использовать такие глобальные переменные.

В вашей ситуации, если делать это громоздко, я бы создал простой класс. Если в вашем файле есть только вспомогательные функции, создайте class Util{} с большим количеством методов и $ testVar в качестве атрибута.

0 голосов
/ 14 декабря 2009

Я нашел решение, которое, кажется, работает: использование ключевого слова global как при первоначальной установке переменной, так и непосредственно перед ее использованием.

(Однако это довольно громоздко, и я до сих пор не уверен, почему это происходит, поэтому, если у кого-то есть лучшее решение, не стесняйтесь писать.)

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