首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PHP中的变量方法?

PHP中的变量方法?
EN

Stack Overflow用户
提问于 2012-03-26 21:49:45
回答 2查看 249关注 0票数 1

我正在编写一组类,这些类处理带有ftp和ftp(而不是sftp)协议的简单文件上传。

由于在PHP中使用ftp和ftps的唯一区别是连接函数,所以我认为可以在$connection_function($host);表单中使用变量函数,其中$connection_function具有ftp_connect()ftp_ssl_connect()的值。

我做了一个抽象类来决定使用哪一种。为了清晰起见,我写道:

代码语言:javascript
运行
复制
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函数,我希望避免在两个类上重复代码。

编辑了,现在我已经看过它了,我看到我可以将协议决定放在对分方法本身中:

代码语言:javascript
运行
复制
  public function upload($host, $file, ... ) {

    if ( $protocol == "ftp" ) {
      $conn = ftp_connect($host);
    } elseif ( $protocol == "sftp" ) {
      $cont = ftp_ssl_connect($host);
    }

  }

但是我仍然在想,有什么方法可以做我的变量方法吗?实际上,我仍然必须复制我的期望抛出错误处理和任何其他代码,我可能想要放入这些if-块。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-26 21:53:14

据解释器所知,您正在尝试调用该函数,而不是使用is作为变量:

代码语言:javascript
运行
复制
public function upload($host, $file, ... ) {
  $conn = $this->connection_function($host);
}

相反,尝试如下:

代码语言:javascript
运行
复制
public function upload($host, $file, ... ) {
  $func = $this->connection_function;
  $conn = $func($host);
}

正如破碎机提到的,您也可以使用call_user_func(),这是他的答案的一个稍微修改的版本:

代码语言:javascript
运行
复制
public function upload($host, $file, ... ) {
  $conn = call_user_func_array($this->connection_function, func_get_args());
}

对于这个特定的用例,这可能是最好的解决方案,因为您可以轻松地传递参数。

票数 5
EN

Stack Overflow用户

发布于 2012-03-26 21:56:24

我建议使用漏斗()来调用所需的函数。

代码语言:javascript
运行
复制
public function upload($host, $file, ... ) {
    $conn = call_user_func($this->connection_function,$host, $param2, $param3);
}

如果要传递包含所有参数的数组,也可以使用数组()

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9880379

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档