如何使PHP IDE 识别__CALL魔法函数引用

2019-03-22

在写框架调用Service层的的时候,常常想在Controller和Service之间隔断一层,使用一个类去统一调用Service。好处很多Controller与Service之间隔离性提高,并且能够规范输入输出,能够拦截底层异常Exception。

具体模拟效果如下图:

class ServiceHelper
{

    public static function invoke($service = '', $serviceFunction = '', $params = array())
    {
        try {
            $result = {$serviceFunction}(...$params);
            return new Service_Result($result);
        } catch ( Exception $e ) {
            $code = $e->getCode();
            if ( $code == 1 ) {
                $code = -1;
            }
            return new Service_Result(array("stat" => $code, "msg" => $e->getMessage(), "data" => array(), "backtrace" => $e->getTraceAsString()));
        }
    }

    public static function isOk($result)
    {
        return isset($result["stat"]) && $result["stat"] == 1 ? true : false;
    }

}

但是这样的封装会有其他问题,在IDE下我们如果使用一个代理类去调用Service,按住CTRL或CMD点击是无法直接跳转对应函数。如下图:Services_xxxx_xxx是可以点击跳转到对应类,但是submitXXXX点击无法跳转

调用效果代码如下:

$Ret = ServiceHelper::invoke('Services_xxxx_xxx', 'submitXXXX', [“param1”,"param2");

if ( !$Ret->isOk() ) {
    return xxxxx error;
}

行业常见办法是在ServiceHelper类的注释中加入@Method \xxxxpkg\xxxxclass

今天发现call_user_function这个函数的参数类名和method都可以点

追过去后发现有@param callback $xxxx注释,这个注释可以让IDE主动识别Array(“classname”,”methodname”);

设置这个参数给ServiceHelper后传入的Services_xxxx_xxx和submitXXXX都可以被点击跳转了

考虑到之前这个问题我也被困扰过很久,但是相关资料网上没有,特在这里记录一下,分享给有缘人。