【问题标题】:Check if a variable is undefined in PHP检查PHP中是否未定义变量
【发布时间】:2015-05-12 12:54:48
【问题描述】:

考虑这个 JavaScript 语句:

isTouch = document.createTouch !== undefined

我想知道我们在 PHP 中是否有类似的语句,不是 isset(),而是从字面上检查未定义的值。比如:

$isTouch != ""

PHP中是否有类似上述的东西?

【问题讨论】:

标签: php


【解决方案1】:

你可以使用 -

$isTouch = isset($variable);

如果定义了$variable,它将返回true。如果变量未定义,它将返回false

注意:如果变量存在并且具有非NULL值,则返回TRUE,否则返回FALSE。

如果要检查false0等,则可以使用empty() -

$isTouch = empty($variable);

empty() 适用于 -

  • "" (一个空字符串)
  • 0 (0 为整数)
  • 0.0 (0 作为浮点数)
  • "0" (0 作为字符串)
  • 错误
  • array() (一个空数组)
  • $var; (声明的变量,但没有值)

【讨论】:

  • isset() 总是返回布尔值。
  • 是否需要布尔转换? isset(...) 已经返回 bool 了吧?
  • 没有。它返回truefalse。所以不需要那个演员。
  • 您也可以使用empty() 来执行此操作,如果它是一个空字符串,它将返回false。 isset() 将返回 true 如果它是一个空字符串,也空在内部进行 isset 检查。
  • 您也可以这样做:$isTouch = (bool) $variable;,它的作用与isset() 相同,可能会更好一些,因为它会像empty() 一样工作。
【解决方案2】:

另一种方法很简单:

if($test){
    echo "Yes 1";
}
if(!is_null($test)){
    echo "Yes 2";
}

$test = "hello";

if($test){
    echo "Yes 3";
}

将返回:

"Yes 3"

最好的方法是使用isset()。否则你可能会遇到像“undefined $test”这样的错误。

你可以这样做:

if(isset($test) && ($test!==null))

你不会有任何错误,因为第一个条件不被接受。

【讨论】:

  • 如果我们使用不带括号的$test!==null,会发生什么?会报错吗?
  • 不,也可以。
  • 案例 1 和 2 将引发警告。这不是检查值是否未定义的正确方法。
  • isset() would return false if the value is null
【解决方案3】:

isset() 函数不检查是否定义了变量。

您似乎已明确表示您不是在问题中寻找isset()。我不知道为什么有这么多答案说isset() 是要走的路,或者为什么接受的答案也这么说。

在编程中认识到 null 是很重要的。我不知道为什么决定 isset() 如果值为 null 将返回 false。

要检查变量是否未定义,您必须使用get_defined_vars() 检查变量是否在已定义变量列表中。没有等效于 JavaScript 的 undefined (这是问题中显示的内容,那里没有使用 jQuery)。

在以下示例中,它的工作方式与 JavaScript 的未定义检查相同。

$isset = isset($variable);
var_dump($isset); // false

但在这个例子中,它不会像 JavaScript 的未定义检查那样工作。

$variable = null;
$isset = isset($variable);
var_dump($isset); // false

$variable 被定义为 null,但 isset() 调用仍然失败。

那么你如何实际检查变量是否已定义?你检查定义的变量。

使用get_defined_vars() 将返回一个关联数组,其中键作为变量名,值作为变量值。这里还是不能用isset(get_defined_vars()['variable']),因为key可能存在,value还是null,所以必须用array_key_exists('variable', get_defined_vars())

$variable = null;
$isset = array_key_exists('variable', get_defined_vars());
var_dump($isset); // true


$isset = array_key_exists('otherVariable', get_defined_vars());
var_dump($isset); // false

但是,如果您在代码中发现必须检查变量是否已定义,那么您可能做错了什么。这是我个人的看法,为什么核心 PHP 开发人员离开 isset() 在某些内容为空时返回 false。

【讨论】:

  • 这个,是正确的答案!至于检查是否定义了变量,有时在处理到处都有全局变量的 shi*y 代码时很有用。以及为什么 PHP 人员决定让 isset() 返回 false 如果变量 is 已定义并包含 null ...这是地球上的另一个谜!
  • 谢谢,这标志着我对isset()null 的好奇盲点的困惑结束了。至于“做错事”的理由,经过简要考虑,我无法指出需要知道 null 变量是否存在的非粗略场景,但对于数组成员来说,肯定有有意义的 @ 987654338@,例如当使用 PDO 的准备好的语句时。
【解决方案4】:

要检查是否设置了变量,您需要使用isset 函数。

$lorem = 'potato';

if(isset($lorem)){
    echo 'isset true' . '<br />';
}else{
    echo 'isset false' . '<br />';
}

if(isset($ipsum)){
    echo 'isset true' . '<br />';
}else{
    echo 'isset false' . '<br />';
}

此代码将打印:

isset true
isset false

