作为包含一个字符的字符串,“ 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"在布尔上下文中是真实的,但等于0under ==。因此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()语句这样的控制结构中也是如此。