调用动态函数


PHP Calling dynamic functions

我想弄清楚如何调用函数基于什么用户点击一个表单。但我不确定我这样做是否正确。

我有很多类,比如3个不同的方式连接到一个网站,用户点击他们想要的。

    FTP >
  1. SFTP
  2. <
  3. SSH/gh>

我在代码中将其命名为service

我不想运行一大堆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

我不确定我这样做对不对。

任何帮助都将是非常感激的。

谢谢

首先,$service是一个不能调用method的字符串,因为它不是对象(类实例)。

我认为这是一个很好的例子,你可以使用策略模式,就像这样:

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);

我建议你读一读面向对象的设计模式——它会对你将来有很大的帮助。

这个怎么样:

$ftp_backup = new FTPBackup;
$sftp_backup = new SFTPBackup;
$ssh_backup = new SSHBackup;
$service = $request->input('service') . '_backup';
${$service}->testConn($request);

这叫做"Variables variable": http://php.net/manual/en/language.variables.variable.php

// Create class name
$className = $request->get('service') . '_backup';
// Create class instance
$service = new $className();
// Use it as you want
$service->testConn($request);