用PHP中的 == 运算符进行字符串比较

最近在Greg Beaver's的blog上发表的一篇新文章 comparing strings in PHP with the == operator 中提及了PHP的 == 运算符在对字符串进行比较时值得注意的问题。

  在某些情况下,PHP会把类数值数据(如含有数字的字符串等)转换成数值处理,== 运算符就是其中之一。在使用 == 运算符对两个字符串进行松散比较时,PHP会把类数值的字符串转换为数值进行比较,下面的实验证实了这个结论:

<?php
var_dump('01' == 1);
?>

以上代码输出结果为:
bool(true)

  所以,在使用对字符串进行比较时,建议使用 === 运算符对字符串进行严格的检查,或使用strcmp()等函数,从而避免可能产生的问题。PHP手册中的《PHP 类型比较表》对此也有详细说明。

  除此之外,常用的in_array()函数也存在弱类型的问题,见如下代码:

<?php
var_dump(in_array('01', array('1')));
?>

以上代码输出结果为:
bool(true)

  相信用过该函数进行安全性检查的PHP编程人员都知道这会产生怎么样的安全问题了吧?幸好in_array()函数为我们提供了第三个参数,把它设为 true 就可以打开in_array()函数的强制类型检查机制,如下代码所示:

<?php
var_dump(in_array('01', array('1'), true));
?>

输出结果为:
bool(false)

  由于PHP是一种弱类型的语言,也就是说数据类型这个概念在PHP中被弱化。因而如果在编程时过分忽略数据类型(也是大部份PHP程序员的通病),会产生一些问题,甚至导致安全漏洞。最后,还是那句说得很烦很烦的话,对外来数据进行严格检查和过滤。

(0)

相关推荐

  • php合并数组array_merge函数运算符加号与的区别

    array_merge在参考手册中的说明如下: array_merge() 将两个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组. 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值.然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面. 两个的区别是: 1.数组键名为数字键名时,要合并的两个数组中有同名数字KEY的时候,使用array_merge()不会覆盖掉原来的值,而使用"+"合并数组则会把最先出现的值作为最终

  • php && 逻辑与运算符使用说明

    例子:!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); o(︶︿︶)o 唉,很晕,今天问了N多的人.终于把"&&"东西给弄明白怎么回事了 运算符都没有判断就那样写什么意思,哎,原来如果前面的为假.后面的语句就不执行了.免得我们还费劲的写if 这样多简单... //简单说明,如果前面的判断为假后面的则不执行,如果是真,继续执行下面的定义常量

  • php 运算符与表达式详细介绍

    php 运算符与表达式 一.运算符的分类 1.按操作数分类 1.!true // 一元运算符 2.$a+$b // 二元运算符 3.true ? 1:0 // 三元运算符 2.按操功能分类 (1)算术运算符 1.+.-.x./.%(取余) (2)字符串运算符 1..  // 例如:$a = 'abc'.'efg'; (3)赋值运算符 1.= // 简单赋值 2.+=.-=.X=./=.%=..= // 复合赋值 3.++($a++.++$a). --($a--.--$a) // 递增递减 4.&

  • php中的三元运算符使用说明

    今天一个网友在群里发了个题目不难,但是可能会错 复制代码 代码如下: echo $a == 1 ? 'one' : $a == 2 ? 'two' : $a == 3 ? 'three' : $a == 4 ? 'foura' : 'other'; echo "\n"; 输出结果是: <BR> 结果是:four 一开始想不明白,按照我的理解,应该是这样的逻辑: echo ($a == 1 ? 'one' : ( $a == 2 ? 'two' : ( $a == 3 ? '

  • php下使用strpos需要注意 === 运算符

    复制代码 代码如下: <?php /* 判断字符串是否存在的函数 */ function strexists($haystack, $needle) { return !(strpos($haystack, $needle) === FALSE);//注意这里的"===" } /* Test */ $mystring = 'abc'; $findme = 'a'; $pos = strpos($mystring, $findme); // Note our use of ===.

  • PHP常用特殊运算符号和函数总结(php新手入门必看)

    注解符号:         // 单行注解                 多行注解引号的使用         '   ' 单引号,简单字符串,不经任何处理直接拿过来;         " "双引号,php动态处理然后输出,一般用于处理$变量.布尔变量:             一种是true 即 真的;         另一种是false 即假的常见变量:            string          字串(数字\汉字\等等)         integer        

  • php三元运算符知识汇总

    今天在改论文在线的时候遇到了一个语句看不懂: $if_summary = $row['IF_SUMMARY']==2?'是':'否'; 后来百度后发现是PHP的三元运算符 这句话的意思就等于是 if($row['IF_SUMMARY']==2){ $if_summary="是"; }else{ $if_summary="否": } 三元运算符的功能与"if...else"流程语句一致,它在一行中书写,代码非常精练.执行效率更高. 在PHP程序中恰

  • PHP 作用域解析运算符(::)

    Scope Resolution Operator (::) 今天 看joomla源码的时候,才意识到.原来这个操作符还可以访问类的非静态方法啊.真的让我吃惊不好.一直以为作用域解析运算符只能访问类的static方法和static成员变量. 如果各位不相信,下面有个简单的小测试代码可以证明这个. 复制代码 代码如下: class A{ private $_name = 'A'; function __construct(){ echo 'A construct <br />'; } funct

  • php foreach 使用&(与运算符)引用赋值要注意的问题

    foreach 通过在 $value 之前加上 & 很容易就能修改数组的单元,如: PHP代码 复制代码 代码如下: foreach($arr as $value){ $value .= '4'; } 但这个用法也很容易造成错误,而且也不容易找. 看例子更直截了当: PHP代码 复制代码 代码如下: <?php $arr = array('a','b','c'); $arr2 = array('d', 'e', 'f'); foreach($arr as $value){//习惯用$valu

  • PHP字符串 ==比较运算符的副作用

    复制代码 代码如下: $a = '212345678912000005'; $b = '212345678912000001'; var_dump($a == $b); 这段代码的输出是bool(true), 说明这样判断会得出结论是两者相等. 类似的特性在in_array()函数第3个参数为false或者不设置的情况. 原因是首先判断字符串是否是数字, 然后转换成long或者double(C语言数据类型)再判断 - 使用zendi_smart_strcmp. 但是, 源码中的注释说声明考虑了溢

  • PHP学习 运算符与运算符优先级

    算术运算符   运算符      名称    结果               $a + $b      加法    $a 和 $b 的和   $a - $b      减法    $a 和 $b 的差   $a * $b      乘法    $a 和 $b 的积   $a / $b      除法    $a 除以 $b 的商   $a % $b      取模    $a 除以 $b 的余数 递增/递减运算符   运算符    名称       结果   ++$a   前加   $a 的值

  • PHP三元运算符的结合性介绍

    先看一个三元运算式子: 复制代码 代码如下: <?php $a=1;$b=2;$c=3;$d=4; echo $a<$b?'xx':$a<$c?'yy':$a<$d?'zz':'oo'; ?> 一般按照其它语言(比如C或Java)的规则, 以上代码的运算逻辑是: 复制代码 代码如下: $a<$b => true => 'xx' ==> 结束 那么最后得到的结果就是'xx', 而再往后的运算都会被无视. 然而令人吃惊的是, php运算以上代码最后得到的结

随机推荐