根据选择的接口实现接口

Implementing interface based on the chosen interface

所以如果我有一个接口 iConnection

interface iConnection
{
}

实现者:

class OutlookConnection implements iConnection
{
}

class GoogleConnection implements iConnection
{
}

还有另一个界面iComparison

interface iComparison
{
}

实现者:

class OutlookComparison implements iComparison
{
  private $connection;
  public function __construct($user, iConnection $iConnection) {
   $this->connection = $iConnection;
  }
}

class GoogleComparison implements iComparison
{
  private $connection;
  public function __construct($user, iConnection $iConnection) {
   $this->connection = $iConnection;
  }
}

在主程序中,我希望能够根据 iConnection 类型在 GoogleComparison 和 OutlookComparison 之间切换,而无需使用 if 或 switch 语句:

public function __construct(iConnection $connection)
{
    $this->connect = $connection;
    if($this->connection instanceof GoogleConnection){
      $this->comparison = new GoogleComparison();
    }
    elseif($this->connection instanceof OutlookConnection){
      $this->comparison = new OutlookComparison();
    }
}

这是否可以在没有 switch 或 if 语句的情况下在此构造函数中实现?

这是一个架构问题。我建议将提供 comparison 的责任转移给 connection一种可能的解决方案如下所示

首先 - 接口获取 getter 存根:

interface iConnection
{
    public function getComparison();
}

然后 - 所有不同的连接都按照您的需要实现它,例如:

class OutlookConnection implements iConnection
{
    public function getComparison()
    {
        return new OutlookComparison();
    }
}

最后,您的构造类似于:

public function __construct(iConnection $connection)
{
    $this->connect = $connection;
    $this->comparison = $connection->getComparison();
}

从现在开始,您可以对比较 属性 进行操作,也可以只对 $this->connect->getComparison()->fooBarBaz() 进行操作。一切都取决于您的需求。