强制执行Object所需的方法调用

时间:2011-02-23 15:18:43

标签: php oop design-patterns methods

我创建了一个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();
   ...
}

这些似乎都不理想。

我还想过制作一个静态方法来包装构造函数和连接,但是构造函数必须是私有的,我还读过静态方法是不可取的(主要是单元测试)。

2 个答案:

答案 0 :(得分:1)

  

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

静态方法对于某些事情是不受欢迎的,但工厂方法不是其中之一。它们在那里非常有意义,不会影响单元测试。所以,继续做一个静态的工厂方法。

答案 1 :(得分:0)

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