php手册经常见到,什么是“二进制安全”?

在看PHP手册的时候,经常看到一句话”该函数是二进制安全的”。

  • 二进制安全是什么呢?
  • 他是如何实现的?

二进制安全是什么?

先看一段代码:

<?php
$string1 = "Hello"; 
$string2 = "Hello\0Hello"; 
echo strcoll($string1, $string2); /*返回0, 由于是非二进制安全,误判为相等 */
echo strcmp($string1, $string2);  /*返回<0,不相等*/
?>

这是为什么呢?PHP是基于C实现的,PHP代码都会被zend引擎编译成opcode,最终作为C语言去执行。 而对于c语言‘\0’是字符串的结束符,它读到’\0’就会默认字符读取已经结束,从而抛掉后面的字符串。

main(){  
    char ab[] = "Hello";  
    char ac[] = "Hello\0Hello";  
    strcmp(ab, ac); /*返回0, 由于是非二进制安全,误判为相等 */
 }

有一个二进制安全的定义,我挺喜欢的:

程序不会对其中的数据做任何限制、过滤、或者假设 —— 数据在写入时是什么样的, 它被读取时就是什么样。

PHP是如何实现二进制安全的?

那么,既然PHP是基于C实现的,C 字符串类型不是二进制安全的,PHP又是如何实现的呢?这就是数据结构的功劳了。 PHP的内核中,是如此定义字符串类型的

struct{
    char *val;
    int len;
} str;

val是指向字符串内存的指针,len表示该字符串的长度,无论是否遇到“\0”字符,C都按照len长度读取该字符串。

原文链接:http://wuxinjie.github.io/php-02/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值