isset() 和 PHP 全局变量

2022-08-31 00:47:29

关于全局变量初始化,

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

在调用函数之前,可能无法初始化全局变量 (conditional_random)。hello_testing()

那么,当未初始化时,我的验证会怎样?它会失败还是永远是真的?isset()$conditional_random


答案 1

好吧,你为什么不直接测试?;-)

注意:这并不像你想象的那么容易 - 阅读完整的答案;-)


调用函数,而不设置变量:hello_testing();

hello_testing();

我没有得到任何输出 - 这表示返回 falseisset


设置变量后调用函数:

$conditional_random = 'blah';
hello_testing();

我得到一个输出:

foo is inside

这表明全局工作按预期工作,当变量被设置时 - 好吧,人们不应该怀疑这个^^



但请注意,如果设置了变量,则 isset 将返回 false,并且为 null


请参阅 isset() 的手册页

这意味着更好的测试将是:

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

hello_testing();

这将显示:

null

否 通知:变量存在!便。null

由于我没有在函数之外设置变量,因此它显示设置变量 - 但它没有在其中输入值;这意味着如果尚未在函数外部设置,则为该函数。globalnull


而:

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

hello_testing();

给:

Notice: Undefined variable: conditional_random

它证明了通知已启用;-)

而且,如果 global 没有“设置”变量,前面的示例将给出相同的通知。


最后:

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

$conditional_random = 'glop';
hello_testing();

给:

string 'glop' (length=4)

(这纯粹是为了证明我的例子没有被欺骗^^)


答案 2

您可以通过检查密钥是否存在于$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所提到的,你应该尽可能避免使用全局变量。


推荐