这是基本的班级设计
class CustomModule {
public __construct() { }
//Run me first automaticly
public function exec($str) { }
}
class Randomizer extends CustomModule {
public __construct() { }
//Call me
public function exec($str) { }
}
在为外部开发人员设计插件/模块系统时,我需要首先运行CustomModule->exec()
,我不想让devs必须调用 base->exec($str)
。
我想在调用CustomModule::exec()
之前自动调用Randomizer::exec()
,而不必将代码放入Randomizer::exec()
。这可能是魔法功能吗?
答案 0 :(得分:3)
在我看来,我会用这种方式: 您可以在Randomizer中定义构造函数并调用parent :: _construct
,而不是在Randomizer的exec中调用_ 构造。class CustomModule {
//Run me first automaticly
public function exec($str) { }
public __construct($str) {
$this->exec($str);
}
}
class Randomizer extends CustomModule {
//Call me
public function exec($str) {
parent::__construct($str);
}
}
答案 1 :(得分:2)
经过一番思考,我意识到这是一个不好的设计。我必须保持代码库简单和可扩展,这只会使大型项目变得混乱。
由于调用Randomizer :: exec()的唯一程序是我内部构建的程序,我可以在前一行调用CustomModule :: exec()并得到一个布尔响应,看它是否应继续到下一行。
很抱歉不得不结束这个Q'简短
答案 2 :(得分:2)
如果您的对象需要进行一些初始化才能“将其释放到应用程序的其余部分,那么这意味着您需要一个工厂。这就是您应该如何解决它,如果您只需要调用某些方法一次。
如果每次调用exec()
方法时都会执行此类操作,那么您应该使用某种包含(以装饰器的形式或仅使用标准的对象组合)。
基本上,您需要重新构建代码。