我偶然发现了一些非常奇怪的PHP代码.有人可以解释为什么会这样吗?*****奖励积分*****如果你能告诉我为什么这是有用的.
<?php
if(0=='a'){
print ord(0)." should NEVER equal ".ord('a')."<br>";
}
if(false==0){
print "false==0<br>";
}
if('a'==false){
print "a==false<br>";
}
?>
Run Code Online (Sandbox Code Playgroud)
结果输出:
48 should NEVER equal 97
false==0
Run Code Online (Sandbox Code Playgroud)
Jam*_*eod 33
在PHP中,'a'不是ASCII字符a,而是字符串a.在数值上下文中,它等于0.例如,intval('a')结果值为0.
这很有用,因为PHP主要用于处理文本,有人可能想尝试测试(123 =='123'),这是真的.并且考虑到单引号(或双引号)中的数字被视为数字,没有数字值的字符串被视为除0以外的任何值都没有意义.
哦,是的,还有一件事.布尔上下文中的'a'为true,而不是false.我相信这使得某些类型的文本处理更加自然,但老实说,我不能在这么晚的时候想到一个例子.
这是弱/动态类型语言的基本原则,称为类型杂耍.在某些情况下,类型将转换为其他类型.将字符串与数字进行比较时,字符串将被转换为数字.将任何内容与布尔值进行比较时,该值将被强制转换为布尔值.
有 有 规则 对于 每个 类型为如何将其铸造成另一种类型或者它如何比较于其他类型.'a'恰好在转换为数字0时转换为(唯一的逻辑选择,真的).要避免此类型转换,请使用等号运算符进行测试==,但不要使用标识运算符进行测试 ===.
正如詹姆斯所指出的那样,这很有用,因为PHP会使用真正数字的字符串进行大量处理.例如,即使值是数字,HTML表单也只提交字符串.它还允许一些非常简洁的代码,例如:
$result = someOperation();
if (!$result) {
// $result may be null, false, 0, '' or array(),
// all of which we're not interested in
error();
}
Run Code Online (Sandbox Code Playgroud)
这也意味着你必须非常小心在什么情况下检查什么,因为一个值可能会意外地转换成其他东西.诚然,'a' == 0本身真的是类型杂耍的陷阱,而不是有用.这是你需要小心和测试的情况之一if (is_numeric($var) && $var == 0).
| 归档时间: |
|
| 查看次数: |
638 次 |
| 最近记录: |