A-A+

使用PHP反射机制获取函数文档

2022年06月10日 我爱编程 暂无评论

反射 Reflection

反射可以简单理解为扫描类的属性、方法和注释的能力。

用法

PHP 为我们提供了丰富的方法,使我们可以方便的使用。

  1. $reflect = new ReflectionClass('App\Foo');
  2. $reflect->getMethods(); // 获取方法的数组
  3. $reflect->getDocComment(); // 获取文档注释
  4. ……

应用

有时系统需要向用户提供内置方法文档说明来使用,那么我们则可以通过 PHP 反射实现。

创建内置函数类

  1. class FooFunction{
  2.     /**
  3.      * 获取当前周周一时间戳
  4.      *
  5.      * @return false|string
  6.      */
  7.     public static function mondayTimeStamp(){
  8.         $targetTime = strtotime('now');
  9.         $w = date('w'$targetTime);
  10.         $w = ($w == 0 ? 7 : $w);
  11.         return mktime(0,0,0, date('m'$targetTime), date('d'$targetTime)-($w-1), date('Y'$targetTime));
  12.     }
  13.     /**
  14.      * 获取当前周周一日期
  15.      *
  16.      * @return false|string
  17.      */
  18.     public static function mondayDate(){
  19.         return date('Y-m-d', self::mondayTimeStamp());
  20.     }
  21. }

扫描内置函数类,生成文档

  1. // 利用 PHP 反射
  2. $reflect = new ReflectionClass('FooFunction');
  3. $data = [];
  4. // 获取类中的方法
  5. $methods = $reflect->getMethods();
  6. foreach ($methods as $method){
  7.     $methodName = $method->getName();
  8.     $methodDocStr = $reflect->getMethod($methodName)->getDocComment();
  9.     // 过滤方法注释前面的(*)
  10.     $pattern = "/[@a-zA-Z\\x{4e00}-\\x{9fa5}]+.*/u";
  11.     preg_match_all($pattern$methodDocStr$matches, PREG_PATTERN_ORDER);
  12.     $data[] = [
  13.         'name' => $methodName,
  14.         'doc' => $matches[0]
  15.     ];
  16. }
  17. echo json_encode($data);

结果:

  1. [
  2.     {
  3.         "name""mondayTimeStamp",
  4.         "doc": [
  5.             "返回当前周周一时间戳",
  6.             "@return false|string"
  7.         ]
  8.     },
  9.     {
  10.         "name""mondayDate",
  11.         "doc": [
  12.             "返回当前周周一日期",
  13.             "@return false|string"
  14.         ]
  15.     }
  16. ]

给我留言

Copyright © 四季博客 保留所有权利.   Theme  Ality

用户登录