2011-01-27 86 views
0

我有當我嘗試訪問我的PHP函數中的全局變量時,爲什麼我的代碼不工作?

require_once 'db_connect.php' 

在其內部是

$db_name = ... 

然後直接下面我有

function my_func() { 
global $db_name; 
} 

然而$db_name返回一個空值。我究竟做錯了什麼?

更新:如果我在require_once之後直接打印$ db_name,它可以正常工作。然而,所有這些都是wordpress中的側邊欄的一部分,因此我不確定函數範圍。

+0

`global $ variable;`是標題問題的答案。你必須改寫它,「我怎麼能找到,爲什麼我的代碼不起作用」 – 2011-01-27 10:01:03

回答

3

編輯:我的答案是針對問題的原始版本量身定製的。請注意,下面的答案是基於當時可用信息的答案。

當您使用require()include()時,包含的腳本在與包含文件的行相同的範圍內運行。

考慮以下幾點:

myscript.php

<?php 
function init_db() { 
    require_once("database.inc.php"); 
} 

echo $db_name; 

function test() { 
    global $db_name; 
    echo $db_name; 
} 

test(); 

database.inc.php

<?php 
$db_name = "hello"; 

由於database.inc.php被包括在功能init_db(),沒有e echo實際上會輸出任何東西。 $db_name是功能init_db()的本地功能。

要解決的是,只需添加global $db_name;database.inc.php文件:

database.inc.php思考的require()include()如複製粘貼代碼

<?php 
global $db_name; 
$db_name = "hello"; 

它被稱爲。由於您在函數init_db()database.inc.php被執行,所以global $db_name;將允許您在全局設置$db_name

0

想到的兩件事情是,$ db_name實際上被賦予了你期望獲得的值,並且你是否將文件包含在全局範圍中?

如果$ db_name正在被可能失敗的函數賦值(例如,如果建立了與數據庫的連接,mysql_connect將只返回一個連接句柄),那麼$ db_name可能被分配一個NULL值。

包含的文件繼承包含語句的執行範圍。如果你包含在一個函數中,那麼在include中賦值的任何值都只會在該函數的作用域中,並且將不再存在於作用域之外。同上的類和方法。請確保您的包含語句正在全球範圍內執行。

0

雖然您可以使用global關鍵字將變量帶入範圍,但我建議使用超全局$GLOBALS數組。 (顯式比隱式更好)。我的意思是不僅在你的功能使用一個全局變量,而且在一個文件,定義它。

// db_connect.php 
$GLOBALS['db_name'] = 'my_db_name'; 

這樣,當有人(甚至你,一個月後)是看着你的db_connect.php他會立即明白,這個變量應該是在全球範圍內,並會認爲試圖將其重命名前的兩倍。