isset 了解更多信息。

【讨论】:

    【解决方案5】:

    您可以使用ternary operator 来检查该值是否由POST/GET 设置。像这样的:

    $value1 = $_POST['value1'] = isset($_POST['value1']) ? $_POST['value1'] : '';
    $value2 = $_POST['value2'] = isset($_POST['value2']) ? $_POST['value2'] : '';
    $value3 = $_POST['value3'] = isset($_POST['value3']) ? $_POST['value3'] : '';
    $value4 = $_POST['value4'] = isset($_POST['value4']) ? $_POST['value4'] : '';
    

    【讨论】:

    • PHP 7.0 引入了Null coalescing operator,它是为这样的事情而设计的。那么代码就是$value1 = $_POST["value1"] ?? "fallback"
    【解决方案6】:

    您可以使用 PHP isset() 函数来测试是否设置了变量。如果测试已设置为 NULL 的变量,isset() 将返回 FALSE。示例:

    <?php
        $var1 = '';
        if(isset($var1)){
            echo 'This line is printed, because the $var1 is set.';
        }
    ?>
    

    此代码将输出“已打印此行,因为设置了 $var1。”

    阅读更多https://stackhowto.com/how-to-check-if-a-variable-is-undefined-in-php/

    【讨论】:

    • 但 null 毕竟是一个值,而 $var1 = null 是我可以在 if 中使用的东西。所以没有雪茄。
    【解决方案7】:

    JavaScript 的“严格不等于”运算符 (!==) 与 undefined 比较时,not 会导致 null 值上的 false

    var createTouch = null;
    isTouch = createTouch !== undefined  // true
    

    要在PHP中实现等价行为,可以检查get_defined_vars()结果的键中是否存在变量名。

    // just to simplify output format
    const BR = '<br>' . PHP_EOL;
    
    // set a global variable to test independence in local scope
    $test = 1;
    
    // test in local scope (what is working in global scope as well)
    function test()
    {
      // is global variable found?
      echo '$test ' . ( array_key_exists('test', get_defined_vars())
                        ? 'exists.' : 'does not exist.' ) . BR;
      // $test does not exist.
    
      // is local variable found?
      $test = null;
      echo '$test ' . ( array_key_exists('test', get_defined_vars())
                        ? 'exists.' : 'does not exist.' ) . BR;
      // $test exists.
    
      // try same non-null variable value as globally defined as well
      $test = 1;
      echo '$test ' . ( array_key_exists('test', get_defined_vars())
                        ? 'exists.' : 'does not exist.' ) . BR;
      // $test exists.
    
      // repeat test after variable is unset
      unset($test);
      echo '$test ' . ( array_key_exists('test', get_defined_vars())
                        ? 'exists.' : 'does not exist.') . BR;
      // $test does not exist.
    }
    
    test();
    

    在大多数情况下,isset($variable) 是合适的。这相当于array_key_exists('variable', get_defined_vars()) &amp;&amp; null !== $variable。如果您只使用null !== $variable 而不预先检查是否存在,您的日志中会出现警告,因为这是试图读取未定义变量的

    但是,您可以将未定义的变量应用于引用而不会发出任何警告:

    // write our own isset() function
    function my_isset(&$var)
    {
      // here $var is defined
      // and initialized to null if the given argument was not defined
      return null !== $var;
    }
    
    // passing an undefined variable by reference does not log any warning
    $is_set = my_isset($undefined_variable);   // $is_set is false
    

    【讨论】:

    • 我不确定my_isset 函数会完成什么。它唯一要确定的是变量是否设置为 null 而不会引发错误,而不是变量是否已定义。 $string = 'string'; $is_set = my_isset($string);在这种情况下$is_set 将是假的,即使它被设置为一个字符串。
    • @scorgn 有一个错字。在说“如果你只使用 null !== $variable”之后,它当然不应该是以下函数中的===。刚刚编辑。
    【解决方案8】:

    最简单的方法检查variablearray index 是否存在(已定义)并且不为空不为空 并且不是假的

    #1

    if($variable ?? false) 
        echo '$variable is defined';
    else 
        echo '$variable is not defined';
    
    // Result: $variable is not defined
    

    #2

    $variable = null;
    
    if($variable ?? false) 
        echo '$variable is not null';
    else 
        echo '$variable is null';
    
    // Result: $variable is null
    

    #3

    $variable = false;
    
    if($variable ?? false) 
        echo '$variable is not false';
    else 
        echo '$variable is false';
    
    // Result: $variable is false
    

    #4

    $variable = '';
    
    if($variable ?? false) 
        echo '$variable is not empty';
    else 
        echo '$variable is empty';
    
    // Result: $variable is empty
    

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 2018-05-26
      • 1970-01-01
      • 2019-05-11
      • 2010-09-22
      • 2013-05-19
      • 2021-04-21
      • 2012-04-28
      • 2015-05-01
      相关资源
      最近更新 更多