执行上面的代码看看,你想说什么?
我是惊出了冷汗的
in_array常被老手们这样用做变量检查,但显然结果并不靠谱。
为什么会这样呢?再试试这个
问题似乎是PHP的默认类型转换造成的,数字与字符串比较时,字符串先被强制转成数字再进行了比较。真的是这个原因吗?爱较真的朋友请自行查看PHP源码,没准你还会发现其他问题。
其实in_array提供有第三个参数(默认为false),用于执行严格的类型检查,避免这个问题只需将其设置为true,但不是每个人都留意使用。搜了一下WordPress源码中使用 in_array 263处,许多关键处都使用了第三个参数,看来自己离老手还差得远那。
多少要埋怨一下,为什么不把第三个参数默认为true呢,这也太容易让人犯猎了。想想原因也很简单,为了保持PHP在类型处理上的一致性,就是让像下面的代码结果与你的期望一致。
最后想说的是,这不构成对PHP弱类型诟病的理由,这是WEB开发的特点确定的,如果让代码中充斥大量类型检查和类型转换会更让人难以忍受,让使用PHP的开发者有大刀阔斧、畅快淋漓的快感,是我喜欢PHP的原因之一。
但缺点确实是存在的,解决方案已经给出,本例中你可以在需要时为in_array设置第三个参数,或者使用另一个函数array_search。
打出”安全漏洞“的题目,标题党一回了,给新手也给自己提个醒。