PHP调用动态函数
我想知道如何根据用户在表单上单击的内容调用函数。但是我不确定我是否做对了 我有很多类,比如说3种不同的方式连接到一个网站,用户点击他们想要的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
$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类只负责选择合适的*备份类。这让我看到了一种全新的编码方式。。。我真的很感激!