前言
PHP是用C语言开发的,之所以称为解释性语言是因为不会生成可直接执行的程序,PHP代码会被Zend引擎编译成opcode, 最终作为C语言去执行的。
何为二进制安全?
程序在操作二进制数据时, 数据写入时和数据读取时是完全相同的。
c语言二进制不安全
C语言中, '\0’是字符串的结束符,当读到\0
时会停止读取,所以C语言是二进制不安全的。
#include <stdio.h>
int main()
{
char str[] = "Hello\0Hello";
printf("%s\n", str);
return 0;
}
这段代码会输出会截断’\0’后的字符串, 之后输出Hello。
PHP是二进制安全的
<?php
$s1 = "Hello\0s1";
$s2 = "Hello\0s2";
var_dump(strcmp($s1, $s2));
scrmp为字符串比较函数,输出-1表示这两个字符串不相等。
在php7中是如何实现二进制安全的
php7中的zend_string结构体如下:
struct _zend_string {
zend_refcounted_h gc;
zend_ulong h; /* hash value */
size_t len;
char val[1];
};
用字符数组val[]保存字符串内容,用len表示字符串长度。
由于存储了字符串的长度,那么取字符串不再用’\0’来判断字符串的末尾,而是通过长度len来取字符串的内容,所以实现了二进制安全。