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

2022-10-11 21:30:52 118 0
魁首哥

说明

这里基于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  
#include
 
int main()
{
	
	char hello[] = "hs";

  printf("%s \n", hello);
	
   return 0;
}  

C语言的字符串没有存储长度,它是以null为终止符的,也就是遇到’\0’字符就认为是结束了。

我们对比下,C与PHP中获取字符串长度的区别。

 #include 
#include
 
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存放值。

收藏
分享
海报
0 条评论
118
上一篇:利用Pocsuite3进行远程漏洞测试​ 下一篇:php手把手教你做网站(二十四)jquery ajax上传大的附件

本站已关闭游客评论,请登录或者注册后再评论吧~

忘记密码?

图形验证码