我想弄清楚如何调用函数基于什么用户点击一个表单。但我不确定我这样做是否正确。
我有很多类,比如3个不同的方式连接到一个网站,用户点击他们想要的。
- FTP >
- SFTP <
- 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);