如何动态的去继承一个类,而不是去写一个类文件去 extends 继承 - V2EX
cokar
V2EX    PHP

如何动态的去继承一个类,而不是去写一个类文件去 extends 继承

  •  1
     
  •   cokar Apr 13, 2024 4039 views
    This topic created in 780 days ago, the information mentioned may be changed or developed.

    我正在开发一款 cms ,允许开发插件,现在遇到一个问题。

    比如 A 插件想修改我的程序核心文件 \Request->a () 这个方法,那么他可以在钩子处,即将要实例化 \Request 类的时候替换成他自己的类 \RequestA , 他的类可以这样写

    class RequestA extends Request{ public function a(){ echo ‘覆盖父方法’; } } 

    现在有个 B 插件,他想覆盖我核心文件 \Request->b () 方法,如果他也像 A 插件那样做,这样就冲突了,只能某一个插件有效了。

    我想实现这样的功能,想让 B 插件判断前面有 A 插件了,就去继承 A 类,这样可以让 2 个插件都能正常使用,并且覆盖核心文件的方法。

    但似乎 php 无法实现这样的动态继承某个类。

    有什么好的办法可以实现类似的功能呢?

    原文作者:Codex 转自链接: https://learnku.com/php/t/86440 版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

    16 replies    2024-08-10 22:44:03 +08:00
    google2020
        1
    google2020  
       Apr 13, 2024
    换个插件方法。学 WordPress 的 hook 机制,插入过程用 Action ,过滤数据用 Filter ,非常好用。
    Ashe007
        2
    Ashe007  
       Apr 13, 2024
    代理模式之动态代理
    iminto
        3
    iminto  
       Apr 13, 2024 via Android
    多看看设计模式,看多了就逐渐懂了。

    Java 里面的拦截器,过滤器,SPI 这些都是好东西,可以借鉴下其设计。

    PHP 这样的语言要实现你要的效果应该更简单,只是不够优雅而已
    cookii
        4
    cookii  
       Apr 14, 2024 via Android
    责任链了解一下
    itechify
        5
    itechify  
    PRO
       Apr 14, 2024 via Android
    代理模式
    timethinker
        6
    timethinker  
       Apr 14, 2024   1
    插件有多个,这也就意味着它是一个列表形式的存在,你应该在某一个时机调用所有插件的某一个方法,这个方法签名是你定义的,类似接口一样的东西。比如里面有一个方法叫做 onRequest(Request),插件负责实现这个方法,然后把插件实例注册到你的插件列表中,这样你就可以在合适的时机遍历插件列表进行调用。
    cokar
        7
    cokar  
    OP
       Apr 14, 2024
    多谢各位大佬解答,大概有方向了
    liaoxx
        8
    liaoxx  
       Apr 14, 2024
    Trait ?
    horizon
        9
    horizon      Apr 14, 2024
    依赖反转,你定义接口,插件实现接口,你在 core 中实例化插件,调用插件。
    lisongeee
        10
    lisongeee  
       Apr 14, 2024
    请问 php 的类实例化后的实例对象的函数是不是可修改的属性,这个实例是不能直接修改属性为新函数引用吗?
    Dynesshely
        11
    Dynesshely  
       Apr 14, 2024
    @horizon 正解, OP 应该定义接口, 然后使用默认的实现, 插件可以提供新的实现
    YassoWithSpeaker
        12
    YassoWithSpeaker  
       Apr 15, 2024
    面向接口编程哇,接口不就解决多继承问题么。
    zhtyytg
        13
    zhtyytg  
       Apr 15, 2024
    @horizon 朴实无华的依赖注入,依旧是万能答案
    panlatent
        14
    panlatent  
       Apr 16, 2024
    @lisongeee 是也不是,反射 API 可以修改定义。但一般是测试框架来用。OP 这个有很多种设计方式可以解决问题
    8355
        15
    8355  
       Apr 16, 2024
    现在还有人问这种问题非常感动
    sunchuo
        16
    sunchuo  
       Aug 10, 2024
    设计模式看一看,修饰模式。
    About     Help     Advertise     Blog     API     FAQ     Solana     5900 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 80ms UTC 01:51 PVG 09:51 LAX 18:51 JFK 21:51
    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