php怎么获取方法的注释
2022-12-02 09:01:16
80
{{single.collect_count}}

php获取方法的注释:首先打开相应的PHP文件;然后通过php中的反射机制,获取该类的文档注释;最后通过获取其所有的方法,获取方法的注释即可。

php入门到就业线上直播课:进入学习
Apipost = Postman + Swagger + Mock + Jmeter 超好用的API调试工具:点击使用

本文操作环境:windows7系统、PHP7.1版,DELL G3电脑

php反射获取类和方法中的注释

通过php中的反射机制,获取该类的文档注释,再通过获取其所有的方法,获取方法的注释

所用到的主要类及其方法

ReflectionClassReflectionClass::getDocCommentReflectionClass::getMethods $method->getName()$method->getDocComment();$method->isProtected();$method->getParameters(); $param->getName();$param->isDefaultValueAvailable();$param->getDefaultValue()
登录后复制

测试类如下:

test.php

<?phpheader("Content-type: text/html; charset=utf-8");require_once dir(__DIR__).'function.php';require_once dir(__DIR__).'TestClass.php'; $class_name = 'TestClass'; $reflection = new ReflectionClass ( $class_name );//通过反射获取类的注释$doc = $reflection->getDocComment ();//解析类的注释头$parase_result =DocParserFactory::getInstance()->parse ( $doc );$class_metadata = $parase_result; //输出测试var_dump ( $doc );echo "\r\n";print_r( $parase_result );echo "\r\n-----------------------------------\r\n"; //获取类中的方法,设置获取public,protected类型方法$methods = $reflection->getMethods(ReflectionMethod::IS_PUBLIC + ReflectionMethod::IS_PROTECTED + ReflectionMethod::IS_PRIVATE);//遍历所有的方法foreach ($methods as $method) {//获取方法的注释$doc = $method->getDocComment();//解析注释$info = DocParserFactory::getInstance()->parse($doc);$metadata = $class_metadata +$info;//获取方法的类型$method_flag = $method->isProtected();//还可能是public,protected类型的//获取方法的参数$params = $method->getParameters();$position=0;//记录参数的次序foreach ($params as $param){$arguments[$param->getName()] = $position;//参数是否设置了默认参数,如果设置了,则获取其默认值$defaults[$position] = $param->isDefaultValueAvailable() ? $param->getDefaultValue() : NULL;$position++;} $call = array('class_name'=>$class_name,'method_name'=>$method->getName(),'arguments'=>$arguments,'defaults'=>$defaults,'metadata'=>$metadata,'method_flag'=>$method_flag);print_r($call);echo "\r\n-----------------------------------\r\n";}
登录后复制

function.php【推荐学习:《PHP视频教程》】

<?phprequire_once dir(__DIR__).'DocParser.php'; /** * 解析doc * 下面的DocParserFactory是对其的进一步封装,每次解析时,可以减少初始化DocParser的次数 * * @param $php_doc_comment * @return array */function parse_doc($php_doc_comment) {$p = new DocParser ();return $p->parse ( $php_doc_comment );} /** * Class DocParserFactory 解析doc * * @example *DocParserFactory::getInstance()->parse($doc); */class DocParserFactory{ private static $p;private function DocParserFactory(){} public static function getInstance(){if(self::$p == null){self::$p = new DocParser ();}return self::$p;} }
登录后复制

TestClass.php

<?php/** * A test class在此处不能添加@ur,@param,@return 注释 *如果要将类的注释和方法的注释合并的话,添加了上面的注释,会将方法中的注释给覆盖掉 */class TestClass {/** * @desc 获取public方法 * * @url GET pnrs * @param array $request_data * @return int id */public function getPublicMethod($no_default,$add_time = '0000-00-00') {echo "public";}/** * @desc 获取private方法 * * @url GET private_test * @return int id */private function getPrivateMethod($no_default,$time = '0000-00-00') {echo "private";} /** * @desc 获取protected方法 * * @url GET protected_test * @param $no_defalut,$time * @return int id */protected function getProtectedMethod($no_default,$time = '0000-00-00') {echo "protected";}}
登录后复制

