【问题标题】:PHP Class Coupling with Global SettingsPHP 类与全局设置耦合
【发布时间】:2013-04-25 05:32:22
【问题描述】:

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

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

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

理想情况下,我希望:

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

干杯! 阿德里安

【问题讨论】:

    标签: php class inversion-of-control


    【解决方案1】:

    我不得不承认我是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
    }
    

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

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

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

    【讨论】:

    • 太好了,谢谢 Likeitlikeit!我也可以使用这个将依赖注入!
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:
      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');
              //.......
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-11-25
        • 2011-05-24
        • 2012-05-18
        • 2018-11-19
        • 2011-02-11
        • 2011-10-14
        相关资源
        最近更新 更多