利用反射类来获取代码中提供的接口

<?php
/**
 * Created by PhpStorm.
 * User: Zhoulang
 * Date: 2018/1/12
 * Describe: 利用反射类来获取本项目所有对应的非静态、非析构、非构造的方法(获取控制器访问节点)
 */

namespace app\common\traits;


use \ReflectionClass;
use \ReflectionMethod;

trait AuthNodes
{
    /**
     * @return array
     */
    public function getModuleAuthNodes(){
        $path = APP_PATH;
        $fileList = scandir($path);
        $ListArr = [];
        //遍历模块
        foreach($fileList as $key=>$value){
            $nowPath = $path.$value;
            if($value!=='.' && $value!=='..' && is_dir($nowPath)){
                $nowPathLi = $nowPath.DIRECTORY_SEPARATOR.'controller';
                $fileListLi = scandir($nowPathLi);
                //遍历模块中的控制器
                foreach($fileListLi as $k=>$v){
                    $liPath = $nowPathLi.DIRECTORY_SEPARATOR.$v;
                    if($value!=='.' && $value!=='..' && is_file($liPath)){
                        // &&
                        //文件后缀名
                        $extArr = explode('.',$v);
                        $ext = end($extArr);

                        if($ext!=='php')
                            continue;

                        $ListArr[$value][$extArr[0]] = [];
                    }
                }
            }
        }

        foreach($ListArr as $key=>$value){

            $module = $key;

            foreach($ListArr[$key] as $k=>$v){

                $controller = $k;

                $classNamespacePath = "app\\{$module}\\controller\\{$controller}";

                $ListArr[$key][$k] = $this->getClassFunction($classNamespacePath);

            }

        }

        return $ListArr;
    }


    
    protected function getClassFunction($classNamespacePath){
        $reflection = new ReflectionClass($classNamespacePath);

        $publicFuncs = $reflection->getMethods(ReflectionMethod::IS_PUBLIC);

        //ReflectionClass::getConstructor

        $funcs = [];

        foreach($publicFuncs as $key=>$value){

            //不是构造方法  不是析构方法 也不是静态方法
            if(!$value->isConstructor() && !$value->isDestructor() && !$value->isStatic()){

                //获取方法注释信息
                $funcDoc = $value->getDocComment();
                //方法描叙
                $describe = '';
                //正则匹配出 /** info: xxxx  */ 格式的注释 中的 info:xxxxxxxx
                if($funcDoc){
                    $preg_match = [];
                    $result = preg_match('/info[\s]?[\:|\:]{1}[\s]?([\S]*)/',$funcDoc,$preg_match);
                    if($result){
                        $describe = $preg_match[1];
                    }
                }

                $funcs[$value->name] = [
                    'info' => $describe
                ];
            }
        }
        return $funcs;
    }
    

}

转载于:https://my.oschina.net/querying/blog/1630080

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值