PHP字符串比较

2023-05-16

我们在代码中用的最多的逻辑是什么?

你知道如下的几段代码的布尔结果分别是什么么?

var_dump("1" == "1e0");
var_dump("1" == "0x1");
var_dump("20" == "2e1");
var_dump("10" == "  0x0a");
等等;
对, 也许你会说在PHP手册的附录中有一部分关于这个问题的总结. 问题是,这只是知其然, 那么所以然是什么呢?
今天就有一个网友问了我一个问题:

var_dump("1" == "1e0");  //true
var_dump("1" == "1ef"); //false
这两个的结果为什么不一样啊.
也就是说, 上面的等式a要成立, 那么唯一的解释就是PHP讲他们双发都当作int来比较.
但是, var_dump(“1e0″),或者var_dump(“1″),都是string啊.

那么, 到底PHP是怎么决定相比较的俩者的类型的呢?
还是老办法, 先从zend_language_scanner.l中找到==的opcode码 结果是T_IS_EQUAL
然后在zend_language_parse.y中找到编译器看到T_IS_EQUAL会做什么:

expr T_IS_EQUAL expr            { zend_do_binary_op(ZEND_IS_EQUAL, &$$, &$1, &$3 TSRMLS_CC); }
那么接下就去zend_vm_def.h中寻找当ZE遇到ZEND_IS_EQUAL会做什么:

ZEND_VM_HANDLER(17, ZEND_IS_EQUAL, CONST|TMP|VAR|CV, CONST|TMP|VAR|CV)
     {
          zend_op *opline = EX(opline);
          zend_free_op free_op1, free_op2;
 
          is_equal_function(&EX_T(opline->result.u.var).tmp_var,
               GET_OP1_ZVAL_PTR(BP_VAR_R),
               GET_OP2_ZVAL_PTR(BP_VAR_R) TSRMLS_CC);
          FREE_OP1();
          FREE_OP2();
          ZEND_VM_NEXT_OPCODE();
     }
哦, 看来不是, 还要进一步查看compare_function

代码太长, 不贴了. 在compare_function中, 当俩个比较操作数都是string的时候,会调用zendi_smart_strcmp:

if (op1->type == IS_STRING && op2->type == IS_STRING) {
        zendi_smart_strcmp(result, op1, op2);
        COMPARE_RETURN_AND_FREE(SUCCESS);
    }

而在zendi_smart_strcmp中, 对于俩个字符串, 会首先判断他们是否是numeric_string, 如果是,那么就会转换成整形来比较..

那么什么是numeric string呢? 因为PHP不区分类型, 所以她采用一个策略, 当你的变量看起来是一个数字的时候, 那么她就认为这个变量是一个数字.
简单来说, numeric_string就是表示数字的字符串:
也就是说,如下的比较结果都是真:

var_dump("1" == "1e0");
var_dump("1" == "0x1");
var_dump("20" == "2e1");
var_dump("10" == "  0x0a");
呵呵, 读者们遇到过这个问题的困扰么?
if("608E-4234" == "272E-3063"){
	echo "oh shit! they're equal!\n";
}else{
	echo "obviously, isn't?\n";
}

PHP开发Tips:如果想要判断两个字符串是否相等,使用 === 而不是 ==。


作者: Laruence

