![PHP面试一战到底](https://wfqqreader-1252317822.image.myqcloud.com/cover/891/44509891/b_44509891.jpg)
2.4 字符串
2.4.1 概念
字符串(string)是由若干字符组成的序列。string有4种表示方法:单引号、双引号、heredoc、nowdoc,它们的区别如表2-6所示。
表2-6 字符串的表示方法
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-T45_41235.jpg?sign=1739314518-pAHq8vfHxdHLuVf1TnyEXGJ5gw1YmclG-0-a30e95997bf2c195c8a5c008dc8ee3cb)
2.4.2 面试题:从string中取其中的单个字符
题目描述:如何从string中取出其中的单个字符。
可以用下标取出当前位置的字符,并支持修改。
程序代码如下:(源码文件:ch02/string_index.php)
<?php $str = 'hello'; echo $str[0]; //Output h $str[1] = 'a'; echo $str; //Output hallo
2.4.3 面试题:求字符串表示的最大长度
题目描述:字符串所能表示的最大长度是多少?
PHP 7之前的版本(5.x),string所能表示的最大长度为2GB。PHP 7之后,字符串就没有这种限制了。出现这种情况的原因,是因为PHP底层对于字符串设计的改变。
PHP 5.x的结构如下:
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-P45_39595.jpg?sign=1739314518-BGhb0QXVymcGGhw3vwZzBQk1X5bkYcOX-0-025a69ff4669b68de67805a7d20157f8)
可以看到,字符串的长度被放到一个4字节的int里,而int所能表示的最大数字为231-1。
而PHP 7里,string的内部结构如下:
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-P45_39594.jpg?sign=1739314518-Aa101357IH3lw4yc6vPCrx7VOb5dgaFU-0-eb5f86d081ae5868e024cfeb94633a38)
字符串的长度是size_t,而size_t与机器位数有关。在64位机器上,size_t为8个字节,所能表示的最大数字为264。
2.4.4 面试题:反转字符串
题目描述:如何反转一个字符串,例如将“hello”转化为“olleh”。
这是一道比较简单的题目,但也需要考虑性能问题。最简单的实现方法,是从尾到头遍历字符串,并拼接起来。
程序代码如下:(源码文件:ch02/reverse_string_v1.php)
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-P46_39598.jpg?sign=1739314518-w2tiZKGfoHrK1KId9jq2F371KemW9GDB-0-08c3e2f047df0ea921a2ef0a5878322c)
以上代码从结果来看,并没有问题。但要注意考虑以下两点:
1.如何减少中间结果的内存浪费
对于Java、PHP等语言,字符串每次赋值都会生成临时字符串,造成内存浪费。在第8行,每一次拼接都会产生临时字符串。
2.如何减少遍历次数
事实上,对一个长度为n的字符串,不需要从头到尾遍历n次,而只需找到中间位置,交换与中心对称位置的字符。基于这些考虑,我们可以写出更好的实现方式。
程序代码如下:(源码文件:ch02/reverse_string_v2.php)
![](https://epubservercos.yuewen.com/9146EB/23721566801954006/epubprivate/OEBPS/Images/Figure-P46_39599.jpg?sign=1739314518-KMEAr1hQWru5YHFnxrQjjIpWtgou4I4w-0-d67ab61a7b581cce9b325f1365d9a9b0)