PHP调用动态函数

PHP调用动态函数,php,laravel,laravel-5,Php,Laravel,Laravel 5,我想知道如何根据用户在表单上单击的内容调用函数。但是我不确定我是否做对了 我有很多类,比如说3种不同的方式连接到一个网站,用户点击他们想要的 FTP SFTP SSH 我在代码中将其命名为“服务” 我不想运行一大堆IF语句,我宁愿尝试动态地构建调用 我目前的情况如下 $ftp_backup = new FTPBackup; $sftp_backup = new SFTPBackup; $ssh_backup = new SSHBackup; $service = $request->in

我想知道如何根据用户在表单上单击的内容调用函数。但是我不确定我是否做对了

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

  • FTP
  • SFTP
  • 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
    
    我不确定我做得对不对

    任何帮助都将不胜感激


    谢谢

    首先,$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();
        }
    }
    
    然后在你想叫它的地方,你叫它:

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

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

    首先,$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();
        }
    }
    
    然后在你想叫它的地方,你叫它:

    $service = new BackupStrategy($request->input('service'));
    $service->testConn($request);
    
    我建议您阅读OOP中的设计模式-这将在将来对您有很大帮助。

    这方面如何:

    $ftp_backup = new FTPBackup;
    $sftp_backup = new SFTPBackup;
    $ssh_backup = new SSHBackup;
    
    $service = $request->input('service') . '_backup';
    ${$service}->testConn($request);
    
    这被称为“变量”:

    这个怎么样:

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

    这被称为“变量”:

    这是完美的。。对我来说,它似乎把事情简化得难以置信。。。我一直在学习一些坚实的原则。。。谢谢你不客气:)如果你觉得它有用,你可以接受它作为回答。如果你不介意,还有一件事。。。每个*Backup()类都实现一个接口。。。这个BackupStrategy是一个独立的类,还是我把它放在某个地方?是的,它可以是独立的,因为接口实现是专用的,并且只有每个*备份类知道。BackupStrategy类只负责选择合适的*备份类。这让我看到了一种全新的编码方式。。。我真的很感激!这太完美了。。对我来说,它似乎把事情简化得难以置信。。。我一直在学习一些坚实的原则。。。谢谢你不客气:)如果你觉得它有用,你可以接受它作为回答。如果你不介意,还有一件事。。。每个*Backup()类都实现一个接口。。。这个BackupStrategy是一个独立的类,还是我把它放在某个地方?是的,它可以是独立的,因为接口实现是专用的,并且只有每个*备份类知道。BackupStrategy类只负责选择合适的*备份类。这让我看到了一种全新的编码方式。。。我真的很感激!