PHP 源码学习 | 变量类型数据结构
前段时间因为项目需要,研究了一下在 Windows 系统下进行 PHP 扩展的开发,对于 PHP 扩展的开发并不是一件容易的事情(话又说回来了,会者不难,难者不会,关键是自己不会)。我当时的需求,主要是通过 PHP 扩展来加载 DLL 文件,并调用 DLL 中的导出函数。由于以前有一些 Win32 开发的基础,因此这个需求相对还不算太复杂。
开发 PHP 扩展比较难,我个人认为有两方面的原因,一方面需要了解操作系统相关的开发,毕竟 PHP 扩展不是 .so 文件就是 .dll 文件,另一方面需要了解 PHP 本身的底层数据结构。因此,借此机会就打算学习 PHP 的源码。不过说来惭愧,由于本身能力有限,所以学习速度比较缓慢。当然了,我是在有参考书的情况下进行学习的,但是速度也并不高。在有参考书的情况下,学习速度也不快,除了本身的能力外,另一方面是数据结构比较多,而且数据之间的关系也比较多,不能很快的对数据结构进行记忆,也不能很好的理清数据结构之间的关系,这是我比较大的障碍。(当然了,我投入的时间也并不多,这个是不好意思说罢了)
由于上面的原因,我觉得一边看书和看源码的同时,一边去整理各个数据结构和数据关系的图,以方便和加强自己的记忆,从而让自己更好的去理解。
我看的参考书,在源码分析前,首先介绍了源码的目录结构,我将其整理成了思维导图,如下图。
源码目录结构相对比较简单,毕竟就是一个大纲,在不断学习源码的过程中,其实可以接着完善,把源码相应的文件,相应的结构体都维护进去,这样思维导图就会逐步的完整,也就相对的有意义了。
在参考书中介绍完源码目录结构后,开始介绍 PHP 变量的数据结构。变量的数据结构在书中有详细的介绍,在详细介绍之前,只是粗略的进行了整体上的介绍,在这里,我把它们的数据结构和数据关系也进行了整理,并且把结构体所在的目录和文件也进行了标注,方便自己在学习源码的时候方便查找,也方便快速查阅各个数据结构之间的关系,毕竟这些数据结构实在太多了,如下图。
上面的图,就是关于 PHP 变量的底层数据结构的图,图中的数据结构中字段并不完整,因为我是在逐步的去完善,在每学习完一部分后就去完善一部分数据结构,当数据结构完善了,图也就完善了。由于图过于大,所以这里没有办法显示清楚,需要详细图片的,可以在公众号中回复“PHP源码学习”,即可获得清晰的大图。希望可以对大家学习 PHP 的源码有所帮助。
我的微信公众号:“码农UP2U”
PHP 源码学习 | 变量类型数据结构的更多相关文章
- [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)
[数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构) C#中的链表(源码) 可空类 ...
- zepto源码--定义变量--学习笔记
主要了解一下zepto定义的初始变量. 逐一以自己的理解解析,待到后面完全透彻理解之后,争取再写一遍zepto源码学习的文章. 其中的undefined确实不明白为什么定义这么个变量在这里. docu ...
- [数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习)
[数据结构1.2-线性表] 动态数组ArrayList(.NET源码学习) 在C#中,存在常见的九种集合类型:动态数组ArrayList.列表List.排序列表SortedList.哈希表HashTa ...
- Aspects 源码学习
AOP 面向切面编程,在对于埋点.日志记录等操作来说是一个很好的解决方案.而 Aspects 是一个对于AOP编程的一个优雅的实现,也可以直接借助这个库来使用AOP思想.需要值得注意的是,Aspect ...
- Redis源码学习:字符串
Redis源码学习:字符串 1.初识SDS 1.1 SDS定义 Redis定义了一个叫做sdshdr(SDS or simple dynamic string)的数据结构.SDS不仅用于 保存字符串, ...
- JDK1.8源码学习-ArrayList
JDK1.8源码学习-ArrayList 目录 一.ArrayList简介 为了弥补普通数组无法自动扩容的不足,Java提供了集合类,其中ArrayList对数组进行了封装,使其可以自动的扩容或缩小长 ...
- Qt Creator 源码学习笔记04,多插件实现原理分析
阅读本文大概需要 8 分钟 插件听上去很高大上,实际上就是一个个动态库,动态库在不同平台下后缀名不一样,比如在 Windows下以.dll结尾,Linux 下以.so结尾 开发插件其实就是开发一个动态 ...
- [算法1-排序](.NET源码学习)& LINQ & Lambda
[算法1-排序](.NET源码学习)& LINQ & Lambda 说起排序算法,在日常实际开发中我们基本不在意这些事情,有API不用不是没事找事嘛.但必要的基础还是需要了解掌握. 排 ...
- [算法2-数组与字符串的查找与匹配] (.NET源码学习)
[算法2-数组与字符串的查找与匹配] (.NET源码学习) 关键词:1. 数组查找(算法) 2. 字符串查找(算法) 3. C#中的String(源码) 4. 特性Attribute 与内 ...
随机推荐
- Step by Step Process of Migrating non-CDBs and PDBs Using ASM for File Storage (Doc ID 1576755.1)
Step by Step Process of Migrating non-CDBs and PDBs Using ASM for File Storage (Doc ID 1576755.1) AP ...
- Where is the kernel documentation?; Ubuntu 上如何安装 linux 内核文档;fedora 上如何安装linux内核文档?
有时候,linux内核文档对我们很重要,我们可以在linux系统中安装,并及时查看: 参考链接:https://askubuntu.com/questions/841043/where-is-the- ...
- VSCode+C++环境搭建
date: 2019-10-05 VSCode+C++环境搭建 其实并不完整,毕竟我也只是一个OIer,并不会很高深的东西.(众所周知,OIer主业是软件开发) 安装VSCode 下载安装包 这个很简 ...
- SQL Server事务复制(sql 2008 r2)
一.环境准备 1.两个虚拟服务器 主机1:XINXIBU01 作为发布和分发服务器 主 机2:XINXIBU02 192.168.1.160 作业阅服务器 2.SQL SERVER sql 2 ...
- 使用ES6新特性async await进行异步处理
我们往往在项目中会遇到这样的业务需求,就是首先先进行一个ajax请求,然后再进行下一个ajax请求,而下一个请求需要使用上一个请求得到的数据,请求少了还好说,如果多了,就要一层一层的嵌套,就好像有点c ...
- 关于dom4j解析XML的问题分享
最近在在做个程序需要将C#小工具转成java,因为需要涉及到操作xml文件所以需要引用dom4j: 使用dom4j解析XML时,要快速获取某个节点的数据,使用XPath是个不错的方法,dom4j的快速 ...
- 递归找到多级文件夹中所有pdf文件的py程序
因个人需要,写了一个可以递归找到多级文件夹中所有pdf的小程序,发布出来供有需要的人参考或使用. import os import re import shutil from os.path impo ...
- 【c&c++】变量初始化
/* 全局变量会默认初始化为0 空 和 false,局部变量要手动初始化,或者直接scanf输入值进去.如果不初始化,n可能是0也有可能是其他数,大多数情况下会是0,但不初始化是不安全的,所以Dev直 ...
- Luogu P1583 魔法照片
题目描述 一共有n(n≤20000)个人(以1--n编号)向佳佳要照片,而佳佳只能把照片给其中的k个人.佳佳按照与他们的关系好坏的程度给每个人赋予了一个初始权值W[i].然后将初始权值从大到小进行排序 ...
- [错误]Caused by: org.apache.spark.memory.SparkOutOfMemoryError: Unable to acquire 65536 bytes of memory, got 0
今天,在运行Spark SQL代码的时候,遇到了以下错误: Caused by: org.apache.spark.SparkException: Job aborted due to stage f ...