在PHP中传递方法作为参数

Jon*_*Jon 10 php parameters function

我有一个PHP类,如下所示:

class RandomNumberStorer{

     var $integers = [];

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

     public function run(){
         generate_number('store_number');
     }
}
Run Code Online (Sandbox Code Playgroud)

...其他地方我有一个函数,它将一个函数作为参数,比如说:

function generate_number($thingtoDo){ 
     $thingToDo(rand());
}
Run Code Online (Sandbox Code Playgroud)

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

$rns = new RandomNumberStorer();
$rns->run();
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,说明有一个'调用未定义的函数store_number'.现在,我理解那是因为store_number它在RandomNumberStorer类中,它是一个更多的方法,但有什么方法可以将类方法传递给generate_number函数?

我已经尝试将该store_number函数移出类,但后来我当然得到一个与$this类/实例的上下文之外的引用有关的错误.

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

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

 generate_number('$this->store_number')
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 10

您需要RandomNumberStore::store_number将当前实例的方法描述为可调用方法.手册页说如下:

实例化对象的方法作为包含索引0处的对象和索引1处的方法名称的数组传递.

所以你要写的是:

generate_number([$this, 'store_number']);
Run Code Online (Sandbox Code Playgroud)

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

generate_number(function($int) { $this->store_number($int); });
Run Code Online (Sandbox Code Playgroud)

  • 从技术角度来看,使用闭包会变得更糟糕吗? (2认同)
  • 它可以说更好,因为它不使用任何字符串文字。 (2认同)