有没有一种方法可以检索类常量的PHPDoc注释


Is there a way to retrieve the PHPDoc comment of a class constant?

我在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。有办法做到这一点吗?

是的,有:使用反射API,就像你已经知道的那样,但你可以通过创建一个输出所有注释的函数来进一步。然而,这种方法只是在有问题的类中创建一个静态方法,该方法将被静态调用。另一种方法是创建一个简单的助手类,该类只有一个采用Argument(类的名称)的静态方法。下面的代码演示了两种方法:

    <?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)

因此,要访问属性的所有注释,例如:loggedInregisterrecords,您可能需要做的就是:

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

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

    <?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)

实物模型在这里。

干杯,祝你好运。。。