PHP细节,PHP手册中常见的一句话:该函数是二进制安全的
以下内容转自 http://wuxinjie.github.io/php-02/
在看PHP手册的时候,经常看到一句话”该函数是二进制安全的”。
- 二进制安全是什么呢?
- 他是如何实现的?
二进制安全是什么?
先看一段代码:
1 <?php 2 $string1 = "Hello"; 3 $string2 = "Hello\0Hello"; 4 echo strcoll($string1, $string2); /*返回0, 由于是非二进制安全,误判为相等 */ 5 echo strcmp($string1, $string2); /*返回<0,不相等*/ 6 ?>
这是为什么呢?PHP是基于C实现的,PHP代码都会被zend引擎编译成opcode,最终作为C语言去执行。 而对于c语言‘\0’是字符串的结束符,它读到’\0’就会默认字符读取已经结束,从而抛掉后面的字符串。
1 //这里是C语言哦! 2 main(){ 3 char ab[] = "Hello"; 4 char ac[] = "Hello\0Hello"; 5 strcmp(ab, ac); /*返回0, 由于是非二进制安全,误判为相等 */ 6 }
有一个二进制安全的定义,我挺喜欢的:
程序不会对其中的数据做任何限制、过滤、或者假设 —— 数据在写入时是什么样的, 它被读取时就是什么样。
PHP是如何实现二进制安全的?
那么,既然PHP是基于C实现的,C 字符串类型不是二进制安全的,PHP又是如何实现的呢?这就是数据结构的功劳了。 PHP的内核中,是如此定义字符串类型的。
1 struct{ 2 char *val; 3 int len; 4 } str;
val是指向字符串内存的指针,len表示该字符串的长度,无论是否遇到“\0”字符,C都按照len长度读取该字符串。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构