数日前、友人が 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 マニュアルは非常に優れています。シンプルでありながら包括的。
ハイエンド。