php 的全域變數看起來很好用,但稍有不慎,很容易被套住。
比如: 如果一個簡單的php設定檔如下:
$name="Yi_Zhi_Yu";
當我們想要使用這個$name的時候,都知道使用include就行了。沒錯,這樣可以。但假如我想把這個$name作為一個全域變數使用,以方便統一修改呢
也容易:
include("./config.inc");global $name;echo $name; //Yi_Zhi_Yu
那麼問題來了,假如某個函數裡我要用這個全域變數呢,或許你會這麼寫
function test(){ include("./config.inc"); //這裡載入是錯誤的 global $name; var_dump($name);}test();
Sorry, 你這樣是得不到這個變數值得,得到的僅僅是個null
這就是我在實際中遇到的一個坑,即檔案載入的全域變數的初始化只能在整個指令碼的最外層,我說的最外層是指不能被包含在任何的函數體或者類裡面
include("./config.inc"); //最外層初始化全域變數function test(){ global $name; //使用的時候定義其全域屬性 echo $name; //Yi_Zhi_Yu}test();
那再來一個問題,一個在test裡面被定義了全域屬性的變數(假設$age=25),假如在外面被修改了值($age=27),然後這個變數($age)再在另一個函數中調用,這個時候的這個$age應該是哪個值呢,代碼如下,是被初始化的時候值(25),還是在外面被修改了的值(27)呢。
function test(){ global $age; $age=25;}function test2(){ global $age; var_dump($age); //這個值應該是什嗎?}test();var_dump($age);$age=27;test2();
沒錯,這個值應該是27, 這就是全域變數,只不過這種定義和初始化都是在一個函數體內完成的(不過這種方式不推薦,一般都是在最上面我說的設定檔中初始化的,只在使用的時候定義其全域屬性,但不會在代碼中修改其值,僅僅作為配置項擷取)。