在PHP中将方法作为参数传递

13

我有一个像这样的 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();

我收到一个错误,提示 'Call to undefined function store_number'。现在我明白了,由于 store_numberRandomNumberStorer 类中,它是一个方法,但是否有办法将一个类方法传递给 generate_number 函数?

我已经尝试将 store_number 函数移出类,但这样会导致一个关于在类/实例上下文之外引用 $this 的错误。

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

这种做法能行吗?我曾设想过以下代码:

 generate_number('$this->store_number')

1
尝试:generate_number(array($this, 'store_number')) - elclanrs
@elclanrs 它起作用了!不知道为什么。generate_number 如何知道如何处理数组? - Jon
这是一个PHP的特性,请查看下面的答案,有很好的解释。 - elclanrs
除了作为一个复制品之外,为什么RandomDataStorer会有一个run方法呢?你的类要么存储RandomNumbers,这使它成为一种Collection/Array数据类型的东西。要么生成数字,这使它成为一种Service类型的东西。为什么它要两者兼备呢?这似乎更多是一个设计问题,而不是其他任何问题。 - Gordon
1个回答

16

你需要将当前实例的RandomNumberStore::store_number方法描述为一个可调用函数。手册页面上指出:

实例化对象的方法被作为包含对象(索引0)和方法名称(索引1)的数组传递。

因此,你应该写成:

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

另外,你也可以用另一种更直观但技术上更糟糕的方式来做同样的事情:

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

2
从技术角度来看,使用闭包会有什么不好的地方? - Kalabasa
2
这可能更好,因为它没有使用任何字符串字面量。 - Szabolcs Páll

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接