用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程序员的通病),会产生一些问题,甚至导致安全漏洞。最后,还是那句说得很烦很烦的话,对外来数据进行严格检查和过滤。
相关推荐
-
PHP学习 运算符与运算符优先级
算术运算符 运算符 名称 结果 $a + $b 加法 $a 和 $b 的和 $a - $b 减法 $a 和 $b 的差 $a * $b 乘法 $a 和 $b 的积 $a / $b 除法 $a 除以 $b 的商 $a % $b 取模 $a 除以 $b 的余数 递增/递减运算符 运算符 名称 结果 ++$a 前加 $a 的值
-
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 $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运算以上代码最后得到的结
-
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常用特殊运算符号和函数总结(php新手入门必看)
注解符号: // 单行注解 多行注解引号的使用 ' ' 单引号,简单字符串,不经任何处理直接拿过来; " "双引号,php动态处理然后输出,一般用于处理$变量.布尔变量: 一种是true 即 真的; 另一种是false 即假的常见变量: string 字串(数字\汉字\等等) integer
-
php && 逻辑与运算符使用说明
例子:!defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); o(︶︿︶)o 唉,很晕,今天问了N多的人.终于把"&&"东西给弄明白怎么回事了 运算符都没有判断就那样写什么意思,哎,原来如果前面的为假.后面的语句就不执行了.免得我们还费劲的写if 这样多简单... //简单说明,如果前面的判断为假后面的则不执行,如果是真,继续执行下面的定义常量
-
PHP字符串 ==比较运算符的副作用
复制代码 代码如下: $a = '212345678912000005'; $b = '212345678912000001'; var_dump($a == $b); 这段代码的输出是bool(true), 说明这样判断会得出结论是两者相等. 类似的特性在in_array()函数第3个参数为false或者不设置的情况. 原因是首先判断字符串是否是数字, 然后转换成long或者double(C语言数据类型)再判断 - 使用zendi_smart_strcmp. 但是, 源码中的注释说声明考虑了溢
-
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合并数组array_merge函数运算符加号与的区别
array_merge在参考手册中的说明如下: array_merge() 将两个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面.返回作为结果的数组. 如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值.然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面. 两个的区别是: 1.数组键名为数字键名时,要合并的两个数组中有同名数字KEY的时候,使用array_merge()不会覆盖掉原来的值,而使用"+"合并数组则会把最先出现的值作为最终
-
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
随机推荐
- "在试着设置任务帐户信息时出现错误,指定的错误是:0x80070005:拒绝访问
- Java生成和解析XML格式文件和字符串的实例代码
- Asp.Net性能优化技巧汇总
- python开发中module模块用法实例分析
- Android自定义View仿QQ等级天数进度
- mysql对binlog的处理说明
- MySQL运行状况查询方式介绍
- 配置RD9中的DNS
- JQuery中DOM加载与事件执行实例分析
- AS3 navigateToURL导致ExternalInterface 执行失败问题
- JavaScript sub方法入门实例(把字符串显示为下标)
- 深入解析JavaScript中的arguments对象
- innertext , insertadjacentelement , insertadjacenthtml , insertadjacenttext 等区别
- 图片友情链接滚动 横向,带控制按钮
- Android中获取设备的各种信息总结
- 解析C#中不一样的大小写转换
- asp.net中的窗体身份验证(最简单篇)
- Android实现IP地址输入框的方法示例代码
- selenium+python实现1688网站验证码图片的截取功能
- 基于vue如何发布一个npm包的方法步骤