說明
這裡基於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 協議》,轉載必須註明作者和本文連結