前言
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來取字符串的內容,所以實現了二進制安全。