7

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

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

2 回答 2

3

给定您的代码示例,您能做的最好的事情就是表示是via$requestParams类型。您对那里的使用不会为您做任何事情,因为该标记仅针对类中存在的魔术属性专门定义......因此,只有在文档块中时才会读取和解释。stdClass@var@property@property

如果你只需要证明 $requestParams 是 stdClass 的一个实例,那么 @var 就是你所需要的。但是,如果您进一步想要表示 $requestParams->cancelUrl 是一个已知的字符串属性,而不更改为实际定义的类,则必须使用另一个局部变量,就像 $requestParams 是一个局部变量一样:

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

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

除了回答你的直接问题——如果向你的读者展示这个 $requestParams 元素具有某些已定义的属性对你来说真的很重要,我会选择为它编写一个正式的类。当然,该类中的实现仍然可以只是用于保存值的内部 stdClass。

于 2013-06-13T15:25:34.713 回答
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;
}
于 2013-06-12T13:17:58.283 回答