PHP类与全局设置耦合

时间:2013-04-25 05:32:22

标签: php class inversion-of-control

我需要一些关于我正在使用的项目的设计模式的建议。假设我有很多类将使用依赖注入和IoC容器进行实例化。很多这些类将依赖于“环境”设置,例如依赖于服务器位置的memcached类,以及依赖于SQL主机详细信息的SQL类,但我不确定如何编写此依赖项。

我可以将这些写入课堂,但它并不灵活。如果我让类使用全局变量,我觉得它们不再松散耦合,单元测试将更难完成。因此,如何保持松散的类耦合但是从中心位置维护这些设置?

如果服务器设置改变,我不想挖掘12个PHP脚本来更改每个设置。

理想情况下,我想:

  • 集中设置和配置
  • 不隐式耦合到外部实体的类
  • 能够进行单元测试!

干杯! 阿德里安

3 个答案:

答案 0 :(得分:5)

我必须承认我是KISS的粉丝。根据你的写作,我会做以下事情:

创建一个包含变量的配置类:

class Configuration {
     protected $sqlUser = "myUser";
     protected $sqlPass = "myPass";
     // ... and the remaining config variables

     public function getSQLUser() {
         return $this->sqlUser();
     }

     public function getSQLPass() {
         return $this->sqlPass;
     }
     // ... and the remaining getters
}

这使您可以完全控制将来如何继续进行配置。例如,您可以通过更改此课程

  • 从本地配置文件中读取
  • 根据服务器的计算机名称(或任何其他属性)生成它
  • 如果您正在运行测试,则会改变它

我自己这样做。这足以满足我的需要,它避免了建筑摩天大楼。

答案 1 :(得分:1)

配置永远不应该存在于您的代码中。维护凭证或值来操作不是代码的“工作”,应该将这些值交给他们。

对此的一个很好的解读和解决方案是The Twelve-Factor App,它将告诉您将这些存储在环境中(通常是服务器上的环境变量)而不是代码。

答案 2 :(得分:0)

class App {

    public function getConfig($conf_name){
        return new Config($conf_name);
    }
}

class Config {

    private $DB_host = '127.0.0.1';

    function __construct($conf_name){
        //return config
    }

}

class DB extends App {

    public function conn(){
        $this->getConfig('DB');
        //.......
    }
}
相关问题