首页 >后端开发 >php教程 >使用反射提取项目中函数和类定义原型和注释

使用反射提取项目中函数和类定义原型和注释

WBOY
WBOY原创
2016-06-23 13:46:09848浏览

前几天有朋友希望得到 ThinkPHP 全部函数和类定义的文档。手工整理出来也的确很费事。
为此,用 php 的反射功能写了一个程序。
欢迎拍砖!

if(isset($_GET['fn'])) new appdoc($_GET['fn']);else {	$path = 'ThinkPHP';	//$path = 'phpcms';	//$path = 'wordpress';	new appdoc(realpath($path));}class appdoc {  private $data = array();  private $next = array();  function __construct($path='') {	if(is_array($path) || is_file($path)) return $this->analysis($path);	$res = glob($path . DIRECTORY_SEPARATOR . '*', GLOB_NOSORT);	$next = array();	for($i=0; $i<count($res); $i++) {		$fn = $res[$i];		if(is_dir($fn)) {			$res = array_merge($res, glob($fn . DIRECTORY_SEPARATOR . '*', GLOB_NOSORT));			continue;		}		if(! in_array(pathinfo($fn, PATHINFO_EXTENSION), array('php', 'inc'))) continue;		$s = $this->save($this->load($fn));		if($s) $this->next[$s] = $fn;	}	$this->checknext();	$s = join(PHP_EOL.PHP_EOL, $this->data);	if(mb_check_encoding($s, 'utf-8')) $s = iconv('utf-8', 'gbk', $s);	header("Content-type: text/plain;charset=gbk");	echo $s, PHP_EOL . PHP_EOL;	echo '文件列表' . PHP_EOL;	echo join(PHP_EOL, $res);	if($this->next) {		echo PHP_EOL . PHP_EOL . '残余的' . PHP_EOL;		print_r($this->next);	}  }  private function load($fn) {	$u = is_array($fn) ? http_build_query(array('fn' => array_values($fn))) : "fn=$fn";	$url = "http://$_SERVER[HTTP_HOST]$_SERVER[PHP_SELF]?$u";	$curl = curl_init();	curl_setopt($curl, CURLOPT_URL, $url);	curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);	return curl_exec($curl);  }  private function checknext() {	foreach($this->next as $s=>$fn) {		switch(1) {			case is_numeric($s): break;			case preg_match("/Class '(\w+)' not found/", $s, $m) :				$m = preg_quote($m[1]);				foreach(preg_grep("/class $m/i", $this->data) as $r) {;					if(preg_match('/@@\s+(\S+)/', $r, $m)) {						array_unshift($this->next, $m[1]);						break;					}				}				break;		}	}	$u = http_build_query(array('fn' => array_values($this->next)));	$s = $this->save($this->load($this->next));	$this->next = array();	if(empty($s)) unset($this->next[$s]);	else $this->next[] = $s;  }  private function save($s) {	if(empty($s) || preg_match('/~runtime.php/i', $s)) return '';	if(preg_match('#<b>Fatal error</b>#', $s)) return $s;	$t = array();	$ar = preg_split("/[\r\n]+/", $s);	foreach($ar as $i=>$v) {		$t[] = $v;		if($v == '}') {			$t = join(PHP_EOL, $t);			if(! in_array($t, $this->data))	$this->data[] = $t;			$t = array();		}	}	return '';  }  private function import($fn) {	ob_start();	if(is_array($fn)) foreach($fn as $f) include_once($f);	else include_once($fn);	ob_end_clean();  }  private function analysis($fn) {	if(! is_array($fn) && preg_match('/~runtime.php$/i', $fn)) return;	$last = get_defined_constants();	$this->import($fn);	if($t = array_diff($last, get_defined_constants())) {		echo 'Constants' . join(PHP_EOL . "\t", $t) . PHP_EOL . PHP_EOL;	}	foreach(get_defined_functions()['user'] as $name) {		$func = new ReflectionFunction($name);		Reflection::export($func);	}	foreach(get_declared_classes() as $name) {		if(__CLASS__ == $name) continue;		$class = new ReflectionClass($name);		if($class->isUserDefined()) {			Reflection::export($class);		}	}	foreach(get_declared_interfaces() as $name) {		$interfaces = new ReflectionClass($name);		if($interfaces->isUserDefined()) {			Reflection::export($interfaces);		}	}  }}



回复讨论(解决方案)

说真的,这个方式虽然看方法之类的全一些,但感觉要比手册差远了。
最好的还是直接看源码,看看注释,参数之类就够了,况且还是中文的。

赞一个,斑竹最近很闲啊。

赞一个。

反射机制还是很有用处的,版主的精神更是可佳。

ThinkPHP 类库参考手册:
 http://doc.thinkphp.cn/reference.html

好像很高端的样子~

怎么那么像.net语法 

我是来学习的!

learning

学习,赞一个

太难了!都没看明白呢!

连带注释都查了出来?强悍!

接个分。

强贴留名。

额,表示看不懂。。

版主果真强大,膜拜中~~~,占个位置学习学习。

跟踪学习

路过,赞一个

看帖拿分!

Thinkphp手册极端的好。简单而又全面。

高端。

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn