​每天抽一点时间来看看 PHP 源码方面的书,说实话,无法在调试器下观察 PHP 运行状态的上下文实在是一件痛苦的事情。不过还好不是一无所获,虽然内容比较多,但是掌握方法挨着看下去还是可以看一些代码的。而且本身 PHP 源码讲解就有书,所以学习起来还是较为方便的。想要调试源码,我觉得我最好应该找一个前一天充分休息并且是阳光明媚的早上来学习关于调试 PHP 源码的知识,那样可能效率会高一些,但是这样的机会好像又不多。
 
        以前学习逆向分析的时候需要看反汇编代码,当时也看得非常的晕,后来看书学习时书中也给出了阅读反汇编的经验。首先把指令进行分类,比如函数调用的指令,流程控制的指令和数据处理的指令等。然后把要进行逆向分析的部分按照指令分类进行标注,阅读的反汇编的时候,遇到函数调用的部分基本比较明显,就是堆栈操作、函数调用等,遇到流程控制的时候把这些反汇编直接根据特征对应到 if、for、while 等相应的控制结构中,而遇到数据处理的部分则需要一行一行的阅读。
 
        其实对应到阅读 PHP 的源码也是类似的吧。
 
        ​说说我学习 PHP 源码的方法吧。虽然有讲解 PHP 源码方面的书,但是书中的内容在做一些基本的介绍后就开始讲源码了。而 PHP 的底层源码中有非常多的​数据结构,而且是 struct 套着 struct。这就导致一个问题,如果底层的数据结构的逻辑整理不清楚,那么在看到代码操作这些数据结构的时候,必然也是晕的。因此,我看书的时候,我会把相关的数据结构按照类似 UML 图的方式整理一下,其实就是画几个图,标记一下所遇到的数据结构,标记数据结构时我会把结构体的名称和几个关键的字段标注好,并且把数据结构之间的关联关系整理出来,这样就会把所涉及的数据结构及数据关系搞明白了,在看代码的时候,把自己整理的数据结构打开对照着看,就不是那么晕了。当代码操作具体数据结构中的字段时,再把具体的字段补充到对应的数据结构中,这样不但 PHP 源码底层的处理逻辑了解了,而且对于底层的数据结构也就有了清晰和全面的掌握了。
 
        这就是我的方法吧,虽然不复杂但是还是比较有用的。毕竟笨人的办法就是这么的原始和简单!
 

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

分享学习 PHP 源码的方法的更多相关文章

  1. 框架源码系列五:学习源码的方法(学习源码的目的、 学习源码的方法、Eclipse里面查看源码的常用快捷键和方法)

    一. 学习源码的目的 1. 为了扩展和调优:掌握框架的工作流程和原理 2. 为了提升自己的编程技能:学习他人的设计思想.编程技巧 二. 学习源码的方法 方法一: 1)掌握研究的对象和研究对象的核心概念 ...

  2. 【菜鸟学习jquery源码】数据缓存与data()

    前言 最近比较烦,深圳的工作还没着落,论文不想弄,烦.....今天看了下jquery的数据缓存的代码,参考着Aaron的源码分析,自己有点理解了,和大家分享下.以后也打算把自己的jquery的学习心得 ...

  3. Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

  4. 【转】Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

  5. Linux内核源码分析方法_转

    Linux内核源码分析方法 转自:http://www.cnblogs.com/fanzhidongyzby/archive/2013/03/20/2970624.html 一.内核源码之我见 Lin ...

  6. DotNetty网络通信框架学习之源码分析

    DotNetty网络通信框架学习之源码分析 有关DotNetty框架,网上的详细资料不是很多,有不多的几个博友做了简单的介绍,也没有做深入的探究,我也根据源码中提供的demo做一下记录,方便后期查阅. ...

  7. 学习 vue 源码 -- 响应式原理

    概述 由于刚开始学习 vue 源码,而且水平有限,有理解或表述的不对的地方,还请不吝指教. vue 主要通过 Watcher.Dep 和 Observer 三个类来实现响应式视图.另外还有一个 sch ...

  8. Linux学习之源码包安装与脚本安装(十八)

    Linux学习之源码包安装与脚本安装 目录 源码包与RPM包的区别 源码包安装 脚本安装 源码包与RPM包的区别 1.区别 安装之前的区别:概念上的区别 安装之后的区别:安装位置不同 源码包: 开源的 ...

  9. 调试JDK1.8源码的方法

    背景 在学习JDK源码的时候,免不了需要调试JDK的源码. 比如:想理解ConcurrentHashMap的put(K k, V v)方法,JDK自带的rt.jar文件是支持断点调试,但是却看不到变量 ...

随机推荐

  1. CSS去除input和textarea点击选中框

    1.去除chrome等浏览器默认发光边框 input:focus, textarea:focus { outline: none; } 这样textarea在选中的时候,文字会有点移动,解决方法: i ...

  2. 剑指Offer-41.和为S的连续正数序列(C++/Java)

    题目: 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他就 ...

  3. Go 面试每天一篇(第 65 天)

    Go 面试每天一篇(第 65 天) 1.下面列举的是 recover() 的几种调用方式,哪些是正确的? A. 1func main() { 2 recover() 3 panic(1) 4} B. ...

  4. 使用where 过滤数据

    --本章主要内容是MySQL中使用where搜索条件进行过滤数据. where条件在from子句后面给出,如下所示: select name,price from shops where price& ...

  5. LinuxMint配置GitHub(图文教程)

    1.生成秘钥(直接回车,秘钥存放路径看命令行信息) 2.打开秘钥,需要注意的是.ssh可能是隐藏的,这时需要Ctrl+H显示隐藏文件夹 3.复制秘钥,添加到GitHub(Settings), 4.添加 ...

  6. html5 websocket 示例,websocket在线聊天,php websocket实例

    WebSocket在线测试工具 http://ws.douqq.com/ 1.连接格式为 ws://IP/域名:端口(示例ws://119.29.3.36:5354) 2.对于内网的测试环境,只需填入 ...

  7. Spring Cloud进阶之路 | 二:服务提供者(discovery)

    1 创建父项目 以前文所述,以spring boot 2.1.7.RELEASE为基,spring cloud版本为Greenwich.SR2,spring cloud alibaba版本为2.1.0 ...

  8. centos安装与配置keepalived+nginx高可用

    一.安装启动keepalived 1.下载keepalived 在centos系统中,用wget下载最新版本: mkdir tool cd tool wget https://www.keepaliv ...

  9. JQuery 表单textarea控制字数

    /** *textarea 字数限制 *obj textarea * maxlength 限制的最大字数 */ function textarealength(obj,maxlength){ var ...

  10. 微信小程序—支付宝小程序与微信小程序的不同点对比

    支付宝小程序语法 http://caibaojian.com/aliapp-wxapp.html https://www.cnblogs.com/bgwhite/p/9447639.html http ...