DocParser.php该类源自一个开源项目

<?php/** * Parses the PHPDoc comments for metadata. Inspired by Documentor code base * @category Framework * @packagerestler * @subpackage helper * @author Murray Picton <info@murraypicton.com> * @author R.Arul Kumaran <arul@luracast.com> * @copyright2010 Luracast * @licensehttp://www.gnu.org/licenses/ GNU General Public License * @link https://github.com/murraypicton/Doqumentor */class DocParser {private $params = array ();function parse($doc = '') {if ($doc == '') {return $this->params;}// Get the commentif (preg_match ( '#^/\*\*(.*)\*/#s', $doc, $comment ) === false)return $this->params;$comment = trim ( $comment [1] );// Get all the lines and strip the * from the first characterif (preg_match_all ( '#^\s*\*(.*)#m', $comment, $lines ) === false)return $this->params;$this->parseLines ( $lines [1] );return $this->params;}private function parseLines($lines) {foreach ( $lines as $line ) {$parsedLine = $this->parseLine ( $line ); // Parse the lineif ($parsedLine === false && ! isset ( $this->params ['description'] )) {if (isset ( $desc )) {// Store the first line in the short description$this->params ['description'] = implode ( PHP_EOL, $desc );}$desc = array ();} elseif ($parsedLine !== false) {$desc [] = $parsedLine; // Store the line in the long description}}$desc = implode ( ' ', $desc );if (! empty ( $desc ))$this->params ['long_description'] = $desc;}private function parseLine($line) {// trim the whitespace from the line$line = trim ( $line );if (empty ( $line ))return false; // Empty lineif (strpos ( $line, '@' ) === 0) {if (strpos ( $line, ' ' ) > 0) {// Get the parameter name$param = substr ( $line, 1, strpos ( $line, ' ' ) - 1 );$value = substr ( $line, strlen ( $param ) + 2 ); // Get the value} else {$param = substr ( $line, 1 );$value = '';}// Parse the line and return false if the parameter is validif ($this->setParam ( $param, $value ))return false;}return $line;}private function setParam($param, $value) {if ($param == 'param' || $param == 'return')$value = $this->formatParamOrReturn ( $value );if ($param == 'class')list ( $param, $value ) = $this->formatClass ( $value );if (empty ( $this->params [$param] )) {$this->params [$param] = $value;} else if ($param == 'param') {$arr = array ($this->params [$param],$value );$this->params [$param] = $arr;} else {$this->params [$param] = $value + $this->params [$param];}return true;}private function formatClass($value) {$r = preg_split ( "[\(|\)]", $value );if (is_array ( $r )) {$param = $r [0];parse_str ( $r [1], $value );foreach ( $value as $key => $val ) {$val = explode ( ',', $val );if (count ( $val ) > 1)$value [$key] = $val;}} else {$param = 'Unknown';}return array ($param,$value );}private function formatParamOrReturn($string) {$pos = strpos ( $string, ' ' );$type = substr ( $string, 0, $pos );return '(' . $type . ')' . substr ( $string, $pos + 1 );}}
登录后复制

以上就是php怎么获取方法的注释的详细内容,更多请关注php中文网其它相关文章!

回帖
全部回帖({{commentCount}})
{{item.user.nickname}} {{item.user.group_title}} {{item.friend_time}}
{{item.content}}
{{item.comment_content_show ? '取消' : '回复'}} 删除
回帖
{{reply.user.nickname}} {{reply.user.group_title}} {{reply.friend_time}}
{{reply.content}}
{{reply.comment_content_show ? '取消' : '回复'}} 删除
回帖
收起
没有更多啦~
{{commentLoading ? '加载中...' : '查看更多评论'}}