如何使用类方法作为回调

问题描述 投票:0回答:5

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

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...
    }   
    
}
php oop callback
5个回答
237
投票

查看

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

可调用


  • PHP 函数 通过其名称作为字符串传递。可以使用任何内置或用户定义的函数,但语言构造除外,例如: array()echoempty()eval()exit()isset( )list()printunset()
// 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... });



36
投票
从 PHP 8.1 开始,我们现在拥有

一流的可调用对象。他们使用语法$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... } }
这三个点不是参数的省略/占位符。它们是创建可调用对象的特殊语法。如果该方法不接受参数,则语法保持不变。


16
投票
从5.4开始有一种更优雅的方式可以编写它,我仍在尝试找出是否可以进一步减少

$this->processSomething(function() { $this->myCallback(); });
自 8.1 起,PHP 具有

第一类可调用语法

$this->processSomething( $this->myCallback(...); );
    

14
投票
您还可以使用

call_user_func() 来指定回调:

public function myMethod() { call_user_func(array($this, 'myCallback')); } private function myCallback() { // do something... }
    

0
投票
您可以将方法返回类型设置为

callable

。它适用于 PHP 7.1

protected function myMethod(): callable { return function (int $j) { }; }
然后这样称呼它:

someFunction($this->myMethod());
    
© www.soinside.com 2019 - 2024. All rights reserved.