2009-12-14 2 views
0

В одном из PHP-файла, у меня есть этот код:PHP переменные из другого файла возвращается как NULL

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

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

function pr($s) { 
    echo '<pre>', htmlspecialchars(print_r($s,true)), '</pre>'; 
} 

$testVar = 'hello world'; 

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

+0

ли начать 'function.php' файл с'

+0

Только переменные приходят как NULL? Как насчет функций? – GmonC

+0

Образец создает строку 'hello world '(length = 11)' при тестировании с помощью PHP 5.2.11. Он работает для вас, если используется вне модуля Joomla? – outis

ответ

1

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

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

Во-первых, Variable scope.

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 было странное поведение.

Но потом я прочитал include и нашел что-то интересное:

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

Вы получаете фатальную ошибку, если файл не найден ... ошибки выводятся в ответ? – asgerhallas

+0

Вы правы, он даже не должен эхом «NULL», если есть проблема с $ _SERVER ['DOCUMENT_ROOT'], поскольку он использует require_once вместо оператора include. Моя вина. Но JPATH_BASE по-прежнему является хорошим советом. – GmonC

+0

Файл включен отлично, а функции в файле работают. asgerhallas прав, он бы дал ошибку, если файл не был там. Спасибо за отзыв о 'JPATH_BASE'. – DisgruntledGoat

0

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

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

+0

Думаю, у меня есть объяснение этому поведению. Это не так мало, поэтому я отредактировал свой собственный ответ, чтобы объяснить. Как вы думаете? – GmonC

Смежные вопросы