我有这些if statements
empty()
函数与变量$a, $b, $c
if (empty($a . $b . $c)) {echo 'empty.dot';}
if (empty($a && $b && $c)) {echo 'empty';}
if (!empty($a . $b . $c)) {echo 'filled.dot';}
if (!empty($a && $b && $c)) {echo 'filled';}
我得到了一个奇怪的结果,测试它们如下:
case[1]:
$a = '1';
$b = '1';
$c = '1';
result:
fillted.dot, filled
case[2]:
$a = '1';
$b = '';
$c = '1';
result:
empty, fillted.dot
case[3]:
$a = '';
$b = '';
$c = '';
result:
empty.dot, empty
我不明白的是
为什么在case[2]
我同时获得empty($a && $b && $c)
和!empty($a . $b . $c)
= TRUE
答案 0 :(得分:2)
empty
并不关心填充表达式。为了使行为更加明显,也不要这样做。将表达式分解为实际操作:
$and = $a && $b && $c;
$cat = $a . $b . $c;
var_dump( empty($and) );
var_dump( empty($cat) );
而且很明显为什么
(1 && "" && 1)
为FALSE
,因此empty(FALSE)
为TRUE
!empty("11")
返回TRUE
。答案 1 :(得分:1)
empty
函数(或类似函数的函数)没有看到您使用的不同变量。与任何函数一样,它会看到您传入的单个值。
所以我们首先需要看一下表达式:
$a && $b && $c
这会将每个变量视为布尔值,如果所有三个值都为真,则计算结果为true
,false
如果其中任何值为false-ish。在您使用的测试用例中,'1'
将被视为true,''
将被视为false。
$a . $b . $c
将每个变量视为一个字符串,并将它们连接成一个更长的字符串。
要查看empty
正在测试的值,只需替换为var_dump
。