【问题标题】:Enforce Method Call Required by Object强制对象所需的方法调用
【发布时间】:2011-07-02 20:19:54
【问题描述】:

我创建了一个 ssh2 包装器。我读过构造函数不应该失败,所以 ssh2 连接不是在包装器中完成的,而是通过方法connect() 完成的。我的问题是:如何确保调用 connect()?我也真的只需要调用一次。

class uploader {
   private $user; private $pass; private $host;
   private $ssh = null; private $sftp = null;
   public function __construct($host, $user, $pass) {
      $this->host = $host; $this->user = $user; $this->pass = $pass;
   }
   public function connect() {
      if ($this->ssh === null) {
         $this->ssh = ssh2_connect($this->host);
         ssh2_auth_password($this->ssh, $this->user, $this->pass);
         $this->sftp = ssh2_sftp($this->ssh);
      }
   }
}

确保调用 connect() 的最佳方法是什么?应用程序应该调用它吗?

$ssh = new uploader('host', 'user', 'pass');
$ssh->connect();

还是在类方法中?

...
public function upload($source, $dest, $filename) {
   $this->connect();
   ...
}

public function delete($file) {
   $this->connect();
   ...
}

这些似乎都不理想。

我还考虑过创建一个静态方法来包装构造函数并进行连接,但是构造函数必须是私有的,而且我还读到静态方法是不可取的(主要用于单元测试)。

【问题讨论】:

  • 查找“单例”方法。它们仅用于此目的,即“调用一次”方法。
  • @Marc singleton pattern 将是正确的术语.. ;) 即使 +1 :)
  • 我写的connect方法是单例方法。我不想使用它。
  • @david.wosnitza 我不希望这是一个单身人士。然后,我不能同时拥有两个不同的 ssh2 连接。我可以把它改成工厂,但正如我在帖子中所说,如果我能提供帮助,我不想使用静态方法。

标签: php oop design-patterns methods


【解决方案1】:

我还了解到静态方法是不可取的(主要用于单元测试)。

静态方法在某些情况下是不可取的,但工厂方法不是其中之一。它们在那里非常有意义,并且不会影响单元测试。所以,继续做一个静态工厂方法。

【讨论】:

    【解决方案2】:

    最简单的方法是在你的构造函数中调用 connect() 并确保创建一个析构函数来断开你的连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-29
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      相关资源
      最近更新 更多