ホームページ > バックエンド開発 > PHPチュートリアル > リフレクションを使用して、プロジェクト内の関数およびクラス定義のプロトタイプと注釈を抽出する

リフレクションを使用して、プロジェクト内の関数およびクラス定義のプロトタイプと注釈を抽出する

WBOY
リリース: 2016-06-23 13:46:09
オリジナル
855 人が閲覧しました

数日前、友人が 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);		}	}  }}
ログイン後にコピー



ディスカッション(解決策)への返信

正直、この方法の方が方法としては網羅的ではありますが、マニュアルよりもはるかにひどいと感じます。
一番良いのはソースコードを直接見ることです。コメントやパラメータなどを見るだけで十分です。しかも中国語です。

それと同じように、Buzhu は最近とても自由です。

こんな感じ。

反映メカニズムは依然として非常に便利で、モデレーターの精神はさらに優れています。

ThinkPHP クラス ライブラリ リファレンス マニュアル:
http://doc.thinkphp.cn/reference.html

とてもハイエンドですね~

なぜ .net 構文に似ているのですか

私はここに来ました学ぶ!

学習

学習、好きです

とても難しいです!私も理解できませんでした!

コメントをすべて確認しましたか?強い!

要点を理解してください。

名前を残すことを強制されました。

うーん、意味が分かりません。 。

司会者は本当にパワフルです、私は彼を崇拝します~~~、座って勉強してください。

フォローして学びましょう

通りすがり、いいね

投稿を読んでポイントをゲットしましょう!

Thinkphp マニュアルは非常に優れています。シンプルでありながら包括的。

ハイエンド。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート