2009-12-14 108 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'文件以' <?php'? (只是爲了確保) – 2009-12-14 17:58:39

+0

只有變量來作爲NULL?那功能呢? – GmonC 2009-12-14 18:01:32

+0

當使用PHP 5.2.11進行測試時,該示例生成'string'hello world'(length = 11)'。如果在Joomla模塊之外使用它,它是否適用於您? – outis 2009-12-14 18:51:12

回答

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 2009-12-14 18:08:01

+0

你說得對,如果$ _SERVER ['DOCUMENT_ROOT']有問題,它甚至不應該回顯「NULL」,因爲他使用的是require_once而不是include語句。我的錯。但JPATH_BASE仍然是一個很好的建議。 – GmonC 2009-12-14 18:20:56

+0

文件包含正常,文件中的功能正常工作。 asgerhallas是對的,如果文件不在那裏,它會給出一個錯誤。不過感謝關於'JPATH_BASE'的提示。 – DisgruntledGoat 2009-12-14 18:52:56

0

我發現了一個似乎可行的解決方案:在最初設置變量時以及在我需要使用它之前,都使用global關鍵字。

(然而,這是相當麻煩的,我真不知道爲什麼會發生,因此,如果任何人有一個更好的解決方案,隨意張貼。)

+0

我想我對此行爲有一個解釋。這不是很小,所以我編輯了我自己的答案來解釋。你怎麼看? – GmonC 2009-12-14 20:05:46