我正在编写一组类,这些类处理带有ftp和ftp(而不是sftp)协议的简单文件上传。
由于在PHP中使用ftp和ftps的唯一区别是连接函数,所以我认为可以在$connection_function($host);表单中使用变量函数,其中$connection_function具有ftp_connect()或ftp_ssl_connect()的值。
我做了一个抽象类来决定使用哪一种。为了清晰起见,我写道:
abstract class uploader {
protected $connection_function;
public function __construct($protocol) {
if ( $protocol == "ftp" ) {
$this->connection_function = "ftp_connect";
} elseif ( $protocol == "sftp" ) {
$this->connection_function = "ftp_ssl_connect";
}
}
public function upload($host, $file, ... ) {
$conn = $this->connection_function($host);
}
}
class ftp_uploader extends uploader {
parent::__construct("ftp");
}
class ftps_uploader extends uploader {
parent::__construct("ftps");
}我知道错误了
PHP Fatal error: Call to undefined method ftp_uploader::connection_function()
它显然来自于公共函数上传($host,$file,.){ $conn = $this->connection_ function ($host);}
因此,我突然想到,我已经编写了一个变量方法,而不是一个变量函数,它显然是PHP中不允许的(或者按照我的预期处理的)。
我能做我想做的事吗?抽象类处理所有ftp函数,我希望避免在两个类上重复代码。
编辑了,现在我已经看过它了,我看到我可以将协议决定放在对分方法本身中:
public function upload($host, $file, ... ) {
if ( $protocol == "ftp" ) {
$conn = ftp_connect($host);
} elseif ( $protocol == "sftp" ) {
$cont = ftp_ssl_connect($host);
}
}但是我仍然在想,有什么方法可以做我的变量方法吗?实际上,我仍然必须复制我的期望抛出错误处理和任何其他代码,我可能想要放入这些if-块。
发布于 2012-03-26 21:53:14
据解释器所知,您正在尝试调用该函数,而不是使用is作为变量:
public function upload($host, $file, ... ) {
$conn = $this->connection_function($host);
}相反,尝试如下:
public function upload($host, $file, ... ) {
$func = $this->connection_function;
$conn = $func($host);
}正如破碎机提到的,您也可以使用call_user_func(),这是他的答案的一个稍微修改的版本:
public function upload($host, $file, ... ) {
$conn = call_user_func_array($this->connection_function, func_get_args());
}对于这个特定的用例,这可能是最好的解决方案,因为您可以轻松地传递参数。
发布于 2012-03-26 21:56:24
我建议使用漏斗()来调用所需的函数。
public function upload($host, $file, ... ) {
$conn = call_user_func($this->connection_function,$host, $param2, $param3);
}如果要传递包含所有参数的数组,也可以使用数组()。
https://stackoverflow.com/questions/9880379
复制相似问题