image.png
    PHP5和PHP7的字符串结构相同点
    字符串的储存都是val变量
    都是len变量记录字符串的长度
    都是recount字段记录引用计数
    PHP5和PHP7的字符串结构不同点
    字符串结构的完全改变
    字符串真正存储val字段的实现方式不同
    PHP5:指针方式
    PHP7:c语言新特性柔性数组,增加了哈希值的存储,增加了PHP7的gc统一头部

    4.1.1 PHP7字符串具体实现
    image.png
    image.png
    gc字段
    存放引用计数
    h字段
    h 字段的作用是缓存字符串的哈希值,它的值只有当字符串需要被作为数组 key 时才会初始化
    val字段
    存储字符串的值,类型是char,PHP7的val字段是使用的柔性数组
    柔性数组优势:struct中字符串的值与其他成员便存储在一块连续的空间中,分配、释放内存时可当成整体处理,这样读取字符串时可以省一次内存读写
    image.png
    len字段
    决定字符串的长度
    记录字符串长度的原因:
    时间换空间的做法,直接记录以避免重复计算字符串的长度
    保证了 PHP 字符串操作二进制安全

    4.1.2 字符串的二进制安全
    c语言只能保存文本数据。
    PHP数据在写入时什么样,读取时就是什么样,这种能力被称为字符串的二进制安全。
    image.png