PHP - 面向对象的实践和继承

时间:2012-04-25 05:55:02

标签: php

这是基本的班级设计

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()。这可能是魔法功能吗?

3 个答案:

答案 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()方法时都会执行此类操作,那么您应该使用某种包含(以装饰器的形式或仅使用标准的对象组合)。

基本上,您需要重新构建代码。