2012-03-26 59 views
1

我正在編寫一組類來處理使用ftp和ftps(而不是sftp)協議進行簡單文件上傳。PHP中的變量方法?

由於PHP用ftp和FTPS之間的唯一區別是連接功能,我認爲我可以在形式$connection_function($host);,其中$connection_function具有值ftp_connect()ftp_ssl_connect()的使用變量函數。

我做了一個抽象類,決定使用哪個類。簡化爲清楚起見,我寫道:

abstract class uploader { 

    protected $connection_function; 

    public function __construct($protocol) { 
    if ($protocol == "ftp") { 
     $this->connection_function = "ftp_connect"; 
    } elseif ($protocol == "sftp") { 
     $this->connection_function = "ftp_ssl_connect"; 
    } 
    } 

    public function upload($host, $file, ...) { 
    $conn = $this->connection_function($host); 
    } 
} 

class ftp_uploader extends uploader { 
    parent::__construct("ftp"); 
} 

class ftps_uploader extends uploader { 
    parent::__construct("ftps"); 
} 

我得到的錯誤

PHP Fatal error: Call to undefined method ftp_uploader::connection_function()

這顯然來自 公共職能上傳($主機,$文件,...){$ 康涅狄格州= $ this-> connection_function($ host); }

所以發生,我認爲我已經寫了一個變量方法,而不是一個變量功能,這顯然是不允許的(或當作我希望它是)在PHP。

我可以做我想做的嗎?抽象類處理所有的ftp函數,我想避免在兩個類中重複代碼。

編輯現在,我已經看着它一點,我知道我可以只是把該協議決定在連接如方法本身:

public function upload($host, $file, ...) { 

    if ($protocol == "ftp") { 
     $conn = ftp_connect($host); 
    } elseif ($protocol == "sftp") { 
     $cont = ftp_ssl_connect($host); 
    } 

    } 

但我仍想知道,是有辦法做我的變量方法?事實上,我仍然需要重複拋出異常拋出錯誤處理以及其他任何我想放入這些if塊的代碼。

回答

5

至於翻譯知道,你要調用該函數,而不是使用是作爲一個變量:

public function upload($host, $file, ...) { 
    $conn = $this->connection_function($host); 
} 

相反,試試這個:

public function upload($host, $file, ...) { 
    $func = $this->connection_function; 
    $conn = $func($host); 
} 

而作爲crashspeeder提到,您也可以使用call_user_func(),這裏是他的回答的稍微修改版本:

public function upload($host, $file, ...) { 
    $conn = call_user_func_array($this->connection_function, func_get_args()); 
} 

對於這個特定的用例,這可能是最好的解決方案,因爲您可以輕鬆傳遞參數。

+1

'$ this - > {$ this-> connection_function}($ host);'是做同樣的 – AD7six 2012-03-26 21:57:10

+0

aw的另一種方法(在這種情況下非常難看)...我認爲花括號很漂亮! – user151841 2012-03-26 21:57:47

+0

@ AD7six正試圖找到一種方法來使用'{}';然而,他正在調用本地函數,而不是該類中的函數。 – 2012-03-26 21:59:55

4

我會推薦使用call_user_func()來調用你想要的功能。

public function upload($host, $file, ...) { 
    $conn = call_user_func($this->connection_function,$host, $param2, $param3); 
} 

您還可以,如果你想通過包含所有參數數組call_user_func_array()