这种说法会不会是假的?

Could this expression ever be false?

提问人:tirenweb 提问时间:1/9/2019 最后编辑:Blackbamtirenweb 更新时间:1/10/2019 访问量:98

问:

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

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

上下文:

$bar = (!isset($_POST['foo']) || $_POST['foo']) ? 1 : 0;
php 强制转换 运算符 布尔逻辑 isset

评论

7赞 naththedeveloper 1/9/2019
如果值 of 为空字符串,则为$_POST['foo']false
1赞 Funk Forty Niner 1/9/2019
isset()不检查某些内容是否为空。这些主要用于收音机、复选框、选择输入。您到底想检查什么?
0赞 CD001 1/9/2019
它基本上指出,如果设置或它有一个值,我们都很好 - 所以,是的,它看起来像是在显式地寻找空的表单字段;这可能会随着字段的注意而下降 - 如果它们是空的,它们不会发布 - 所以空将设置为,而对于 a 来说,它将是 .$_POST['foo']<textarea><input type="text" ... />$bar0<textarea>1

答:

2赞 abr 1/9/2019 #1

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

$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 is correctt isset($_POST) 将始终返回 true,因为它始终是由于是全局变量而设置的,应该改用或其他方法empty()

https://3v4l.org/EtWn0

评论

0赞 cwhsu 1/10/2019
我实际上对 null 值的 isset 是错误的,所以这个线程也值得一读 stackoverflow.com/questions/7191626/......
0赞 cwhsu 1/10/2019 #2

您可以想到以下情况:

  • $_POST['foo'] 不存在

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

  • $_POST['foo'] 存在,值不是 0、false 或空字符串

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

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

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

  • $_POST['foo'] 存在且值为 null

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

我认为你应该在 php 中阅读这篇文章,0 是否被视为空?

0赞 Blackbam 1/10/2019 #3

问题陈述:

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

带有 wods 的伪代码:

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。