如何动态的去继承一个类,而不是去写一个类文件去 extends 继承 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cokar
V2EX    PHP

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

  •  1
     
  •   cokar 2024-04-13 22:36:11 +08:00 3403 次点击
    这是一个创建于 546 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

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

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

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

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

    PHP 这样的语言要实现你要的效果应该更简单,只是不够优雅而已
    cookii
        4
    cookii  
       2024-04-14 00:16:29 +08:00 via Android
    责任链了解一下
    itechify
        5
    itechify  
    PRO
       2024-04-14 00:24:01 +08:00 via Android
    代理模式
    timethinker
        6
    timethinker  
       2024-04-14 01:37:59 +08:00   1
    插件有多个,这也就意味着它是一个列表形式的存在,你应该在某一个时机调用所有插件的某一个方法,这个方法签名是你定义的,类似接口一样的东西。比如里面有一个方法叫做 onRequest(Request),插件负责实现这个方法,然后把插件实例注册到你的插件列表中,这样你就可以在合适的时机遍历插件列表进行调用。
    cokar
        7
    cokar  
    OP
       2024-04-14 09:52:45 +08:00
    多谢各位大佬解答,大概有方向了
    liaoxx
        8
    liaoxx  
       2024-04-14 11:40:33 +08:00
    Trait ?
    horizon
        9
    horizon  
       2024-04-14 15:38:19 +08:00
    依赖反转,你定义接口,插件实现接口,你在 core 中实例化插件,调用插件。
    lisongeee
        10
    lisongeee  
       2024-04-14 15:44:41 +08:00
    请问 php 的类实例化后的实例对象的函数是不是可修改的属性,这个实例是不能直接修改属性为新函数引用吗?
    Dynesshely
        11
    Dynesshely  
       2024-04-14 19:32:37 +08:00
    @horizon 正解, OP 应该定义接口, 然后使用默认的实现, 插件可以提供新的实现
    YassoWithSpeaker
        12
    YassoWithSpeaker  
       2024-04-15 14:07:32 +08:00
    面向接口编程哇,接口不就解决多继承问题么。
    zhtyytg
        13
    zhtyytg  
       2024-04-15 15:42:10 +08:00
    @horizon 朴实无华的依赖注入,依旧是万能答案
    panlatent
        14
    panlatent  
       2024-04-16 01:42:13 +08:00
    @lisongeee 是也不是,反射 API 可以修改定义。但一般是测试框架来用。OP 这个有很多种设计方式可以解决问题
    8355
        15
    8355  
       2024-04-16 10:04:17 +08:00
    现在还有人问这种问题非常感动
    sunchuo
        16
    sunchuo  
       2024-08-10 22:44:03 +08:00
    设计模式看一看,修饰模式。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2596 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 04:49 PVG 12:49 LAX 21:49 JFK 00:49
    Do have faith in what you're doing.
    ubao 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