I have a class with methods that I want to use as callbacks.
How can I pass them as arguments?

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...
    }   
    
}

推荐答案

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

可呼叫


  • PHP function以字符串的形式传递其名称.除了array()echoempty()eval()exit()isset()list()printunset()等语言构造之外,可以使用任何内置或用户定义的函数.
  // Not applicable in your scenario
  $this->processSomething('some_global_php_function');

  • method of an instantiated object作为数组传递,该数组包含索引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']);

  • Static class methods也可以通过传递类名而不是索引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+

  • 除了常见的用户定义函数外,anonymous functions还可以传递给回调参数.
  // Not applicable in your scenario unless you modify the structure
  $this->processSomething(function() {
      // process something directly here...
  });

Php相关问答推荐

Laravel 多对多获取与我没有关系的元素

正则表达式

WooCommerce 获取产品属性分类值

为准备好的语句动态生成类型定义字符串

在Laravel代码中定义数据库中字段的值,以使代码更具可读性

laravel Passport 身份验证代码 - 要求授予权限,是否需要?

Laravel PackageManifest.php:未定义索引:名称

如何降级或安装特定版本的 Composer?

dyld:库未加载:/usr/local/opt/icu4c/lib/libicui18n.62.dylib 在 Mac 上使用 brew 安装节点后运行 php 错误

如何将 Blade 模板视图作为原始 HTML 字符串?

获取初始运行脚本的绝对路径

laravel 5.5 页面由于不活动而过期.请刷新并重试

dyld:库未加载:/usr/local/lib/libjpeg.8.dylib - homebrew php

composer :file_put_contents(./composer.json):无法打开流:权限被拒绝

PHP中三个点(...)是什么意思?

如何在没有 Composer 的情况下安装 Composer PHP 包?

有没有办法在 PHP 中扩展特征?

更改 laravel 视图页面中的日期格式

Laravel 请求使用查询字符串获取当前路径

使用 Postman 通过原始 JSON 发送 POST 数据