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

256 天前
 cokar

我正在开发一款 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 版权声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请保留以上作者信息和原文链接。

2931 次点击
所在节点    PHP
16 条回复
google2020
256 天前
换个插件方法。学 WordPress 的 hook 机制,插入过程用 Action ,过滤数据用 Filter ,非常好用。
Ashe007
256 天前
代理模式之————动态代理
iminto
256 天前
多看看设计模式,看多了就逐渐懂了。

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

PHP 这样的语言要实现你要的效果应该更简单,只是不够优雅而已
cookii
256 天前
责任链了解一下
oneisall8955
256 天前
代理模式
timethinker
255 天前
插件有多个,这也就意味着它是一个列表形式的存在,你应该在某一个时机调用所有插件的某一个方法,这个方法签名是你定义的,类似接口一样的东西。比如里面有一个方法叫做 onRequest(Request),插件负责实现这个方法,然后把插件实例注册到你的插件列表中,这样你就可以在合适的时机遍历插件列表进行调用。
cokar
255 天前
多谢各位大佬解答,大概有方向了
liaoxx
255 天前
Trait ?
horizon
255 天前
依赖反转,你定义接口,插件实现接口,你在 core 中实例化插件,调用插件。
lisongeee
255 天前
请问 php 的类实例化后的实例对象的函数是不是可修改的属性,这个实例是不能直接修改属性为新函数引用吗?
Dynesshely
255 天前
@horizon 正解, OP 应该定义接口, 然后使用默认的实现, 插件可以提供新的实现
YassoWithSpeaker
254 天前
面向接口编程哇,接口不就解决多继承问题么。
zhtyytg
254 天前
@horizon 朴实无华的依赖注入,依旧是万能答案
panlatent
253 天前
@lisongeee 是也不是,反射 API 可以修改定义。但一般是测试框架来用。OP 这个有很多种设计方式可以解决问题
8355
253 天前
现在还有人问这种问题非常感动
sunchuo
137 天前
设计模式看一看,修饰模式。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1032262

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX