免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 2960 | 回复: 14

[小心陷阱]"nothing" == 0 [复制链接]

论坛徽章:
0
发表于 2009-07-29 17:52 |显示全部楼层
PHP 引入 === 真是好啊。要不然的话,

<?php
var_dump('nothing' == 0);
var_dump('something' == 0);
var_dump('anything' == 0);
?>


为了安全和效率,推荐能使用 === 的地方,都使用 ===。
在 switch 中更容易出问题:

<?php
$var = 0;
switch ($var) {
&nbsp;&nbsp;&nbsp;&nbsp;case 'something':
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo 'something';
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
}

$var = 'something';
switch ($var) {
&nbsp;&nbsp;&nbsp;&nbsp;case 0:
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;echo 0;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
}
?>


自动类型转换并不总是好的啊。

评分

参与人数 1可用积分 +5 收起 理由
bs + 5 原创内容

查看全部评分

论坛徽章:
3
金牛座
日期:2013-10-12 15:42:452015年辞旧岁徽章
日期:2015-03-03 16:54:15IT运维版块每日发帖之星
日期:2016-06-01 06:20:00
发表于 2009-07-29 18:28 |显示全部楼层
不同类型就不要比较了,或者先测试类型再比较

论坛徽章:
0
发表于 2009-07-29 18:39 |显示全部楼层
原帖由 flynetcn 于 2009-7-29 18:28 发表
不同类型就不要比较了,或者先测试类型再比较


MySQL 得到的 result 和 $_GET/_POST 回来的可都是字符串。测试类型再比较还不如用 === 呢。

论坛徽章:
0
发表于 2009-07-30 11:09 |显示全部楼层
MySQL还是有区别字符和数值的,甚至严重影响查询性能

论坛徽章:
0
发表于 2009-07-30 11:28 |显示全部楼层
对于弱类型的语言来说,的确得注意这个问题,PHP好多面试题一般会考这个

论坛徽章:
0
发表于 2009-07-30 15:42 |显示全部楼层
原帖由 bs 于 2009-7-30 11:09 发表
MySQL还是有区别字符和数值的,甚至严重影响查询性能


我的意思是,从 mysql_fetch_array 取回来的值,不管在 MySQL 内部定义的是数字型还是字符型,在 PHP 中得到的都会是 string。这个除非 cast 一下,否则是不可避免的。
谢谢加分。

论坛徽章:
0
发表于 2009-07-30 17:56 |显示全部楼层
原帖由 dz902 于 2009-7-30 15:42 发表


我的意思是,从 mysql_fetch_array 取回来的值,不管在 MySQL 内部定义的是数字型还是字符型,在 PHP 中得到的都会是 string。这个除非 cast 一下,否则是不可避免的。
谢谢加分。



最近很经常看错表述,不好意思

论坛徽章:
0
发表于 2009-07-30 18:11 |显示全部楼层
原帖由 bs 于 2009-7-30 17:56 发表



最近很经常看错表述,不好意思


没关系~

论坛徽章:
3
金牛座
日期:2013-10-12 15:42:452015年辞旧岁徽章
日期:2015-03-03 16:54:15IT运维版块每日发帖之星
日期:2016-06-01 06:20:00
发表于 2009-07-30 21:26 |显示全部楼层
我觉得这是一个编程习惯的问题。
对两个值进行比较,首先比较类型再比较具体值。
===符可能是php特有的吧?如果只想用php,而且用php有特色的语言特征,只要保证不出错,纯属个人喜好问题。
如果更换语言呢?记得乔版说过php很难让程序员养成一个好的编程习惯,可能就是因为语言太散太灵活。
另外===符,它实际上做了什麽呢?
-------------------
$a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同。(PHP 4 引进)
-------------------
我个人还是觉得自己测试类型再比较值,放心,个人喜好而已。

论坛徽章:
0
发表于 2009-07-30 22:17 |显示全部楼层
还有 JavaScript,也有 ===。

使用 PHP 或者其他动态语言的原因,就是因为很方便,不用什么东西都手动定义类型。虽然偶尔 PHP 的自动转换会造成问题,也不能因噎废食,把动态语言的优势给抹掉了。

「PHP 因为太散太灵活而让人难以养成好的习惯」,这个我不同意。我认为一些初级的 PHP 容易出现的错误在于 PHP 像保姆一样弄好了 register_globals 还有 magic_quotes,但是这些现在默认都是关闭的了,而且将在 PHP6 的时候给移除。并且,养不成好的习惯,应该责备的不是语言。

总的说来,测试类型再比较值,这个做法,在本主题讨论的这个问题中,有两个不可取之处:

第一,这个回帖开头说过了,动态语言的好处,都抹杀了。想象如果每次比较都要


  1. gettype($a) == gettype($b) && $a == $b
复制代码


那为啥还用动态语言呢?这样的效率也低,而且意图并不明显。因为静态语言不需要这样对比类型,那是自动的,而动态语言并不应该这样用。

第二,我回你二楼的帖子的时候说了,像 MySQL 的 result 和 $_GET/_POST 这样的东西,你是无法控制它的类型的,它永远是 string。

我觉得每个语言有每个语言的不同,各有各的优点,一个好的 coder 应该根据这个语言的优点养成适合这个语言的习惯,而不是去找所有语言想通的东西。因为每个语言必然有自己与众不同的地方,如果总是考虑「换语言」的情况就不去使用,那么 PHPer 可能应该避免使用 OOP,因为换语言换到 C 了怎么办?也应该避免什么 interface 啊一类的,因为换到 Ruby 就没这个功能了。我觉得,用好一个语言,掌握它好的东西,避免容易造成 bug 的东西,就是好的编程习惯。毕竟 coder 是一个技术工种,以语言为工具,而不是要去追究那个「道」。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP