​每天抽一点时间来看看 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. 8种创建Java线程的方式,你知道几个?

    作者:唐彤 简介 创建线程,是多线程编程中最基本的操作,彤哥总结了一下,大概有8种创建线程的方式,你知道吗? 1.继承Thread类并重写run()方法 public class CreatingTh ...

  2. Harbor搭建企业级docker仓库

    一. Harbor简介 1.1 Harbor介绍 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源Do ...

  3. 如何上传项目到github

    喜欢的同学可以看一下原文,讲得更加详细哦 原文地址:http://www.cnblogs.com/cxk1995/p/5800196.html 首先你需要一个github账号,所有还没有的话先去注册吧 ...

  4. C# DataTable 某一列取算

    1. 列为数字类型double total= Convert.ToDouble(datatable.Compute("SUM(需要求和的参数)", "")); ...

  5. DHCP服务相关实验

    一.DHCP 相关介绍 1.dhcp服务相关 软件名: dhcp #DHCP服务软件包 dhcp-common #DHCP命令软件包(默认已安装) 服务名: dhcpd #DHCP服务名 dhcrel ...

  6. JavaSE-知识点总结

    Java名词 变量.运算符.类.接口.枚举.参数.注解.异常.包装类.多线程.集合.IO流.网络编程.反射.Lambda.API 源文件:.java文件,存储Java源代码的文件 字节码文件:.cla ...

  7. Navicat Keygen - 注册机是怎么工作的?

    Navicat Keygen - 注册机是怎么工作的? 1. 关键词解释. Navicat激活公钥 这是一个2048位的RSA公钥,Navicat使用这个公钥来完成相关激活信息的加密和解密. 这个公钥 ...

  8. C# 多线程总结 异常处理 线程取消 锁(lock)

    那么什么时候能用多线程? 任务能并发的时候 多线程能干嘛?提升速度/优化用户体验 网站首页:A数据库 B接口 C分布式服务 D搜索引擎,适合多线程并发,都完成后才能返回给用户,需要等待WaitAll列 ...

  9. strcat函数(字符串连接函数)

    srtcat函数原型在c中的<string.h>中. 语法: strcat(字符串a,字符串b): #include <stdio.h> #include <string ...

  10. WebShell代码分析溯源(十)

    WebShell代码分析溯源(十) 一.一句话变形马样本 <?php $e = $_REQUEST['e'];register_shutdown_function($e, $_REQUEST[' ...