覆盖PHPDoc中的返回类型

时间:2013-12-06 11:21:03

标签: phpdoc

我有一个类Abc和方法(正文并不重要):

/**
 * @return SomeBaseClass
 */
function getAll() { ... }

在名为Abc的{​​{1}}子类中,我想重新定义返回类的类型,以便在Netbeans中正确查看它。如果不重新定义方法,我可以这样做:

AbcChild

3 个答案:

答案 0 :(得分:7)

尝试这样的事情:

/**
 * @method SomeClass getAll()
 */
class AbcChild
{
 // ....
}

More info about @method

答案 1 :(得分:0)

不,因为您需要子方法代码本身才能让子docblock与其关联。如果您有docblock而不是方法代码,那么docblock将不会绑定任何内容,因此不起作用。大多数人不喜欢改变他们的代码以适应docblock行为,尽管这样做从来没有让我感到困扰。

但是,另一个选项是调整父方法的@return标记,以便列出要指示子项可以返回的所有可能的返回类型。这让我很奇怪,但是......如果你实际上没有覆盖方法本身,那么子类实际上如何返回与父类不同的类?我可以在脑海中看到这样做的方法,涉及包含不同类对象的类属性,但是他们觉得代码闻起来对我来说; - )

如果子节点中没有方法覆盖代码本身,那么我会选择将所有可能的返回类型放在父级的@return中。

答案 2 :(得分:0)

实际上我认为除了完整方法覆盖之外还有其他方法。您可以在扩展基接口的子接口中更改@return phpdoc块。让我用代码解释一下我的意思:

interface EntityRepository
{
   /**
    * @return object
    */
    public function get($id);
    public function add($entity, $sync = false);
    public function remove($entity, $sync = false);
    // other methods common for custom repositories
}

interface ProjectRepository extends EntityRepository
{
   /**
    * @return Project
    */
    public function get($id);
}

这是您网域的一部分。现在从Symfony& amp;学说:

use Doctrine\ORM\EntityRepository;
use Model\Repository\EntityRepository as BaseEntityRepository;

abstract class DoctrineEntityRepository extends EntityRepository implements BaseEntityRepository
{
    public function get($id)
    {
        $entity = $this->find($id);
        if (!$entity) {
            throw new EntityNotFoundException();
        }

        return $entity;
    }

    public function add($entity, $sync = false)
    {
        // method implementation
    }
    public function remove($entity, $sync = false)
    {
        // method implementation
    }
}

use Model\Repository\ProjectRepository as BaseProjectRepository;

class ProjectRepository extends DoctrineEntityRepository implements BaseProjectRepository
{
    public function specificQueryForProjects()
    {
        // method implementation
    }
}

这样,您不必仅因为代码自动完成而覆盖子类中的方法。您只需扩展接口即可让API用户知道返回值已更改。