【问题标题】:How to make PHP libraries loosely coupled? [closed]如何使 PHP 库松耦合? [关闭]
【发布时间】:2013-04-20 08:03:49
【问题描述】:

我的“框架”中有一些库,如路由、配置、记录器……我希望它们彼此独立,就像一些著名的 PHP 框架制作它们一样。

我了解松散耦合的所有原则,但我不知道如何同时遵循松散耦合和 DRY 原则。如果我制作配置和记录器的路由库,那么我不会重复自己,但如果我想单独使用路由器,它将无法工作。同样,如果我将日志记录和配置代码写入我的路由库,我会重复自己。

【问题讨论】:

  • 你看过设计模式吗?像工厂、单身人士、观察者、指挥链等?
  • @yossarian:松散耦合的单例?真的吗?
  • 单例在 PHP 世界中被广泛认为是反模式有几个原因。尽可能避免使用它们。
  • 我同意,避免单例,但其他模式可能有用:)

标签: php oop language-agnostic


【解决方案1】:

松散耦合通常意味着您的组件不需要具体实例,而只需要一个具有兼容接口的实例。

每个协作者都可以替换为相同类型的不同协作者。代码不再依赖于其中之一的具体实现。

所以:

  • 不要使用:

    • 全局(静态)函数

      Foo:bar();
      
    • 基于类的编程(传递类名)

      stream_wrapper_register("var", "VariableStream");
      
    • 全局常量

      if ( !defined('ABSPATH') )   
          define('ABSPATH', dirname(__FILE__) . '/');
      
  • 但是:

    • 使用对象

      $foo->bar();
      
    • 针对接口编程

      public function __construct(LoggerInterface $logger) {
      
    • 使用模拟进行单元测试

      $logger = $this->getMock('LoggerInterface', array('log'));
      

参见:

【讨论】:

  • 观看此演讲:它提供了关于如何在代码中遵循 SOLID 原则的真实示例:youtube.com/watch?v=S4Fmzvsvt_o
  • 是的,它基于 NikiC 链接的文章。很好听,但音质很糟糕,很难听。
猜你喜欢
  • 1970-01-01
  • 2017-05-09
  • 2010-11-28
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多