2010-04-03 141 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所提到的,您应该尽可能避免使用全局变量。