我试图弄清楚如何根据用户点击表单来调用函数。但我不确定我是否正确行事。
我有很多课程,让我们说3以不同的方式连接到网站,用户点击他们想要的那个。
我已将其命名为' 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
我不确定我是否正确行事。
非常感谢任何帮助。
由于
答案 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);