【问题标题】:Passing method as parameter in PHP [duplicate]在PHP中将方法作为参数传递[重复]
【发布时间】:2013-09-13 11:48:02
【问题描述】:

我在 PHP 中有一个这样的类:

class RandomNumberStorer{

     var $integers = [];

     public function store_number($int){
         array_push($this->integers, $int);
     }

     public function run(){
         generate_number('store_number');
     }
}

...在其他地方,我有一个将函数作为参数的函数,例如:

function generate_number($thingtoDo){ 
     $thingToDo(rand());
}

所以我初始化了一个RandomNumberStorer 并运行它:

$rns = new RandomNumberStorer();
$rns->run();

我收到一条错误消息,指出“调用未定义函数 store_number”。现在,我知道store_numberRandomNumberStorer 类中,它更像是一种方法,但有什么方法可以将类方法传递给generate_number 函数?

我曾尝试将store_number 函数移出类,但随后我当然会收到与$this 的引用相关的错误,该引用移出类/实例的上下文。

我想避免将RandomNumberStorer 的实例传递给外部generate_number 函数,因为我在其他地方使用了这个函数。

这甚至可以做到吗?我设想的是这样的:

 generate_number('$this->store_number')

【问题讨论】:

  • 试试:generate_number(array($this, 'store_number'))
  • @elclanrs 成功了!不知道为什么。 generate_number 如何知道如何处理数组?
  • 这是一个 PHP 功能,请查看下面的答案,有很好的解释。
  • 除了是一个骗子,为什么 RandomDataStorer 会有一个方法运行?您的类存储随机数,这使其成为集合/数组数据类型的事物。或者它会生成数字,这使它成为一种服务。为什么会两者兼而有之?这似乎更像是一个设计问题。

标签: php function parameters


【解决方案1】:

您需要将当前实例的RandomNumberStore::store_number 方法描述为callable。手册页说这样做如下:

实例化对象的方法作为包含 索引 0 处的对象和索引 1 处的方法名称。

所以你要写的是:

generate_number([$this, 'store_number']);

顺便说一句,你也可以用另一种方式来做同样的事情,这从技术角度来看更糟糕,但更直观:

generate_number(function($int) { $this->store_number($int); });

【讨论】:

  • 从技术角度来看,使用闭包会更糟吗?
猜你喜欢
  • 2011-04-30
  • 2014-04-22
  • 2015-03-04
  • 1970-01-01
  • 2012-07-24
  • 2012-11-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多