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('变量类型.变量名/修饰符',['默认值'],['过滤方法或正则'],['额外数据源']) 一.获取变量 ...
随机推荐
- 洛谷P3369普通平衡树(Treap)
题目传送门 转载自https://www.cnblogs.com/fengzhiyuan/articles/7994428.html,转载请注明出处 Treap 简介 Treap 是一种二叉查找树.它 ...
- Beaglebone Black教程项目1闪烁板载LED
Beaglebone Black教程项目1闪烁板载LED 项目1闪烁板载LED 当设置完你的Beaglebone Black的时候,可能早就非常期待你的第一个项目了.下面就来满足大家的愿望,当然,这个 ...
- 高效的 itertools 模块(转)
原文地址:http://python.jobbole.com/87380/ 我们知道,迭代器的特点是:惰性求值(Lazy evaluation),即只有当迭代至某个值时,它才会被计算,这个特点使得迭代 ...
- SOCKET类型定义及应用
读代码时看到此处,摘记下来. 流套接字(SOCK_STREAM):流套接字用于提供面向连接.可靠的数据传输服务.该服务将保证数据能够实现无差错.无重复发送,并按顺序接收.流套接字之所以能够实现可靠的数 ...
- bzoj 1734: [Usaco2005 feb]Aggressive cows 愤怒的牛
1734: [Usaco2005 feb]Aggressive cows 愤怒的牛 Description Farmer John has built a new long barn, with N ...
- idea小问题解决方法系列
1)有些java文件上显示“红色小j”,如图所示 ,意思是“不可编译”,原因是Module未导入或者没有标记Module下"Sources"一栏src文件夹为Sources.(ht ...
- (转)适配器模式--Adapter Pattern
适配器:基于现有类所提供的服务,向客户提供接口,以满足客户的期望. <设计模式>一书中是这样给适配器模式定义的:将一个类的接口转换成客户希望的另外一个接口.Adapter 模式使得原本由于 ...
- spring boot 添加自定义属性
1.添加jar compile('org.springframework.boot:spring-boot-configuration-processor:1.2.0.RELEASE') 2.在app ...
- JS操作小数运算,结果莫名其妙出现多位小数问题
Number类型: Number类型是ECMAScript中最常用和最令人关注的类型了:这种类型使用IEEE754格式来表示整数和浮点数值(浮点数值在某些语言中也被成为双精度数值),为支持各种数据类型 ...
- SIP消息类型和消息格式
转自:http://blog.chinaunix.net/uid-1797566-id-2840904.html sip消息类型和消息格式 SIP是一个基于文本的协议,使用的是UTF-8字符集. SI ...