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

时间:2019-01-09 15:47:54

标签: php casting logical-operators boolean-logic isset

我正在检查一些代码,并且想知道此表达式是否可能为false

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

上下文:

$bar = (!isset($_POST['foo']) || $_POST['foo']) ? 1 : 0;

3 个答案:

答案 0 :(得分:2)

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

$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 Forty Niner是正确的isset($ _ POST)将始终返回true,因为由于它是全局变量而总是被设置,因此应使用empty()或其他方法

https://3v4l.org/EtWn0

答案 1 :(得分:0)

您可能会想到以下情况:

  • $ _ POST ['foo']不存在

$ bar =(true || null)? 1:0 => 1

  • $ _ POST ['foo']存在,且值不为0,错误或空字符串

$ bar =(false || true)? 1:0 => 1

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

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

  • $ _ POST ['foo']存在且值为空

$ bar =(true || false)? 1:0 => 1

我认为您应该阅读In php, is 0 treated as empty?

答案 2 :(得分:0)

问题陈述:

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

带有伪代码的伪代码:

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

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

您真正要问的是: isset($_POST['foo'])的总评估结果是否与$_POST['foo']相同?

isset函数的定义:

  

isset —确定是否设置了一个变量,并且该变量不是NULL

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

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

自动转换为布尔值:

在布尔条件下,PHP中的普通变量在以下条件下的值为false

  
      
  • 布尔值FALSE本身
  •   
  • 整数0(零)
  •   
  • 浮点数0.0(零)
  •   
  • 空字符串和字符串“ 0”
  •   
  • 具有零个元素的数组
  •   
  • 特殊类型NULL(包括未设置的变量)
  •   
  • 从空标签创建的SimpleXML对象
  •   

请参阅:http://php.net/manual/en/language.types.boolean.php。如您所见,在很多情况下这是不一样的。

您的代码用词表示的含义:如果变量是0,0.0,“”,“ 0”,[]或空XML对象之一,则返回1。