isset() 和 PHP 全局变量

17

关于全局变量初始化的问题:

function hello_testing() {
    global $conditional_random;
    if (isset($conditional_random)) {
        echo "foo is inside";
    }
}
全局变量 (conditional_random) 可能在调用 hello_testing() 函数之前未被初始化。
那么,当 $conditional_random 未初始化时,通过 isset() 进行的验证会发生什么?它会失败还是始终为真?

顺便说一下,尽量避免使用全局变量。这是代码混乱的明显标志。 - Manos Dilaverakis
3
我同意,但是如果你在WordPress社群中开发(只是举个例子),很难避免使用全局变量或其他不好的惯例。在我看来,如果你首先选择使用PHP,那么就已经接受了容忍糟糕编码实践的事实,并且只需要知道相对安全的处理现有问题的方法就可以了。 - Topher Hunt
4个回答

18
好吧,为什么你不试试看呢?;-)
注意:这并不像你想的那么简单——请阅读完整的答案;-)
调用`hello_testing();`函数,而不设置变量:
hello_testing();

我没有得到任何输出 - 这表明isset返回了false
调用函数,在设置变量之后。
$conditional_random = 'blah';
hello_testing();

我得到一个输出。
foo is inside

这意味着当变量设置好时,global正常工作,对此应该毫无疑问^^

但请注意,如果变量被设置为nullisset将返回false


请参阅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)

(这只是为了纯粹展示我的例子没有被欺骗 ^^)


2
所以你的“测试”是为了查看是否触发了通知?虽然isset如何工作的解释很好,但这似乎并没有提供一个有用的替代方案。 - Omn
非常出色的解释和演示,如果在函数外未声明变量,则全局将将其声明为空。这正是我正在寻找的答案,谢谢! - multimediaxp

11
您可以检查$key是否存在于$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

不需要使用任何函数。如果全局变量未设置,它将返回null,并且在PHP语句中null等同于false。因此,您可以像这样使用它:

global $GLOBAL_VARIABLE;
if ($GLOBAL_VARIABLE) {
  // Global variable exists
} else  {
  // Global variable does not exists
}

解决方案2

if (isset($GLOBALS["name"])) {
  // Global variable "name" exists
} else  {
  // Global variable does not exists
}

-2

Global 设置变量。因此,isset($some_globald_variable) 总是返回 true。

更好的选择是使用 empty()

 if(empty($globald_variable))
 {
     // Variable is not set
 }

不想听起来像个自大的人,但是你在if语句中忘记了一个括号 :) - Gabriel
5
该变量会被创建,但它的初始值为 null。当一个变量的值为 null 时,isset 函数会返回 false。 - goat
1
这个回答相当不正确。除了@goat所说的之外,“empty”函数也会对假值(如“”,[],0,false)返回true。 - Omn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接