代码之家  ›  专栏  ›  技术社区  ›  tirenweb

这个表达可能是错误的吗?

  •  0
  • tirenweb  · 技术社区  · 6 年前

    我正在检查一些代码,我想知道这个表达式是否可能 false :

    !isset($_POST['foo']) || $_POST['foo']
    

    $bar = (!isset($_POST['foo']) || $_POST['foo']) ? 1 : 0;
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   abr    6 年前

    根据下面的快速测试,这确实是可能的

    $trueVar = true; // Or 1
    $falseVar = false; // Or 0
    $nullVar = null;
    $emptyVar = "";
    
    $result1 = (!isset($trueVar) || $trueVar) ? 1 : 0;
    $result2 = (!isset($falseVar) || $falseVar) ? 1 : 0;
    $result3 = (!isset($nullVar) || $nullVar) ? 1 : 0;
    $result4 = (!isset($emptyVar) || $emptyVar) ? 1 : 0;
    
    Output: 
    result1 = 1
    result2 = 0
    result3 = 1
    result4 = 0
    

    注意:你为什么不直接做呢 $bar = isset($_POST['foo']) 问它是空的还是空的?

    编辑:Funk四十九是正确的isset($\u POST)将始终返回true,因为它总是设置为全局变量, empty()

    https://3v4l.org/EtWn0

        2
  •  0
  •   cwhsu    6 年前

    您可以考虑以下情况:

    • $\u POST['foo']存在,并且值不是0、false或空字符串

    $bar=(假| |真)?1:0=>1

    • $\u POST['foo']存在,值为0,false,空字符串

    $bar=(假| |假)?1:0=>0

    $bar=(真| |假)?1:0=>1

    In php, is 0 treated as empty?

        3
  •  0
  •   Blackbam    6 年前

    问题陈述:

    !isset($_POST['foo']) || $_POST['foo']
    

    带WOD的伪代码:

    NOT isset($_POST['foo']) OR $_POST['foo']
    

    不具有比OR运算符更高的绑定( http://php.net/manual/de/language.operators.logical.php ).

    你真正想问的是: isset($_POST['foo']) 总是以相同的结果进行评估 $_POST['foo'] ?

    isset函数的定义:

    http://php.net/manual/en/function.isset.php

    因此,如果变量不存在且不为null,则isset的计算结果仅为false。

    自动转换为布尔值:

    PHP中布尔条件下的普通变量的计算结果为 false

    • 布尔值本身是假的
    • 整数0(零)
    • 浮点数0.0(零)
    • 空字符串和字符串“0”
    • 零元素数组
    • 特殊类型NULL(包括未设置的变量)

    http://php.net/manual/en/language.types.boolean.php . 正如你所看到的,在很多情况下这是不一样的。

    您的代码在文字中的含义: