ThinkPHP 3.2 中获取所有函数方法名,以及注释,完整可运行
<?php
namespace Home\Controller;
use Common\Controller\BaseController;
class AuthController extends BaseController{
/**
* @cc index主页面
*/
public function index(){
$modules = array('Home'); //模块名称
$i = 0;
foreach ($modules as $module) {
$all_controller = $this->getController($module);
foreach ($all_controller as $controller) {
$controller_name = $controller;
$all_action = $this->getAction($module, $controller_name);
foreach ($all_action as $action) {
$data[$i] = array(
'name' =>$module.'/'. $controller . '/' . $action,
'status' => 1,
'desc'=>$this->get_cc_desc($module,$controller,$action)
);
$i++;
}
}
}
echo '<pre>';
print_r($data);
}
/**
* @cc 获取所有控制器名称
*
* @param $module
*
* @return array|null
*/
protected function getController($module){
if(empty($module)) return null;
$module_path = APP_PATH . '/' . $module . '/Controller/'; //控制器路径
if(!is_dir($module_path)) return null;
$module_path .= '/*.class.php';
$ary_files = glob($module_path);
foreach ($ary_files as $file) {
if (is_dir($file)) {
continue;
}else {
$files[] = basename($file, C('DEFAULT_C_LAYER').'.class.php');
}
}
return $files;
}
/**
* @cc 获取所有方法名称
*
* @param $module
* @param $controller
*
* @return array|null
*/
protected function getAction($module, $controller){
if(empty($controller)) return null;
$content = file_get_contents(APP_PATH . '/'.$module.'/Controller/'.$controller.'Controller.class.php');
preg_match_all("/.*?public.*?function(.*?)\(.*?\)/i", $content, $matches);
$functions = $matches[1];
//排除部分方法
$inherents_functions = array('_before_index','_after_index','_initialize','__construct','getActionName','isAjax','display','show','fetch','buildHtml','assign','__set','get','__get','__isset','__call','error','success','ajaxReturn','redirect','__destruct','_empty');
foreach ($functions as $func){
$func = trim($func);
if(!in_array($func, $inherents_functions)){
if (strlen($func)>0) $customer_functions[] = $func;
}
}
return $customer_functions;
}
/**
* @cc 获取函数的注释
*
* @param $module Home
* @param $controller Auth
* @param $action index
*
* @return string 注释
*
*/
protected function get_cc_desc($module,$controller,$action){
$desc=$module.'\Controller\\'.$controller.'Controller';
$func = new \ReflectionMethod(new $desc(),$action);
$tmp = $func->getDocComment();
$flag = preg_match_all('/@cc(.*?)\n/',$tmp,$tmp);
$tmp = trim($tmp[1][0]);
$tmp = $tmp !='' ? $tmp:'无';
return $tmp;
}
}
其中注释必须采用固定格式,
/**
* @cc index主页面
*/
适用于ThinkPHP 3.2.2 ,适合用auth 认证时,直接提取所有的控制器及方法名,可以获取注释。非常方便。
参考:
1、http://www.thinkphp.cn/code/718.html
2、http://www.thinkphp.cn/topic/10357.html
ThinkPHP 3.2 中获取所有函数方法名,以及注释,完整可运行的更多相关文章
- java反射查看jar包中所有的类名方法名
不反编译,不用其他工具,用java反射查看jar包中所有的类名方法名,网上很多都报错,下面这个你试试看:话不多说直接撸代码: import java.lang.reflect.Field; impor ...
- C# 反射总结 获取 命名空间 类名 方法名
一.获取 命名空间 类名 方法名 using System; using System.Collections.Generic; using System.Linq; using System.Tex ...
- c# 获取命名空间 类名 方法名
c# 获取命名空间 类名 方法名 转[http://blog.sina.com.cn/s/blog_3fc2dcc1010189th.html] 分类: Winform public static ...
- vs2010中自动给函数或者类加上注释宏模板
Sub AddFunComment() Dim DocSel As EnvDTE.TextSelection DocSel = DTE.ActiveDocument.Selection DocSel. ...
- FFmpeg 如何探测网络流格式/如何从内存中获取数据
文章转自:http://blog.csdn.net/rootusers/article/details/42551935 一般ffmpeg都是直接从文件中读取或者从网络流中读取,比如rtp://xx. ...
- 关于在C#中构造函数中调用虚函数的问题
在C#中如果存在类的继承关系,应避免在构造函数中调用虚函数.这是由于C#的运行机制造成的,原因如下: 新建一个类实例时,C#会先初始化该类(对类变量赋值,并将函数记在函数表中),然后再初始化父类.构造 ...
- python-获取类名和方法名,动态创建类和方法及属性
获取类名和方法名1.在函数外部获取函数名称,用.__name__获取2.在函数内部获取当前函数名称,用sys._getframe().f_code.co_name方法获取3.使用inspect模块动态 ...
- PHP获取当前类名、函数名、方法名
PHP获取当前类名.方法名 __CLASS__ 获取当前类名 __FUNCTION__ 当前函数名(confirm) __METHOD__ 当前方法名 (bankcard::confirm) _ ...
- Thinkphp中的 I 函数(Thinkphp3.2.3版本)
I 函数的作用是获取系统变量,必要时还可以对变量值进行过滤及强制转化,I 函数的语法格式: I('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源']) 一.获取变量 ...
随机推荐
- 【BZOJ 1815】【SHOI 2006】color 有色图
http://www.lydsy.com/JudgeOnline/problem.php?id=1815 这道题好难啊,组合数学什么根本不会啊qwq 题解详见08年的Pólya计数论文. 主要思想是只 ...
- 数据库SQL归纳(一)
SQL功能分类 SQL 功能 动 词 数据定义 DDL CREATE.ALTER.DROP 数据查询 DQL SELECT 数据更改 DML INSERT.UPDATE.DELETE 数据控制 DCL ...
- BZOJ 2225 [Spoj 2371]Another Longest Increasing(CDQ分治)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2225 [题目大意] 给定N个数对(xi,yi),求最长上升子序列的长度. 上升序列定义 ...
- mybatis批量插入oracle时报错:unique constraint (table name) violated
mybatis批量插入oracle时报错:unique constraint (table name) violated,是因为插入的集合中有两条相同唯一约束的数据.
- codevs 1345 饥饿的奶牛
1345 饥饿的奶牛 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description John养了若干奶牛,每天晚上奶牛都要进食.由于条件比较 ...
- JAVA使用POI如何导出百万级别数据(转载)
用过POI的人都知道,在POI以前的版本中并不支持大数据量的处理,如果数据量过多还会常报OOM错误,这时候调整JVM的配置参数也不是一个好对策(注:jdk在32位系统中支持的内存不能超过2个G,而在6 ...
- 修改ORACLE实例名
修改数据库的SID 举例说明,我的数据库的SID叫testdb,现在要改成oral.更改ORACLE数据库的sid,涉及到的用东西比较多,但是大概来说就以下六步. 1.停止所有的Oracle服务. ...
- 利用cURL请外部接口
昨天有一个需求,就是需要把获取到的百度地图信息存储到百度地图LBS云储存上 看了一下LBS云储存,说白了就是通过接口操作云数据库,所以写了一个通用的cURL函数 代码如下: /** * @param ...
- Tikhonov regularization和岭回归
就实现过程来讲,两者是一样的,都是最小二乘法的改进,对于病态矩阵的正则化,只不过分析的角度不一样,前者是解决机器学习中过拟合问题,机器学习一般是监督学习,是从学习角度来说的,后者是数学家搞的,是为了解 ...
- 用yum安装完mysql后没有mysqld的问题
在Centos中用命令 yum install mysql安装数据库,但装完后运行mysqld启动mysql的时候提示找不到,通过 find / | grep mysqld 也没找到mysqld的目录 ...