我对全局变量初始化有疑问。
function hello_testing() {
global $conditional_random;
if (isset($conditional_random)) {
echo "foo is inside";
}
}
在调用hello_testing()
函数之前,可能无法初始化全局变量(conditional_random)。
那么,当isset()
未初始化时,通过$conditional_random
验证会发生什么?它会失败还是永远都是真的?
答案 0 :(得分:13)
注意:不像你想象的那么容易 - 阅读完整的答案; - )
调用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 :(得分:8)
您可以通过检查$ 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提到,你应该尽可能避免使用全局变量。
答案 2 :(得分:-1)
Global
设置变量。因此isset($some_globald_variable)
将始终返回true。
更好的选择是empty()
if(empty($globald_variable))
{
// variable not set
}