每天一个 PHP 语法二字符串使用及内部结构

说明

这里基于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 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!