这是最简单的类型。布尔表示真或假真假值。
语法
要指定布尔,请使用常量真或假。两者都不区分大小写。
<?php $foo = True; // 设置 $foo 为 TRUE ?>
通常,操作员返回的布尔值传递给控制流。
<?php // == 是一个操作符,它检测两个变量是否相等,并返回一个布尔值 if ($action == "show_version") { echo "The version is 1.23"; } // 这样做是不必要的... if ($show_separators == TRUE) { echo "<hr> "; }
// ...因为可以使用下面这种简单的方式: if ($show_separators) { echo "<hr> "; } ?>
转换为布尔值
使用“布尔”或“布尔”强制值显式转换为布尔。但是,如果运算符、函数或流控制结构假定为布尔参数,则值会自动转换,因此通常不需要转换。
以下值在转换为布尔时被视为假。
boolean false本身
整数值0(零)
浮点值0.0(零)-0.0(零)
空字符串和字符串“0”
不包含元素的数组
特殊类型空值(包括尚未分配值的变量)
从没有属性的空元素(即没有子节点和属性的元素)创建SimpleXML对象。
所有其他值均为真(包括资源和NAN)。
注意
-1与其他非零值(正或负)一样被视为真。
<?php var_dump((bool) ""); // bool(false) var_dump((bool) "0"); // bool(false) var_dump((bool) 1); // bool(true) var_dump((bool) -2); // bool(true) var_dump((bool) "foo"); // bool(true) var_dump((bool) 2.3e5); // bool(true) var_dump((bool) array(12)); // bool(true) var_dump((bool) array()); // bool(false) var_dump((bool) "false"); // bool(true) ?>
啊,是的,布尔值-设置(TRUE)或未设置(FALSE)的位值。现在,我们有了64位编译器,使用整数变量表示布尔值,有*1*值为假(零)和2**64-1值为真(其他所有值)。在这个宇宙中似乎有更多的真理,但虚假可以胜过任何真实的东西。。。
PHP将字符串处理为布尔值几乎是正确的-空字符串为假,非空字符串为真-只有一个例外:包含单个零的字符串被视为假。为什么?如果*任何*非空字符串将被视为FALSE,为什么*只有*一个零?为什么不“FALSE”(最好不区分大小写),或“0.0”(小数点后多少位),或“NO”(同样不区分大小大小写),或者?
“正确”的设计应该是任何非空字符串都是真的-句点,故事结束。相反,对于经验不足的程序员来说,还有另一个需要注意的问题,在这么晚的时候修复语言的设计错误无疑会破坏很多东西,因此完全不可能进行纠正。
说到陷阱,请考虑以下代码序列:
<?php $x=TRUE; $y=FALSE; $z=$y OR $x; ?>
$z是真还是假?
在这种情况下,$z将为FALSE,因为上述代码等效于<?php($z=$y)或$x?>而不是<?php$z=($y或$x)?>正如预期的那样-因为OR运算符的优先级低于赋值运算符。
另一方面,在该代码序列之后:
<?php $x=TRUE; $y=FALSE; $z=$y || $x; ?>
$z将如预期的那样为真,因为||运算符的优先级高于赋值:代码相当于$z=($y或$x)。
这就是为什么在使用OR运算符的表达式周围没有显式括号的情况下,永远不应该使用OR运算符。
JavaScript开发人员注意:
在PHP中,空数组求值为false,而在JavaScript中,空阵列求值为true。
在PHP中,可以将空数组测试为<?php if(!$stuff);?>这在需要测试数组长度的JavaScript中不起作用。
这是因为在JavaScript中,数组是一个对象,虽然它可能没有任何元素,但它仍然被视为某种东西。
对于经常在两种语言中工作的年轻球员来说,这只是一个陷阱。