【问题标题】:Is there a way to retrieve the PHPDoc comment of a class constant?有没有办法检索类常量的 PHPDoc 注释?
【发布时间】:2016-11-20 19:25:54
【问题描述】:

我在 PHP 中有以下代码:

abstract class ProjectVars
{
    /**
     * Defines whether a user is logged in as ...
     */
    const loggedInAs = [...];

    [...]
}

我想访问字符串Defines whether a user is logged in as ...。显然有更多的常量,我想得到所有常量的字符串。 那可能吗?有了反射类,我可以使用

$rc = new ReflectionClass('ProjectVars');
var_dump($rc->getDocComment());

获取整个班级的 PHPDoc 注释。我没有找到相应的方法来读取类常量的 PHPDoc。有没有办法做到这一点?

【问题讨论】:

    标签: php phpdoc


    【解决方案1】:

    是的,有:像您已经知道的那样使用反射 API,但是您可能会通过创建一个输出所有 cmets 的函数来更进一步。 然而,这种方法只需在有问题的类中创建一个静态方法,该方法将被静态调用另一种方法是创建一个简单的帮助程序类,其中只有一个静态方法,该方法采用参数(类的名称)。下面的代码演示了这两种方法:

        <?php
    
            abstract class ProjectVars {
                /**
                 * Defines whether a user is logged in as ...
                 */
                protected $loggedIn;
    
                /**
                 * Determines whether the user is registered or not
                 * @var bool;
                 */
                protected $register;
    
                /**
                 * Holds information about user's surfing/visit history
                 * @var string;
                 */
                protected $records;
    
    
    
    
                public static function getClassComments(){
                    $refClass           = new ReflectionClass(self::class);
                    $comments           = array();
    
                    foreach ($refClass->getProperties() as &$refProperty) {
                        $comments[$refProperty->getName()]  =  trim(preg_replace("#((\/)?(\*{1,2})(\/)?)#si", "", $refProperty->getDocComment()));
                    }
                    return $comments;
                }
            }
    
    
            var_dump(ProjectVars::getClassComments());
            // PRODUCES:    
            array (size=3)
              'loggedIn' => string 'Defines whether a user is logged in as ...' (length=42)
              'register' => string 'Determines whether the user is registered or not
                      @var bool;' (length=63)
              'records' => string 'Holds information about user's surfingvisit history
                      @var string;' (length=68)
    

    因此,要访问属性的所有 cmets,请说:loggedInregisterrecords,您可能需要做的就是这样:

                     ProjectVars::getClassComments()['loggedIn'];
                     ProjectVars::getClassComments()['register'];
                     ProjectVars::getClassComments()['records'];
    

    第二种方法:使用简单的帮助类

        <?php
    
            class CommentAnalyser{
    
                public static function getClassCommentsFor($fullyQualifiedClassName){
                    $refClass           = new ReflectionClass($fullyQualifiedClassName);
                    $comments           = array();
    
                    foreach ($refClass->getProperties() as &$refProperty) {
                        $comments[$refProperty->getName()]  =  trim(preg_replace("#((\/)?(\*{1,2})(\/)?)#si", "", $refProperty->getDocComment()));
                    }
                    return $comments;
                }
            }
    
    
            var_dump(CommentAnalyser::getClassCommentsFor('ProjectVars'));
            // PRODUCES:    
            array (size=3)
              'loggedIn' => string 'Defines whether a user is logged in as ...' (length=42)
              'register' => string 'Determines whether the user is registered or not
                      @var bool;' (length=63)
              'records' => string 'Holds information about user's surfingvisit history
                      @var string;' (length=68)
    

    模拟HERE

    祝你好运...

    【讨论】:

    • 只是一个小提示:替换正则表达式吞噬了“冲浪/访问”中的斜线。
    • @RuslanBes 谢谢老兄......你是对的......一会儿看看......但你明白了...... ;-)
    猜你喜欢
    • 1970-01-01
    • 2021-06-03
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2013-11-13
    • 1970-01-01
    相关资源
    最近更新 更多