2010-04-03 186 views
5

我有一個關於全局變量初始化的問題。被稱爲hello_testing()函數之前isset()和PHP全局變量

function hello_testing() { 
    global $conditional_random; 
    if (isset($conditional_random)) { 
     echo "foo is inside"; 
    } 
} 

全局變量(conditional_random)可能不被初始化。

所以,當未初始化​​會怎麼樣通過isset()我的驗證?它會失敗還是永遠是真的?

+0

在旁邊注意儘量遠離全球。這是意大利麪條代碼 – 2010-04-03 14:23:15

+1

@ Manos的確定標誌我同意,但是如果你在Wordpress社區開發(作爲一個例子),或多或少不可能遠離全局變量或許多其他不好的約定。在我看來,如果您首先使用PHP,那麼您已經放棄了自己去忍受糟糕的編碼習慣,只需要知道相對安全的方式來處理您的問題。 – 2015-04-14 16:50:19

回答

9

好了,你爲什麼不只是測試? ;-)

注:不那麼容易,因爲你會覺得 - 閱讀完整的答案;-)


調用hello_testing();功能,無需設置變量:

hello_testing(); 

我沒有輸出 - 這表示isset返回false


調用函數,設置變量之後:

$conditional_random = 'blah'; 
hello_testing(); 

我得到的輸出:

foo is inside 

這表明global作品如預期,當變量被設置- 好,不應該有關於任何疑問^^



但請注意,isset將返回false如果一個變量設置,並null
manual page of isset()

這意味着更好的測試將是:

function hello_testing() { 
    global $conditional_random; 
    var_dump($conditional_random); 
} 

hello_testing(); 

這顯示:

null 

無提示:該變量存在!即使null

,因爲我沒有設置函數的變量外,它表明global變量 - 但它不會把值到它;這意味着它是null如果尚未設置功能外。


雖然:

function hello_testing() { 
    //global $conditional_random; 
    var_dump($conditional_random); 
} 

hello_testing(); 

給出:

Notice: Undefined variable: conditional_random 

證明,通知已啓用;-)

而且,如果全球沒有 「設置」 變量,前面的例子會給出相同的通知。


並且,最後:

function hello_testing() { 
    global $conditional_random; 
    var_dump($conditional_random); 
} 

$conditional_random = 'glop'; 
hello_testing(); 

給出:

string 'glop' (length=4) 

(純粹是爲了證明我的例子不是欺騙^^)

+1

所以你的'測試'是看看是否觸發通知?雖然解釋如何工作是好的,但這似乎並沒有提供一個有用的選擇。 – Omn 2015-03-19 20:21:52

-1

Global設定變量。因此isset($some_globald_variable)將始終返回true。

更好的選擇是empty()

if(empty($globald_variable)) 
{ 
// variable not set 
} 
+0

不想聽起來像一個屁股:)但你忘了你的'if'語句中的一個圓括號:) – Gabriel 2010-04-03 15:02:02

+5

該變量確實被創建,但它被初始化爲空。 isset在給定值爲空的變量時返回false。 – goat 2010-04-03 17:58:30

+0

@goat是對的,這個答案是不正確的 – 2014-12-01 19:37:49

6

您可以檢查是否通過檢查密鑰是否存在於$ GLOBALS中來創建全局:

echo array_key_exists('fooBar', $GLOBALS)?"true\n":"false\n"; 
//Outputs false 

global $fooBar; 

echo array_key_exists('fooBar', $GLOBALS)?"true\n":"false\n"; 
//Outputs true 

echo isset($fooBar)?"true\n":"false\n"; 
//Outputs false 

這是我知道檢查全局的存在而不觸發警告的唯一方法。

正如Manos Dilaverakis所提到的,您應該儘可能避免使用全局變量。