【问题标题】:Pass a static function of an abstract class as a callback function将抽象类的静态函数作为回调函数传递
【发布时间】:2014-06-05 20:46:27
【问题描述】:

假设我们已经实现了一个包含一些工具的抽象类。比如一个邮件函数:

abstract class Tools {
    public static function sendMail () {
        // do some magic mail sending
    }
}

现在我们有了一个 index.php 文件,它使用了例如 Flight 框架(不介意具体是哪个框架)。

在这个 index.php 中,我们定义了一些路由,并分配了回调函数,以便在请求某个路由时调用。

Flight::route('POST /mail', Tools::sendMail);

如果我尝试这段代码 PHP 会返回这个异常:

致命错误:未定义的类常量“sendMail”

有没有办法在 PHP 中传递这样的函数?

【问题讨论】:

标签: php


【解决方案1】:

使用callable

public static function route($method, callable $callable)
{
    $callable();
}

Flight::route('POST /mail', function () { Tools::sendMail(); });

【讨论】:

  • 这肯定行得通,但令人担忧的是,这不是非常动态的 - 需要复制/粘贴此代码才能引用其他静态类函数。
  • 我和Flight::route('POST /mail', function () { Tools::sendMail(); });一起去了
【解决方案2】:

你可以用这个:

[__CLASS__,'MethodName']

如果回调是在同一个类中进行的,或者

[Class::class,'MethodName']

如果不是。

【讨论】:

    【解决方案3】:

    为了引用静态类方法,您需要传递 2 件事:类的名称,以及要调用的静态函数的名称

    //define the method
    function callStaticClassMethod($className, $funcName) {
        $className::$funcName();
    }
    
    //call the method
    callStaticClassMethod('Tools', 'sendMail');
    

    我不知道有任何其他方式可以直接引用静态函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 2021-05-19
      • 2014-04-12
      • 2012-05-06
      • 1970-01-01
      相关资源
      最近更新 更多