【问题标题】:PHP: How to check if a var has been initiliazed? isset returns false when the var has been set to NULLPHP:如何检查 var 是否已被初始化?当 var 设置为 NULL 时,isset 返回 false
【发布时间】:2009-02-06 19:20:15
【问题描述】:
<?php
    $var = NULL;

    var_dump(isset($var)); // bool(false)
    var_dump(isset($unset_var)); // bool(false)
?>

isset($var) 应该返回 TRUE,因为它已被设置为 NULL。

有什么方法可以检查吗?

谢谢!

【问题讨论】:

    标签: php


    【解决方案1】:

    使用 get_defined_vars() 获取当前作用域中定义的变量数组,然后使用 array_key_exists() 对其进行测试;

    已编辑:

    如果你想要一个函数来测试存在,你可以像这样创建一个:

    function varDefined($name,$scope) {
      return array_key_exists($name, $scope);
    }
    

    并在任何给定范围内使用:

    $exists = varDefined('foo',get_defined_vars());
    

    应该适用于任何范围。

    【讨论】:

    • 我认为这是唯一的方法,因为这就是 PHP 中发生的情况: var_dump($random_nonexistent_var); // NULL 谢谢!
    【解决方案2】:

    不是很漂亮,但是...

    array_key_exists('var', $GLOBALS);
    

    (您不能使用@is_null($var),因为无论哪种方式它的计算结果都为真[并且使用@运算符抑制错误并不是一个很好的做法...])

    【讨论】:

    • 并非如此。 is_null() 对未定义的变量返回 true。
    • 是的,我发帖后注意到了。现在修好了。
    【解决方案3】:

    如果是全局的,你可以这样做:

    if(array_key_exists('var', $GLOBALS))
    

    【讨论】:

      【解决方案4】:

      如果它在全局范围内,您可以尝试检查该键是否存在于 $GLOBALS 超全局中(使用 array_key_exists())。

      但如果你需要知道这一点,你可能做错了:)

      【讨论】:

        【解决方案5】:

        任何未设置的 var 都将评估为 null:

        php > $a = null;
        php > var_dump($a === null);
        bool(true)
        php > var_dump($a === $b);
        bool(true)
        

        (使用交互式控制台 - php -a )

        【讨论】:

          【解决方案6】:

          变量不是默认初始化为NULL吗?因此,未初始化的和已设置为 NULL 的之间并没有真正的区别。

          【讨论】:

          • 不同之处在于它存在于任何命名空间中的条目。
          • 是的,但这对编写脚本的人有什么影响?你必须以不同的方式处理这两种情况吗?
          • 它是一个没有值的条目(NULL 是一个表示 NO VALUE 的值) - 有些东西是空的,它没有设置为空。命名空间中的条目在检测到没有与之关联的值的变量的初始化时没有任何意义。
          • 我再次问,“你必须以不同的方式处理这两种情况吗?”如果我们谈论的是脚本编写者或其他人所体验的功能,我想澄清一下。
          • 您必须单独处理它们。 is_null 用于空值检查和 isset 以查看变量是否已启动。
          猜你喜欢
          • 1970-01-01
          • 2010-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-26
          • 1970-01-01
          • 2017-06-01
          相关资源
          最近更新 更多