2011-02-23 39 views
1

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

這些都不是理想的。我也考慮過製作一個靜態方法,它將包裝構造函數和連接,但構造函數必須是私有的,而且我也讀過靜態方法是不受歡迎的(主要是爲了單元測試)。

+1

查找'singleton'方法。它們僅用於此目的,即「一次調用」方法。 – 2011-02-23 15:21:40

+0

@Marc'singleton pattern'將會是正確的術語..;)即使+1 :) – 2011-02-23 15:24:42

+0

我寫的連接方法是單例方法。我不想使用它。 – 2011-02-23 15:27:46

回答

1

我也讀過靜態方法是不可取的(主要是爲了單元測試)。

靜態方法是不可取的一些事情,但工廠方法是不是其中之一。它們在那裏非常有意義,不會影響單元測試。所以,繼續做一個靜態工廠方法。

0

最簡單的方法是在您的構造函數中調用connect(),並確保使析構函數斷開連接。

相關問題