依赖项注入设置在基类中,并具有将依赖项作为扩展请求的类


Dependency injection setters in a base class and having classes requring dependencies as extensions

如果我使用setter进行依赖项注入,并且许多类都需要相同的依赖项,那么我是否应该让所有这些类都扩展一个基类,其中包含用于依赖项的setter?

例如:

假设我有三个类:Page、Article、Comment,它们都依赖于$db和$user。

有一个基类Dependencies的优点或缺点是什么,比如:

    class Dependencies
    {
        private $database;
        private $user;
        final public function setDatabase($dbh)
        {
            $this->database = $dbh;
        }
        final public function setUser($user)
        {
            $this->user = $user;
        }
    }

然后将其他类作为依赖的扩展

class Article extends Dependencies
{
    public function __construct()
    {
        // some code
    }
    // some other functions that use $this->database and $this->user
}

而不是在每个单独的类(Article、Page和Comment)中都存在setDatabase和setUser。

谢谢。

拥有一个名为Dependencies的类是个坏消息。文章不是依赖项的子类型。

这是特征可能更合适的地方。

trait DatabaseOwner
{
  private $database;
  final public function setDatabase($dbh)
  {
    $this->database = $dbh;
  }
}
class Article
{
  use DatabaseOwner;
}

如果你发现自己经常使用同一组特征,你可以创建由多个特征组成的特征。

然而,话虽如此:如果这三个类都来自某个名称更好的类,该类表示is-a关系,并且它实现了这些函数(或使用了特性),因为它是基类型的固有函数,那么这是完全可以接受的。

但在我看来,仅仅因为事物碰巧共享某些属性而创建一个单一的基类是不好的。