Typehint在PHPStorm中继承了类变量

时间:2015-03-16 12:05:44

标签: phpstorm

在PHPStorm中,我可以通过这种方式输入变量:

/** @var Point $point */
$point->x();

但是,假设我从父类继承了一个变量,并想要输入提示符:

class PointProxy extends Proxy
{
    public function x()
    {
        ...

        /** @var Point $this->geometry */
        return $this->geometry->x();
    }
}

这不起作用,PHPStorm的行为就好像我有类型提示$this,而不是$this->geometry

有没有办法让这样的类型提示工作而不重新声明子类中的$geometry属性,还是不支持?

3 个答案:

答案 0 :(得分:5)

试试这段代码。您也可以在未定义的属性上按alt+enter,然后选择Add @property它可以帮助您更快地创建phpdoc。

/**
 * @property Point $geometry
 */
class PointProxy extends Proxy {
  public function x() {
    return $this->geometry->
  }
}

add property completion

答案 1 :(得分:0)

如果父对象将属性键入为Geometry,但您希望它在子类中键入Point(从Geometry下降),我建议您在子类中创建一个访问器。可能会进行一些类型检查。

class PointProxy extends Proxy
{
    /**
     * Access the geometry object on parent class as a Point
     *
     * @return Point
     */
    private point()
    {
        if(!is_a($this->geometry, 'Point'))
        {
            // Log an error or something, this is not a state we should be in
        }
        else
        {
            return $this->geometry;
        }
    }

    public function x()
    {
    ...

        return $this->point->x();
    }
}

答案 2 :(得分:0)

我遇到了一个非常类似的问题。我有一个处理数据库操作的通用存储类,然后是一个代理类,它通过try catch(使用__call())代理所有存储类方法,以便我可以在一个位置处理异常。

现在每当我访问$storage->retrievePhoto($id)这样的存储实例时,PHPStorm IDE都无法为我输入提示。我的解决方案涉及向$storage对象添加另一个类名注释。

例如,见下文。由于特定的代理类实际上只是原始存储类的包装器,它不会出现任何问题,尽管它仍然不是我喜欢的100%但是它可以工作。

final class PhotoRepository
{
    /**
     * @var \Repositories\Photos\PhotoStorage
     *      \Repositories\Photos\PhotoStorageExceptionHandlerProxy
     */
    private $storage;

    /**
     * @param \Repositories\Photos\PhotosStorageExceptionHandlerProxy $storage
     */
    public function __construct(PhotosStorageExceptionHandlerProxy $storage)
    {
        $this->storage = $storage;
    }