小兔网

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

php怎么获取方法的注释-PHP问题

本文操作环境: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 * @package    restler * @subpackage helper * @author     Murray Picton <该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。> * @author     R.Arul Kumaran <该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。> * @copyright  2010 Luracast * @license    http://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 comment        if (preg_match ( '#^/\*\*(.*)\*/#s', $doc, $comment ) === false)            return $this->params;        $comment = trim ( $comment [1] );        // Get all the lines and strip the * from the first character        if (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 line                        if ($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 line                if (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 valid            if ($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怎么获取方法的注释的知识。速戳>>知识兔学习精品课!