我创建了一个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();
...
}
这些似乎都不理想。
我还想过制作一个静态方法来包装构造函数和连接,但是构造函数必须是私有的,我还读过静态方法是不可取的(主要是单元测试)。
答案 0 :(得分:1)
我还读到静态方法是不可取的(主要用于单元测试)。
静态方法对于某些事情是不受欢迎的,但工厂方法不是其中之一。它们在那里非常有意义,不会影响单元测试。所以,继续做一个静态的工厂方法。
答案 1 :(得分:0)
最简单的方法是在构造函数中调用connect(),并确保使用析构函数来断开连接。