php 如何使用类方法作为回调

jtjikinw  于 2023-02-18  发布在  PHP
关注(0)|答案(5)|浏览(128)

我有一个类,其中的方法可以用作回调函数。
我如何将它们作为参数传递?

Class MyClass {
    
    public function myMethod() {
        // How should these be called?
        $this->processSomething(this->myCallback);
        $this->processSomething(self::myStaticCallback);
    }

    private function processSomething(callable $callback) {
        // Process something...
        $callback();
    }

    private function myCallback() {
        // Do something...
    }

    private static function myStaticCallback() {
        // Do something...
    }   
    
}
qzwqbdag

qzwqbdag1#

查看callable manual,了解将函数作为回调传递的所有不同方法,我将该手册复制到这里,并根据您的场景添加了每种方法的一些示例。

可调用

PHP函数通过其名称作为字符串传递。可以使用任何内置或用户定义的函数,但语言构造除外,例如: 数组() 回显 空() 求值() 退出() 设置() 列表() 打印 * 或 * 取消设置()*。

// Not applicable in your scenario
  $this->processSomething('some_global_php_function');
  • 示例化对象方法作为数组传递,数组包含索引为 0 的对象和索引为 1 的方法名。
// Only from inside the same class
  $this->processSomething([$this, 'myCallback']);
  $this->processSomething([$this, 'myStaticCallback']);
  // From either inside or outside the same class
  $myObject->processSomething([new MyClass(), 'myCallback']);
  $myObject->processSomething([new MyClass(), 'myStaticCallback']);

*静态类方法也可以通过传递类名而不是索引 0 处的对象来传递,而无需示例化该类的对象。

// Only from inside the same class
  $this->processSomething([__CLASS__, 'myStaticCallback']);
  // From either inside or outside the same class
  $myObject->processSomething(['\Namespace\MyClass', 'myStaticCallback']);
  $myObject->processSomething(['\Namespace\MyClass::myStaticCallback']); // PHP 5.2.3+
  $myObject->processSomething([MyClass::class, 'myStaticCallback']); // PHP 5.5.0+
  • 除了常见的用户定义函数外,匿名函数也可以传递给回调参数。
// Not applicable in your scenario unless you modify the structure
  $this->processSomething(function() {
      // process something directly here...
  });
taor4pac

taor4pac2#

从PHP 8.1开始,我们有了first-class callables。它们使用语法$callable = functionName(...)。三个点是语法的一部分,而不是省略。
可以使用新语法创建可调用的类方法。

Class MyClass {
    
    public function myMethod() {
        // first-class callables
        $this->processSomething($this->myCallback(...));
        $this->processSomething(self::myStaticCallback(...));
    }

    private function processSomething(callable $callback) {
        // Process something...
        $callback();
    }

    private function myCallback() {
        // Do something...
    }

    private static function myStaticCallback() {
        // Do something...
    }   
    
}

这三个点不是参数的省略/占位符。它们是创建可调用对象的特殊语法。如果方法不接受参数,语法保持不变。

rsl1atfo

rsl1atfo3#

因为5.3有一种更优雅的方式可以编写它,我仍然在尝试找出是否可以减少更多

$this->processSomething(function() {
    $this->myCallback();
});
sqxo8psd

sqxo8psd4#

您还可以使用call_user_func()来指定回调:

public function myMethod() {

    call_user_func(array($this, 'myCallback'));
}

private function myCallback() {
    // do something...
}
eulz3vhy

eulz3vhy5#

可以将方法的返回类型设置为callable。它适用于PHP 7.1

protected function myMethod(): callable
{
    return function (int $j) {
    };
}

那就这么叫吧:

someFunction($this->myMethod());

相关问题