V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hubqin
V2EX  ›  PHP

ThinkPHP 6.0 核心代码分析

  •  3
     
  •   hubqin · 2019-11-07 00:36:42 +08:00 via Android · 7664 次点击
    这是一个创建于 1876 天前的主题,其中的信息可能已经有所发展或是发生改变。
    分析完一遍 ThinkPHP 6.0 的核心代码,使用 phpstorm+xdebug 调试,反复走流程,直到弄懂,一遍下来,收获良多,对整个生命周期有种滚瓜烂熟的感觉。最难的管道模式实现的中间件,苦苦思索了好几天,竟然也弄懂了。
    最近把所有分析汇总起来,稍加梳理,查漏补缺,整理成册,分享出来。
    文档地址: https://www.kancloud.cn/hubqin/thinkphp/content
    39 条回复    2019-12-01 22:45:44 +08:00
    qqxx520
        1
    qqxx520  
       2019-11-07 06:59:31 +08:00 via iPhone   ❤️ 1
    谢谢分享
    suners
        2
    suners  
       2019-11-07 08:42:00 +08:00
    楼主的精神很值得学习,平时自己用框架大多数只存在于用的层面,很少亲自去跟踪和分析核心代码,以后要多多跟楼主学习
    2379920898
        3
    2379920898  
       2019-11-07 09:04:02 +08:00
    你看看都没人搞 PHP 了,连个给你回复的都没有,真可怜的 PHP
    hubqin
        4
    hubqin  
    OP
       2019-11-07 09:15:27 +08:00   ❤️ 2
    @2379920898 还好啦,自动加载、依赖注入、中间件、观察模式(事件)……这些在其他语言也适用,先在一门深入了再说,不然,学多门语言,很可能即使换了一门语言写 CURD 而已。
    1O
        5
    1O  
       2019-11-07 09:15:50 +08:00
    @2379920898 搞 PHP 的没时间摸鱼
    hubqin
        6
    hubqin  
    OP
       2019-11-07 09:23:23 +08:00
    @suners 多谢支持。觉得源代码就是最好的文档,官方文档往往不全面。
    assad
        7
    assad  
       2019-11-07 09:39:06 +08:00
    支持一个啊,学习学习
    sorshion
        8
    sorshion  
       2019-11-07 09:39:12 +08:00
    不错,支持一个
    ben1024
        9
    ben1024  
       2019-11-07 09:40:09 +08:00
    支持下[赞]
    WytheHuang
        10
    WytheHuang  
       2019-11-07 09:49:33 +08:00   ❤️ 6
    @2379920898 #3 “端起碗吃肉,放下筷子骂娘” ? 8 天前还在找 PHP 全栈职位, 现在就说可怜的 PHP?
    NerverLibis
        11
    NerverLibis  
       2019-11-07 09:53:43 +08:00 via iPhone   ❤️ 1
    讲得很好 照抄 laravel
    set01
        12
    set01  
       2019-11-07 10:14:28 +08:00
    楼主有没有想法 整一个 laravel 版本的?
    Sikoay
        13
    Sikoay  
       2019-11-07 10:31:11 +08:00
    @set01 我也想搞一个 Laravel 的源码分析
    PainfulJoe
        14
    PainfulJoe  
       2019-11-07 10:31:17 +08:00   ❤️ 2
    @2379920898 骂 PHP 的基本都是以前就是干 PHP 的,真的这么想否定曾今的自己吗?
    lepig
        15
    lepig  
       2019-11-07 10:39:31 +08:00
    感谢 楼主分享、
    niucility
        16
    niucility  
       2019-11-07 10:55:59 +08:00
    不要恶意揣测啊,可能只是自嘲一下呢.
    bzj
        17
    bzj  
       2019-11-07 11:00:25 +08:00
    @WytheHuang

    不要太敏感 别人只是自嘲 我怀疑你理解能力不行
    Canon1014
        18
    Canon1014  
       2019-11-07 11:08:06 +08:00
    期待 Laravel 版,或者看完楼主这套流程自己去看一遍
    abccccabc
        19
    abccccabc  
       2019-11-07 11:11:36 +08:00
    @NerverLibis 人家疼训哪款产品 不是抄的,最后还把人家给抄死了,就看谁能活到最后。
    xjmroot
        20
    xjmroot  
       2019-11-07 11:38:29 +08:00
    感谢楼主分享,学习学习
    WytheHuang
        21
    WytheHuang  
       2019-11-07 11:47:29 +08:00
    @bzj #17 楼主在分享, 扯一些跟楼主分享无关的。 这是自嘲?我怀疑你理解能力也不行, 老弟
    wangyzj
        22
    wangyzj  
       2019-11-07 12:02:53 +08:00
    没有 M 方法的 tp 深深的伤害了我的心
    bzj
        23
    bzj  
       2019-11-07 12:03:39 +08:00
    @WytheHuang 难道你说的跟楼主分享有关?当然让你说你也说不出来点啥有用的
    AyanamiRei
        24
    AyanamiRei  
       2019-11-07 12:17:05 +08:00
    发现要是有跟 PHP 有关的话题总是能吵起来, 能不能好好关注重点
    WytheHuang
        25
    WytheHuang  
       2019-11-07 12:18:23 +08:00 via Android
    @bzj 对对对,你说的对,然后呢?
    hubqin
        26
    hubqin  
    OP
       2019-11-07 12:41:10 +08:00
    @set01 #12 @Sikoay #13
    有计划读一遍 laravel,之前稍微看过一些,laravel 给你的感觉就是精心雕琢,功能非常齐全,你想要的方法基本能找到。但非常厚重,层层封装,特别绕。与之相比,tp6.0 是越来越像 laravel,“系统服务”就是 laravel 的服务提供者,中间件的实现使用管道模式,跟 laravel 的实现比较也是相差无几(要是我看了 laravel 的 pineline 实现中间件,我也会毫不犹豫使用它的方法,因为实在简洁、精妙、由衷服了,看看 tp5.1 的中间件实现,简直天壤之别)。
    hubqin
        27
    hubqin  
    OP
       2019-11-07 12:43:42 +08:00
    @NerverLibis #11 哈哈,现在学一个顶两,挺划算的。
    dvaknheo
        28
    dvaknheo  
       2019-11-09 20:08:06 +08:00   ❤️ 1
    @hubqin pineline 实现中间件有什么好处?,或者中间件有什么好处?
    如果不用中间件,能不能解决。

    至少我看到一个坏处是堆栈没法看。
    这也就是中间件技术把 PHP 带歪的地方。
    hubqin
        29
    hubqin  
    OP
       2019-11-10 11:20:11 +08:00
    @dvaknheo 中间件可以很方便对请求进行过滤、拦截,而不用修改原有的类,实现各类与类之间的松耦合; pipeline 模式可以说是装饰器模式的一个变种,只是传递的东西变成了一个闭包,同样也是解耦,剥离与业务无关的代码。
    如果不用中间件,可以使用类的继承来实现,在父类中去过滤请求,可能 yii2 框架就倾向于使用类的继承。
    dvaknheo
        30
    dvaknheo  
       2019-11-10 12:46:41 +08:00
    @hubqin
    我记得洋葱模型 node-js 解决协程 用的。 分两个接口,执行前,执行后 要好得多。
    不然堆栈里真的没法看出来是什么引发的问题。

    还是觉得显式方式拦截的好。 直接看代码调用堆栈就知道哪里出了问题。
    控制器就是要干这个的。

    当然,我们也可以保留 钩子模式。但是没必要让钩子的作者搞得这么舒服(前后依赖关系自动化等。
    以告诉钩子:用了高级性能,要自己小心。
    a67793581
        31
    a67793581  
       2019-11-11 11:31:20 +08:00
    已通读 感谢作者的无私奉献
    Junjunya
        32
    Junjunya  
       2019-11-12 11:53:44 +08:00
    写的很好 ,适合新手去跟着源码读一读
    jimmzhou
        33
    jimmzhou  
       2019-11-13 10:08:18 +08:00
    @hubqin 29 我怎么觉得 pipeline 是责任链模式呢
    hubqin
        34
    hubqin  
    OP
       2019-11-13 11:50:18 +08:00
    @jimmzhou 确实很像,但装饰模式是可以无限递归的调用的,而责任链模式是有一个处理了就结束。
    hubqin
        35
    hubqin  
    OP
       2019-11-13 11:50:40 +08:00
    @a67793581 速度好快。
    zhz0529
        36
    zhz0529  
       2019-11-19 22:40:18 +08:00
    厉害了,感谢作者的无私奉献
    KamioMisuzu
        37
    KamioMisuzu  
       2019-11-24 03:58:11 +08:00 via iPhone
    您好 可以转载吗 会写明作者和源地址
    hubqin
        38
    hubqin  
    OP
       2019-11-24 15:41:18 +08:00
    @KamioMisuzu 可以
    FlexGap
        39
    FlexGap  
       2019-12-01 22:45:44 +08:00
    厉害了,打算学习下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5044 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:54 · PVG 11:54 · LAX 19:54 · JFK 22:54
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.