本文地址: http://www.laruence.com/2009/02/21/662.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP字符串比较 的相关文章

  • php利用curl实现多进程下载文件类

    批量下载文件一般使用循环的方式 xff0c 逐一执行下载 但在带宽与服务器性能允许的情况下 xff0c 使用多进程进行下载可以大大提高下载的效率 本文介绍php利用curl的多进程请求方法 xff0c 实现多进程同时下载文件 原理 xff1
  • Linux 使用getopts命令获取命令行参数

    Linux getopts命令用于获取命令行中的参数 调用格式 xff1a span class hljs built in getopts span option string variable 参数说明 xff1a option str
  • mysql表数据行列转换方法

    开发过程中 xff0c 因为历史原因或性能原因 xff0c 需要对表的列数据转为行数据 xff0c 或行数据转换为列数据使用 xff0c 本文将介绍mysql表数据行列转换的方法 xff0c 提供完整演示例子及sql技巧 1 行转列 创建测
  • 关于在vue3中使用setup语法糖后设置name的问题

    当我们不使用setup语法糖时 xff0c 我们可以以上形式设置name span class token operator lt span script lang span class token operator 61 span spa
  • 查看mysql数据库大小、表大小和最后修改时间

    1 查看数据库表基本信息 select from information schema TABLES where information schema TABLES TABLE SCHEMA 61 39 数据库名 39 and inform
  • JS小游戏-象棋暗棋

    游戏图片 xff1a 源文件下載地址 xff1a 点击下载源文件 Javascript 部分 xff1a chinese chess Author fdipzone Date 2012 06 24 Ver 1 0 var gameimg 6
  • nginx快速查看配置文件的方法

    nginx的配置放在nginx conf文件中 xff0c 一般我们可以使用以下命令查看服务器中存在的nginx conf文件 locate nginx conf usr local etc nginx nginx conf usr loc
  • JS小游戏-极速快跑

    游戏图片 xff1a 源文件下载地址 xff1a 点击下载 Javascript部分 xff1a 极速快跑 Author fdipzone Date 2012 07 15 Ver 1 0 var gameimg 61 39 images s
  • php 日志类

    使用php开发的日志处理类 xff0c 本类可自定义多种日志配置 xff0c 根据标签对应配置 代码中方便调用此类进行日志记录操作 提供完整代码及演示例子 xff0c 方便大家学习使用 功能 xff1a 1 自定义日志根目录及日志文件名称
  • Mac OSX使用brew安装旧版本phpunit的方法

    brew又称Homebrew xff0c 是Mac OSX系统的软件包管理工具 xff0c 能在Mac中方便安装或卸载软件 xff0c 类似ubuntu系统的apt get功能 常用命令如下 xff1a 安装软件 brew install
  • Linux shell计算两个文件的交集,并集和差集

    本文介绍linux下shell计算两个文件的交集 xff0c 并集和差集的方法 xff0c 提供完整测试命令与演示 测试文件 a txt span class hljs operator a span c span class hljs n
  • redis中事务(Transaction)的使用

    Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 xff0c 提供多种语言的API xff0c 支持多种数据存储方式 开发中一般用于缓存 xff0c 队列 xff0c 数据库使
  • Linux 删除文件中空行的方法

    开发过程中 xff0c 源数据文件内可能存在空行 xff0c 为了能更好地使用 xff0c 需要把文件中的空行删除掉 xff0c 对于行中只含有空格或tab的内容 xff0c 可根据需求确定是否作为空行处理 1 文件空行不含空格与tab的处
  • php 基于redis计数器类

    Redis是一个开源的使用ANSI C语言编写 支持网络 可基于内存亦可持久化的日志型 Key Value数据库 xff0c 并提供多种语言的API 本文将使用其incr 自增 xff0c get 获取 xff0c delete 清除 方法
  • (入门)python的基本输入和输出

    今天主要为大家详细介绍了python的基本输入和输出 xff0c 文中示例代码介绍的非常详细 xff0c 具有一定的参考价值 xff0c 这也是我们学习python最基本的一步 想要了解更多关于python知识的 xff0c 请点击这个 目
  • MongoDB 集合字段匹配查询方法

    MongoDB是基于分布式文件存储的数据库 xff0c 本文将介绍如何对MongoDB记录中集合字段进行匹配查询 1 创建测试数据库 use testdb db span class hljs preprocessor createUser
  • JS获取访问设备信息的方法

    本文将介绍获取访问网页设备的基本信息的方法 xff0c 提供完整代码及例子 xff0c 方便大家使用 1 获取访问者IP及所在地 span class hljs doctype lt DOCTYPE HTML PUBLIC 34 W3C D
  • mysql在终端执行sql并把结果写入文件的方法

    在终端使用mysql执行语句时 xff0c 我们一般先进入mysql xff0c 然后再在里面执行sql语句 例如 xff1a mysql uroot mysql gt use mydb mysql gt select from user
  • curl使用实例

    本文将介绍curl的使用 xff0c 根据常用的场景 xff0c 提供调用curl实现请求的演示代码及服务端代码 xff0c 方便大家学习使用 1 查看网页源码 curl命令后加网址 xff0c 就可以看到网页源码 curl www spa
  • mysql比对两个数据库表结构的方法

    在开发及调试的过程中 xff0c 需要比对新旧代码的差异 xff0c 我们可以使用git svn等版本控制工具进行比对 而不同版本的数据库表结构也存在差异 xff0c 我们同样需要比对差异及获取更新结构的sql语句 例如同一套代码 xff0

