0

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

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

如果服务器设置发生变化,我不想深入研究 12 个 PHP 脚本来更改每个设置。

理想情况下,我想:

  • 集中设置和配置
  • 没有隐式耦合到外部实体的类
  • 仍然可以进行单元测试!

干杯! 阿德里安

4

3 回答 3

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
}

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

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

我自己就是这样做的。这足以满足我的需要,并且避免了建筑摩天大楼主义。

于 2013-05-02T17:27:12.187 回答
1

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

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

于 2013-05-03T14:25:26.290 回答
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');
        //.......
    }
}
于 2013-05-06T08:55:23.660 回答