在PHPDoc中声明局部变量的属性

时间:2013-06-12 12:46:22

标签: php variables properties phpdoc

我有一个带有一些属性的stdClass实例。在PHPDoc中声明这些属性的正确方法是什么? 我试过这个,但似乎不行:

    /** 
     * @var $requestParams stdClass
     * @property string cancelUrl 
     */
    $requestParams = $someObj->getSomething();

2 个答案:

答案 0 :(得分:2)

根据您的代码示例,您可以做的最好是通过$requestParams表示stdClass类型为@var。您对@property的使用不会对您做任何事情,因为该标记仅针对类中存在的魔术属性进行了专门定义...因此,只有@property才会被读取和解释在 docblock中。

如果您只需要显示$ requestParams是stdClass的实例,那么@var就是您所需要的。但是,如果您还想表示$ requestParams-> cancelUrl是已知的字符串属性,而不更改为实际定义的类,则必须使用另一个局部变量,方法与$ requestParams是局部变量的方式相同:

/** @var stdClass $requestParams */
$requestParams = $someObj->getSomething();

/** @var string $cancelUrl */
$cancelUrl = $requestParams->cancelUrl;

除了回答您的直接问题之外 - 如果向您的读者证明此$ requestParams元素具有某些已定义的属性非常重要,我会选择为其编写正式类。当然,该类中的实现仍然可以是用于保存值的内部stdClass。

答案 1 :(得分:1)

new stdClass()的问题在于您可以动态声明属性,因此任何文档管理员都难以解析所有代码以找到添加新属性的所有位置,因此您需要为它创建一个类并记录该类:

所以不要这样做:

/**
 * ... doc block here
 */
class SomeObj {
    /**
     * ... doc block here
     * @return stdClass
     */
    function getSomething() {
        return new stdClass();
    }
}

你这样做:

/**
 * ... doc block here
 */
class SomeObj {
    /**
     * ... doc block here
     * @return Something
     */
    function getSomething() {
        return new Something();
    }
}

/**
 * ... doc block here
 */
class Something {
    /**
     * @var string
     */
    public $cancelUrl;
}