Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 变量是否已设置,是否为空?_Php_Variables_Null_Conditional Statements_Control Flow - Fatal编程技术网

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

Php 变量是否已设置,是否为空?,php,variables,null,conditional-statements,control-flow,Php,Variables,Null,Conditional Statements,Control Flow,试图确定某个变量是否为以下可能结果之一: 具有非空值 具有NULL值 一点也没有 我从这个开始: if ( isset($value) ) var_dump("It's set"); else var_dump("Not set"); 这包括变量是否已设置。但是,我还想讨论变量是否为null。了解以下情况: $value = null; var_dump( isset($value) ); // Returns false 因此,将返回一个未设置的空值。所以我不能这么做: if (

试图确定某个变量是否为以下可能结果之一:

  • 具有非空值
  • 具有NULL值
  • 一点也没有
  • 我从这个开始:

    if ( isset($value) )
      var_dump("It's set");
    else
      var_dump("Not set");
    
    这包括变量是否已设置。但是,我还想讨论变量是否为null。了解以下情况:

    $value = null;
    var_dump( isset($value) );  // Returns false
    
    因此,将返回一个未设置的空值。所以我不能这么做:

    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");
    }
    
    也不能这样做:

    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\u null()
    检查未设置的值

    我如何解决这个问题?我错过了什么明显的东西吗?我是否需要求助于
    试一试catch


    如果你好奇的话,我问这个问题是因为有一种情况,开发者可以将变量传递给某个东西,我需要能够区分开发人员是用值还是空值传递变量,还是根本不传递变量。

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

    if (!empty($value) )  //  if is not empty
    
    or
    
    if (empty($value))  // if is empty
    
    刚刚看到你的编辑

    函数参数可以有一个默认值,以便您知道它始终处于设置状态
    函数myFun($variable=null)
    将确保访问$variable不会引发异常

    编辑: 如果确实需要知道是否传入了参数,请使用func\u get\u 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();
    

    通常,您可以通过以下方式执行检查,无任何例外:

    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
    

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

    如果您使用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=null。它打印:

    null

    现在我们传递
    $value='something'。它打印:


    值是:有些东西

    问题在于,在我的函数中,我特别需要知道用户是否实际传递了空值,或者他们是否根本没有传递空值。将默认值设置为null将无法确定。您可以使用另一个值作为默认值。如果你需要做一些完全不同的事情,如果他们不传入变量,这表明你需要一个单独的函数来完成这种情况下的工作。这并不完全是我需要的,但它给了我一些好主意。谢谢。与isset的问题相同。如果执行
    var_dump(空($value)),则为_null($value))如果未设置变量,则它会引发异常。您可以使用!用isset清空你想要的。不在机器上进一步解释,抱歉
    $value=null;如果(isset($value)){echo'ok';}
    结束,您将得到一个空白页面。isset()将在$value=null
    $value=null时返回false;var_转储(isset($value))返回false。因此,如果($value==null)
    块,代码将永远不会到达