变量是否设置,是否为空?

时间:2014-03-07 21:50:18

标签: php variables null conditional flow-control

尝试确定变量是否是这些可能结果之一:

  1. 具有非空值
  2. 值为NULL
  3. 根本不设置
  4. 我从这开始:

    if ( isset($value) )
      var_dump("It's set");
    else
      var_dump("Not set");
    

    包括变量是否已设置。但是我还想覆盖变量是否为null。了解以下内容:

    $value = null;
    var_dump( isset($value) );  // Returns false
    

    因此,在未设置的情况下返回null值。所以我不能这样做:

    if ( isset($value) )
      var_dump("It's set");
    else if ( is_null($value) )   // This throws exception if $value is not set
      var_dump("It's null");
    else
      var_dump("Not set");
    

    也不能这样做:

    if ( isset($value) ) {
      var_dump("It's set");
    } else {
      if ( is_null($value) )
        var_dump("It's null");  // Also throws an exception because $value is not set
      else
        var_dump("Not set");
    }
    

    起初我以为会有一种简单的方法可以做到这一点,但它是在逃避我。问题归结为检测到null值未设置,但您无法使用is_null()检查未设置值。

    我该如何解决这个问题?我错过了一些明显的东西吗我是否需要诉诸try catch

    如果你很好奇,我会问这个问题,因为有一种情况,开发人员可以将变量传递给某个东西,我需要能够区分开发人员是否通过值传递变量或者NULL值或根本没有传递它。

4 个答案:

答案 0 :(得分:1)

我能给出的最佳答案是,您不应该依赖于是否设置了某些内容,而是构建代码以使其始终设置。

刚看到你的编辑。

函数参数可以具有默认值,因此您知道它始终设置。 function myFun($variable = null)将确保访问$ variable永远不会抛出异常。

编辑: 如果确实需要知道是否传入了参数,请使用func_get_args()。它返回一个数组,你可以检查它的大小。

function foo($bar) {
    var_dump(func_get_args());
}

foo();
foo('foo');

给出输出:

array(0) {
}
array(1) {
  [0] =>
  string(3) "foo"
}
但是,顺便说一下,在没有参数的情况下调用foo()会发出错误:

PHP Warning:  Missing argument 1 for foo(), called in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 6 and defined in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 2
Warning: Missing argument 1 for foo(), called in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 6 and defined in /Users/pittsd/dev/cbsi/fly/cnet/expirement/expirement.php on line 2

进一步回答你的问题:

<?php
function foo() {
    if (func_get_args()) {
        $value = func_get_args()[0];
        if ($value === null) {
            echo "Have a null value. ". PHP_EOL;

        } else {
            echo "Have a value: ".$value. PHP_EOL;
        }
    }
    else {
        echo "No value passed in.". PHP_EOL;
    }
}

foo(null);
foo('foo');
foo();

输出:

Have a null value. 
Have a value: foo
No value passed in.

答案 1 :(得分:1)

一般情况下,您可以通过这种方式执行支票,无任何例外:

if(isset($value)) {
    if($value===null) {
        // exists and null
    }
    else {
        // exists and not null
    }
}
else {
    // doesn't exists
}

编辑:

正如您在评论中提到的,上面的代码不能用作例外,但是我有另一个解决方案来检查变量是否存在并且为null:

var_dump(array_key_exists('value', get_defined_vars())); // false
$value = null;
var_dump(array_key_exists('value', get_defined_vars())); // true

答案 2 :(得分:0)

if (!empty($value) )  //  if is not empty

or

if (empty($value))  // if is empty

答案 3 :(得分:0)

未定义的变量错误是一个通知错误,不会停止执行脚本。

如果你使用try-catch {}围绕if子句,它都不会停止,所以你可以只是抑制这个错误。通常在生产环境中隐藏通知错误。

如果是以下代码,您的代码将完美无缺:

if($value == null) { // or @$value == null for suppressing this error ?
    if (count(error_get_last()) == 0) {
        echo 'null';
    } else {
        echo 'value is not set';
    }
} else {
    echo 'value is: '. $value;
}

您可以在测试null后检查是否有错误消息,如果有,则表示未设置。

让我们测试一下。

首先我们不传递任何东西。它打印:

value is not set

现在我们通过了$value = null;。它打印:

null

现在我们通过了$value = 'something';。它打印:

value is: something