2016-10-26 145 views
1

我試圖弄清楚如何根據用戶在窗體上單擊來調用函數。但我不知道如果我做對了。PHP調用動態函數

我有很多類,讓我們說3不同的方式來連接到一個網站,用戶點擊他們想要的。

  1. FTP
  2. SFTP
  3. SSH

我已經在我的代號爲 '服務'。

我不想運行大量的IF語句,我寧願嘗試動態構建調用。

我目前所面對的是如下

$ftp_backup = new FTPBackup; 
$sftp_backup = new SFTPBackup; 
$ssh_backup = new SSHBackup; 

$service = $request->input('service') . '_backup'; 
$service->testConn($request); 

即時得到以下錯誤

Call to a member function testConn() on string 

林不知道IM這樣做的權利。

任何幫助將不勝感激。

感謝

回答

5

所有$服務的首先是你不能調用方法,因爲它不是一個對象(類的實例)的字符串。

我認爲這是在那裏你可以使用策略模式一個很好的例子,它看起來像:

class BackupStrategy { 
    private $strategy = null; 

    public function __construct($service_name) 
    { 
     switch ($service_name) { 
      case "ftp": 
       $this->strategy = new FTPBackup(); 
      break; 
      case "sftp": 
       $this->strategy = new SFTPBackup(); 
      break; 
      case "ssh": 
       $this->strategy = new SSHBackup(); 
      break; 
     } 
    } 

    public function testConn() 
    { 
     return $this->strategy->testConn(); 
    } 
} 

然後在地方,你怎麼稱呼它您可以通過調用它:

$service = new BackupStrategy($request->input('service')); 
$service->testConn($request); 

我建議您閱讀關於OOP中的設計模式 - 它將在未來幫助您很多。

+0

這是完美的。它似乎把事情簡單化難以置信,我......我一直學習固體原理有點...謝謝 – BigJobbies

+0

不客氣:)如果你覺得它有用你可以接受是作爲一個答案。 –

+0

還有一件事,如果你不介意......每個* Backup()類實現一個接口......這個BackupStrategy只是一個獨立的類,或者我將它插入某個地方 – BigJobbies

0
// Create class name 
$className = $request->get('service') . '_backup'; 

// Create class instance 
$service = new $className(); 

// Use it as you want 
$service->testConn($request);