PHP调用动态函数

Big*_*ies 1 php laravel laravel-5

我试图弄清楚如何根据用户点击表单来调用函数.但我不确定我是否正确行事.

我有很多课程,让我们说3用于连接网站的不同方式,用户点击他们想要的那个.

  1. FTP
  2. SFTP
  3. SSH

我在我的代码中将其命名为"service".

我不想运行一大堆IF语句,我宁愿尝试动态构建调用.

我目前所拥有的内容如下

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

$service = $request->input('service') . '_backup';
$service->testConn($request);
Run Code Online (Sandbox Code Playgroud)

我得到以下错误

Call to a member function testConn() on string
Run Code Online (Sandbox Code Playgroud)

我不确定我这样做是对的.

任何帮助将不胜感激.

谢谢

Rud*_*ski 5

首先,$ service是一个字符串,你不能在其上调用方法,因为它不是一个对象(类实例).

我认为这是一个很好的例子,您可以使用战略模式,如下所示:

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后就在你想要调用它的地方你可以通过以下方式调用它:

$service = new BackupStrategy($request->input('service'));
$service->testConn($request);
Run Code Online (Sandbox Code Playgroud)

我建议您阅读OOP中的设计模式 - 它将在未来为您提供很多帮助.