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相关问答推荐

为什么注册SIGHUP的处理程序函数会阻止在PHP CLI中等待输入时点击X关闭Xterm窗口?""

FatFreeFramework上的不同路由

照明\Support\Collection::Filter():参数#1($Callback)的类型必须为?可调用、已给定数组、已调用

根据未用于变体的产品属性隐藏WooCommerce发货方式

如何在Foreach语句中使用php和li按降序排序?

使用列入黑名单的单词和自定义业务逻辑的组合将特定的子字符串包装在HTML标记中

Mod_重写子目录中相应的php文件

如何在汇总表构建器中操作LALAVEL细丝Sum::Make()值

如何将LARAVEL模块路径和项目路径合并,因为当我使用模块路径时,它们会覆盖项目路径

未收到Strava WebHook事件数据

Laravel 10中的Validator类

PHP按另一个二维数组的排序顺序对二维数组进行排序

dyld[45923]:未加载库:/usr/local/opt/libavif/lib/libavif.15dylib

PHP简单地将物品装在盒子里会导致未使用的空间,但还有剩余容量

根据WooCommerce中选定的变体重量更改输入数量步值

使用其ID查询和捕获与订单相关的其他详细信息的shopware 6方法

PHP header() 是否缓存重定向,如果是,如何防止它这样做?

如何将子查询结果添加到学说 2 中主查询的末尾?

为什么非贪婪匹配会消耗整个模式,即使后面跟着另一个非贪婪匹配

服务器发送的事件:EventSource 抛出 MIME 错误