在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
属性,还是不支持?
答案 0 :(得分:5)
试试这段代码。您也可以在未定义的属性上按alt+enter
,然后选择Add @property
它可以帮助您更快地创建phpdoc。
/**
* @property Point $geometry
*/
class PointProxy extends Proxy {
public function x() {
return $this->geometry->
}
}
答案 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;
}