作为包含一个字符的字符串,“ 0”在直观上并不是空的。与其他编程语言不同,为什么将PHP转换为布尔值后将其视为FALSE?
'0'
作为被处理0
的$x + 1
,为什么不应该也被视为0
,因此false
,在if ( $x )
?
作为包含一个字符的字符串,“ 0”在直观上并不是空的。与其他编程语言不同,为什么将PHP转换为布尔值后将其视为FALSE?
'0'
作为被处理0
的$x + 1
,为什么不应该也被视为0
,因此false
,在if ( $x )
?
Answers:
PHP是为与Web请求一起使用而设计的(或者说是经过改进的),在Web请求中,您经常处理字符串输入(URL参数或来自浏览器中表单的POST请求)。这样,它将自动将字符串转换为其他类型。
一个简单的例子就是'1' + '2'
给出3
,而不是错误或'12
'或其他解释。按照相同的逻辑,字符串'0'
可以用作数字0
。
同时,与许多其他语言一样,PHP转换为布尔值时会将某些值视为“虚假”,就像您所说的那样,它们在直观上是“空”的。其中包括数字0
,以及空字符串''
和空数组[]
。在一条if
语句中,表达式显式转换为布尔值,因此if ( 0 )
与相同if ( false )
。
将这两件事放在一起,您会遇到一个难题:一方面,正如您所说的'0'
是一个非空字符串;另一方面,它是一个非空字符串。另一方面,我们说过它可以用作数字0
,即“空”。PHP选择将“零度”比“严谨性”更重要,因此'0'
被认为是“虚假的”。
简而言之:'0' == 0 == false
; 要么(bool)'0' === (bool)(int)'0'
"0"
错误”行为。在Perl中,字符串"0"
和数字之间实际上没有任何可见的区别0
-处理JSON时很烦人,但处理文本数据时却非常直观。这样就不可能使数字0
为假,而字符串"0"
也不为假。PHP和JavaScript借这个设计决定的,而是通过区分串/布尔变量/数字类型,同时还允许隐式转换添加一些混乱(PHP: ,0 == "0 foo"
,0 == false
但"0 foo" == true
:==
没有传递的)
eq
字符串相等性。但是,这并不能避免有损强制转换的非传递性:"0 foo"
在布尔上下文中是真实的,但等于0
under ==
。因此if ( ! $foo ) ..
,$false = (1 == 2); if ( $foo == $false ) ...
不要给出相同的结果。我猜这门语言缺少一个“布尔等式”运算符,该运算符可以始终如一地对待它……
$_POST['id'] == 0
,这可以清楚地表明我们希望将用户输入视为数字。
$false
最终设置为0
;。因此,当您编写时$foo == $false
,Perl不知道您想要布尔比较,而是将其强制转换为int。在PHP中,不会发生这种情况,因为$false
布尔值为false,所以==
将其强制转换为布尔值,结果与!
根据booleans上的PHP文档,它表示:
转换为布尔值时,以下值将被视为
FALSE
...
空字符串和字符串“ 0”
...
除此以外:
其他所有值均视为TRUE(包括任何资源)。
如果您运行:
var_dump((bool) "0");
它将打印:
布尔值(false)
因此,它按预期工作。
要明确回答您的问题:
但是,在大多数情况下,强制转换是不必要的,因为如果操作员,函数或控制结构需要布尔参数,则值将自动转换。
这意味着PHP的“自动广播”会将“ 0”强制转换为整数0,这FALSE
在诸如say if()
语句这样的控制结构中也是如此。