每天一個 PHP 語法二字串使用及內部結構

ifelse發表於2020-04-13

說明

這裡基於php7.2.5進行測試,php7之後內部結構變化應該不是太大,但與php5.X有差別。

程式碼

基於上一篇我們說的變數的宣告與使用我們這次說一下字串及實現

$a = "hello";

我們說zend_value.str結構用來儲存字串,具體到內部的結構就是zend_string

struct _zend_string {
    zend_refcounted_h gc; /*引用計數 用於垃圾回收*/
    zend_ulong        h;                /* hash value */
    size_t            len; /* 字串長度 */
    char              val[1]; /* 值 hello  */
};

這裡我們只關注len與val。len用來儲存字串長度,val用來儲存值, val是char型別的陣列,char是字元型別,長度是1個位元組,儲存單個字元。

這裡len的好處我們可以直接獲取字串的長度,如strlen($a) , 我們後面再說這個函式。

字串在C語言中並不是內建型別,他其實是字元陣列。C語言中宣告字串

#include <stdio.h>
#include<string.h>

int main()
{

    char hello[] = "hs";

  printf("%s \n", hello);

   return 0;
}

C語言的字串沒有儲存長度,它是以null為終止符的,也就是遇到’\0’字元就認為是結束了。

我們對比下,C與PHP中獲取字串長度的區別。

#include <stdio.h>
#include<string.h>

int main()
{

    char hello[] = "h\0s";
    char hello1[] = "hs";
    int len,len1;

    len = strlen(hello);
    printf("hello長度 %d \n", len); // 1 因為遇到\0就終止了
    len1 = strlen(hello1);
    printf("hello1長度 %d \n", len1); //2

   return 0;
}
gcc helloword.c -o helloword
./helloword

hello長度 1
hello1長度 2

PHP

echo strlen("h\0s");
echo PHP_EOL;
echo strlen("hs");

echo PHP_EOL;
php hello.php

3
2

可以看到zend_string的len是很便捷的、很安全的。

總結

php透過zend_string儲存字串,其中len存放字串長度,val存放值。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章