ThinkPHP 6.0 核心代码分析 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
hubqin
V2EX    PHP

ThinkPHP 6.0 核心代码分析

  •  3
     
  •   hubqin 2019-11-07 00:36:42 +08:00 via Android 8087 次点击
    这是一个创建于 2171 天前的主题,其中的信息可能已经有所发展或是发生改变。
    分析完一遍 ThinkPHP 6.0 的核心代码,使用 phpstorm+xdebug 调试,反复走流程,直到弄懂,一遍下来,收获良多,对整个生命周期有种滚瓜烂熟的感觉。最难的管道模式实现的中间件,苦苦思索了好几天,竟然也弄懂了。
    最近把所有分析汇总起来,稍加梳理,查漏补缺,整理成册,分享出来。
    文档地址: https://www.kancloud.cn/hubqin/thinkphp/contnt
    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     Solana     3529 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 10:18 PVG 18:18 LAX 03:18 JFK 06:18
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86