PHP7的二進制安全

PHP是如何實現二進制安全的?

前言

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章