前段时间因为项目需要,研究了一下在 Windows 系统下进行 PHP 扩展的开发,对于 PHP 扩展的开发并不是一件容易的事情(话又说回来了,会者不难,难者不会,关键是自己不会)。我当时的需求,主要是通过 PHP 扩展来加载 DLL 文件,并调用 DLL 中的导出函数。由于以前有一些 Win32 开发的基础,因此这个需求相对还不算太复杂。

开发 PHP 扩展比较难,我个人认为有两方面的原因,一方面需要了解操作系统相关的开发,毕竟 PHP 扩展不是 .so 文件就是 .dll 文件,另一方面需要了解 PHP 本身的底层数据结构。因此,借此机会就打算学习 PHP 的源码。不过说来惭愧,由于本身能力有限,所以学习速度比较缓慢。当然了,我是在有参考书的情况下进行学习的,但是速度也并不高。在有参考书的情况下,学习速度也不快,除了本身的能力外,另一方面是数据结构比较多,而且数据之间的关系也比较多,不能很快的对数据结构进行记忆,也不能很好的理清数据结构之间的关系,这是我比较大的障碍。(当然了,我投入的时间也并不多,这个是不好意思说罢了)

由于上面的原因,我觉得一边看书和看源码的同时,一边去整理各个数据结构和数据关系的图,以方便和加强自己的记忆,从而让自己更好的去理解。

我看的参考书,在源码分析前,首先介绍了源码的目录结构,我将其整理成了思维导图,如下图。

源码目录结构相对比较简单,毕竟就是一个大纲,在不断学习源码的过程中,其实可以接着完善,把源码相应的文件,相应的结构体都维护进去,这样思维导图就会逐步的完整,也就相对的有意义了。

在参考书中介绍完源码目录结构后,开始介绍 PHP 变量的数据结构。变量的数据结构在书中有详细的介绍,在详细介绍之前,只是粗略的进行了整体上的介绍,在这里,我把它们的数据结构和数据关系也进行了整理,并且把结构体所在的目录和文件也进行了标注,方便自己在学习源码的时候方便查找,也方便快速查阅各个数据结构之间的关系,毕竟这些数据结构实在太多了,如下图。

上面的图,就是关于 PHP 变量的底层数据结构的图,图中的数据结构中字段并不完整,因为我是在逐步的去完善,在每学习完一部分后就去完善一部分数据结构,当数据结构完善了,图也就完善了。由于图过于大,所以这里没有办法显示清楚,需要详细图片的,可以在公众号中回复“PHP源码学习”,即可获得清晰的大图。希望可以对大家学习 PHP 的源码有所帮助。


我的微信公众号:“码农UP2U”

PHP 源码学习 | 变量类型数据结构的更多相关文章

  1. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  2. zepto源码--定义变量--学习笔记

    主要了解一下zepto定义的初始变量. 逐一以自己的理解解析,待到后面完全透彻理解之后,争取再写一遍zepto源码学习的文章. 其中的undefined确实不明白为什么定义这么个变量在这里. docu ...

  3. [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习)

    [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习) 在C#中,存在常见的九种集合类型:动态数组ArrayList.列表List.排序列表SortedList.哈希表HashTa ...

  4. Aspects 源码学习

    AOP 面向切面编程,在对于埋点.日志记录等操作来说是一个很好的解决方案.而 Aspects 是一个对于AOP编程的一个优雅的实现,也可以直接借助这个库来使用AOP思想.需要值得注意的是,Aspect ...

  5. Redis源码学习:字符串

    Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...

  6. JDK1.8源码学习-ArrayList

    JDK1.8源码学习-ArrayList 目录 一.ArrayList简介 为了弥补普通数组无法自动扩容的不足,Java提供了集合类,其中ArrayList对数组进行了封装,使其可以自动的扩容或缩小长 ...

  7. Qt Creator 源码学习笔记04,多插件实现原理分析

    阅读本文大概需要 8 分钟 插件听上去很高大上,实际上就是一个个动态库,动态库在不同平台下后缀名不一样,比如在 Windows下以.dll结尾,Linux 下以.so结尾 开发插件其实就是开发一个动态 ...

  8. [算法1-排序](.NET源码学习)& LINQ & Lambda

    [算法1-排序](.NET源码学习)& LINQ & Lambda 说起排序算法,在日常实际开发中我们基本不在意这些事情,有API不用不是没事找事嘛.但必要的基础还是需要了解掌握. 排 ...

  9. [算法2-数组与字符串的查找与匹配] (.NET源码学习)

    [算法2-数组与字符串的查找与匹配] (.NET源码学习) 关键词:1. 数组查找(算法)   2. 字符串查找(算法)   3. C#中的String(源码)   4. 特性Attribute 与内 ...

随机推荐

  1. RMAN RECOVER TABLE 功能是 Oracle Database 12c 的新增功能 (Doc ID 1521524.1)

    RMAN RECOVER TABLE Feature New to Oracle Database 12c (Doc ID 1521524.1) APPLIES TO: Oracle Database ...

  2. JMeter系列教程

    认识JMeter工具 JMeter常用元件功能介绍 JMeter线程组 JMeter脚本三种录制方法 Jmeter组件介绍及其作用域和执行顺序 JMeter参数化 JMeter集合点 JMeter关联 ...

  3. git结合项目基本使用

    学习博客:1,史上最浅显易懂的Git教程! 2,结合项目具体使用 3,常用命令快速查看 4,git stash 用法总结和注意点 一.git的工作原理和工作流程 Workspace:工作区 Index ...

  4. 腾讯云服务器ubuntu18.04部署禅道系统

    踩了不少坑,记录一下. 基于ubuntu18.04 一开始按照网上的攻略下载安装包 ZenTaoPMS.9.8.3.zbox_64.tar.gz,通过FileZilla传到linux的/opt下面,解 ...

  5. 构造函数new运算符进行了哪些操作

    new 运算符 1,实例化一个对象 2,将构造函数prototype对象赋值给对象__proto__属性 3,将对象作为函数this传进去,函数有return 并且是对象的话,就直接返回return的 ...

  6. Jenkins学习安装配置和使用

    为了能够频繁地将软件的最新版本,及时.持续地交付给测试团队及质量控制团队,以供评审,所以引入持续集成工具Jenkins,从而实现公司新产品持续集成,自动化部署. 环境准备 ●操作系统:Windows1 ...

  7. java自学-类与对象

    1.面向对象和面向过程 java是一种面向对象的程序设计语言,而面向对象思想是一种程序设计思想. 这里的对象泛指现实中一切事物,每种事物都具备自己的属性和行为.面向对象思想就是在计算机程序设计过程中, ...

  8. JMeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决方法

    一.问题原因 用JMeter压测,有时候当模拟并发请求较大或者脚本运行时间较长时,JMeter会停止,报OOM(内存溢出)错误. 原因是JMeter是一个纯Java开发的工具,内存由java虚拟机JV ...

  9. zabbix监控服务

    1.模板的重要 ​ 1.手动添加监控比较麻烦,监控项 -> 图形 -> 触发器. 问题: 1.例如: 100台服务器需要检查81端口 2.例如: 100台服务器81改成82 解决: 使用模 ...

  10. JAVA学习第二步,初级知识框架梳理

    回顾往期的学习,才发现已经学习了这么多知识点.这里复制了其他创作者的一些梳理结合自己的梳理.总结了自己在Java学习入门阶段的知识点.笔记自己了也写了详细的两本 第一章 Java面向对象 1-1包的定 ...