PHP内核探索之变量(7)- 不平凡的字符串
切,一个字符串有什么好研究的。
别这么说,看过《平凡的世界》么,平凡的字符串也可以有不平凡的故事。试看:
(1) 在C语言中,strlen计算字符串的时间复杂度是?PHP中呢?
(2) 在PHP中,怎样处理多字节字符串?PHP对unicode的支持如何?
同样是字符串,为什么c语言与C++/PHP/Java的均不相同?
数据结构决定算法,这句话一点不假。
那么我们今天就来掰一掰,PHP中的字符串结构,以及相关字符串函数的实现。
一、 字符串基础
字符串可以说是PHP中遇到最多的数据结构之一了(另外一个比较常用的是数组,见PHP内核探索之变量(4)- 数组操作)。而由于PHP语言的特性和应用场景,使得我们日常的很多工作,实际上都是在处理字符串。也正是这个原因,PHP为开发者提供了丰富的字符串操作函数(初步统计约有100个,这个数量相当可观)。那么,在PHP中,字符串是怎样实现的呢?与C语言又有什么区别呢?
1. PHP中字符串的表现形式
在PHP中使用字符串有四种常见的形式:
(1) 双引号
这种形式比较常见:$str=”this is \0 a string”; 而且以双引号包含的字符串中可以包含变量、控制字符等:$str = “this is $name, aha.\n”;
(2) 单引号
单引号包含的字符都被认为是raw的,因此不会解析单引号中的变量,控制字符等:
$string = "test";$str = 'this is $stri<i style="color:transparent">本#文来源gaodai$ma#com搞$$代**码网$</i><button>搞代gaodaima码</button>ng, aha\n';echo $str;
(3) Heredoc
Heredoc比较适合较长的字符串表示,且对于多行的字符串表示更加灵活多样。与双引号表示形式类似,heredoc中也可以包含变量。常见的形式是:
$string ="test string";$str = <<<STRThis is a string \n,My string is $stringSTR;echo $str;
(4) nowdoc(5.3+支持)
nowdoc和heredoc是如此的类似,以至于我们可以把它们当做是一对儿亲兄弟。nowdoc的起始标志符是用单引号括起来的,与单引号相似,它不会解析其中的变量,格式控制符等:
$s = <<<'EOT'this is $strthis is \t test;EOT;echo $s;
2. PHP中字符串的结构
之前提到过,PHP中变量是用Zval(PHP内核探索之变量(1)Zval)这样一个结构体来存储的。Zval的结构是:
<span style="color: #000000">struct _zval_struct { zvalue_value value; </span><span style="color: #008000">/*</span><span style="color: #008000"> value </span><span style="color: #008000">*/</span><span style="color: #000000"> zend_uint refcount__gc; </span><span style="color: #008000">/*</span><span style="color: #008000"> variable ref count </span><span style="color: #008000">*/</span><span style="color: #000000"> zend_uchar type; </span><span style="color: #008000">/*</span><span style="color: #008000"> active type </span><span style="color: #008000">*/</span><span style="color: #000000"> zend_uchar is_ref__gc; </span><span style="color: #008000">/*</span><span style="color: #008000"> if it is a ref variable </span><span style="color: #008000">*/</span><span style="color: #000000">};</span>