随机推荐

  • shell 去除utf8文件中bom头的方法

    本文介绍使用shell命令 xff0c 批量去除utf8文件中bom头的方法 utf8的bom头由 xEF xBB xBF组成 xff0c 带bom的文件在使用过程中 xff0c 某些软件打开会出现乱码等异常 xff0c 而要把文件重新另存
  • mysql binlog的使用

    本文介绍mysql binlog的使用 xff0c 包括开启 xff0c 关闭 xff0c 查看状态 xff0c 刷新 xff0c 清空 xff0c 查看执行的sql语句等操作 并对5 7及旧版本的设置加以说明 xff0c 方便大家学习 m
  • 阿里云RDS导出数据库结构整理工具

    本文使用shell实现一个小工具 xff0c 可以整理阿里云RDS导出数据库结构的zip文件 xff0c 整理为可直接使用的sql文件 阿里云RDS导出的数据库结构sql需要整理的地方 1 解压后sql文件名称缺少数据库名称标识 阿里云RD
  • 几种极其隐蔽的XSS注入的防护

    XSS注入的本质就是 某网页中根据用户的输入 不期待地生成了可执行的js代码 并且js得到了浏览器的执行 意思是说 发给浏览器的字符串中 包含了一段非法的js代码 而这段代码跟用户的输入有关 常见的XSS注入防护 可以通过简单的 htmls
  • CSS和JS标签style属性对照表

    盒子标签和属性对照 CSS语法 xff08 不区分大小写 xff09 JavaS cript语法 xff08 区分大小写 xff09 border border border bottom borderBottom border botto
  • 反复安装anaconda3始终出现kernel error连接错误

    jupyter notebook添加kernel 转 xff1a https blog csdn net u012151283 article details 54565467 pip install 参数 安装指定源pip install
  • php 基于redis使用令牌桶算法实现流量控制

    本文介绍php基于redis xff0c 使用令牌桶算法 xff0c 实现访问流量的控制 xff0c 提供完整算法说明及演示实例 xff0c 方便大家学习使用 每当国内长假期或重要节日时 xff0c 国内的景区或地铁都会人山人海 xff0c
  • Redis主从同步,读写分离设置

    本文介绍使用Redis的主从同步功能 master slave xff0c 使程序实现读写分离 xff0c 避免io瓶颈 xff0c 提高数据读写效率 Redis支持一个master服务器对多个slave服务器同步 xff0c 同步使用发布
  • 终端出现 You have new mail.的解决方法

    打开一个新的终端窗口 xff0c 第一句会出现You have new mail 提示 出现这种情况的原因 xff0c 因为系统出现错误 xff08 例如cron出现权限问题等 xff09 需要邮件通知用户 系统会将检查的各种状态汇总 xf
  • php 创建带logo二维码类

    本文介绍php实现创建二维码类 xff0c 支持设置尺寸 xff0c 加入LOGO xff0c 描边 圆角 透明度 xff0c 等处理 提供完整代码 xff0c 演示实例及详细参数说明 xff0c 方便大家学习使用 实现功能如下 xff1a
  • Mac ssh使用pem文件登录远程服务器

    登录远程服务器我们可以使用ssh命令 xff0c 部分远程服务器访问需要授权 xff0c ssh命令支持使用pem文件进行授权访问 命令如下 xff1a ssh i identity file user span class hljs va
  • mysql重建表分区并保留数据的方法

    本文介绍mysql重建表分区并保留数据的方法 xff0c mysql的表分区 partition 可以把一个表的记录分开多个区去存储 xff0c 查询时可根据查询的条件在对应的分区搜寻 xff0c 而不需要整表查询 xff0c 提高查询效率
  • php json_encode不支持对象私有属性的解决方法

    本文介绍php json encode不支持对象私有属性的解决方法 xff0c json encode可以把对象转为json格式 xff0c 使用json decode可以还原为对象 但如果对象内含有私有属性 xff0c 执行json en
  • Sublime Text 2 介紹

    代码编辑器或者文本编辑器 xff0c 对于程序员来说 xff0c 就像剑与战士一样 xff0c 谁都想拥有一把可以随心驾驭且锋利无比的宝剑 xff0c 而每一位程序员 xff0c 同样会去追求最适合自己的强大 灵活的编辑器 xff0c 相信
  • PHP生成唯一RequestID类

    本文介绍PHP生成唯一RequestID类 xff0c 使用session create id 与uniqid 方法 xff0c 保证唯一性 xff0c 提供完整代码及演示 xff0c 方便大家学习使用 现在的系统设计一般使用分布式系统 x
  • php生成QRcode

    lt php ini set 39 display errors 39 39 on 39 PNG TEMP DIR 61 dirname FILE DIRECTORY SEPARATOR 39 temp 39 DIRECTORY SEPAR
  • C语言--函数

    C语言中include头文件的语法 xff1a include lt stdio h gt xff0c 先从系统include文件中寻找 xff0c 再去项目include中寻找 xff1b include 34 my h 34 xff0c
  • JS获取CSS属性值

    lt DOCTYPE HTML PUBLIC 34 W3C DTD HTML 4 01 Transitional EN 34 34 http www w3 org TR html4 loose dtd 34 gt lt html gt lt
  • JS判断碰撞方法

    JS判断碰撞方法 判断是否碰撞 64 param obj 原对象 64 param dobj 目标对象 function impact obj dobj var o 61 x getDefaultStyle obj 39 left 39 y
  • PHP字符串比较

    我们在代码中用的最多的逻辑是什么 你知道如下的几段代码的布尔结果分别是什么么 var dump 34 1 34 61 61 34 1e0 34 var dump 34 1 34 61 61 34 0x1 34 var dump 34 20