PHP调用动态函数

时间:2016-10-26 07:30:56

标签: php laravel laravel-5

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

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

  1. FTP
  2. SFTP
  3. SSH
  4. 我已将其命名为' 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
    

    我不确定我是否正确行事。

    非常感谢任何帮助。

    由于

3 个答案:

答案 0 :(得分:5)

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

我认为这是一个很好的例子,你可以在哪里使用战略模式:

    class ViewController3: UIViewController {

    @IBOutlet weak var nextVc: UIBarButtonItem!

    override func viewDidLoad() {
        super.viewDidLoad()

        nextVc.action = #selector(self.gotoVC4)

    }

    func gotoVC4() -> Void {


        print("go to vc4")

        let vc4 = ViewController4()
        self.navigationController!.pushViewController(vc4, animated: true)

    }


}

然后就在你要打电话的地方你可以通过:

来调用它
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();
    }
}

我建议您阅读OOP中的设计模式 - 它将来会对您有所帮助。

答案 1 :(得分:0)

这个怎么样:

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

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

这称为"变量变量":http://php.net/manual/en/language.variables.variable.php

答案 2 :(得分:0)

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

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

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