我在PhpStorm中遇到自动完成问题...
class Main
{
use Something;
/**
* @var SplObjectStorage
*/
private $container;
public function __construct()
{
$this->container = new SplObjectStorage();
}
public function addSth()
{
$this->add();
}
}
trait Something
{
public function add()
{
$this->container->attach(new stdClass());
}
}
$m = new Main();
$m->add();
var_dump($m);
一切正常,但$this->container->attach(new stdClass());
抛出方法attach
未找到......任何人都可以提供帮助吗?我认为正确配置的PHPDoc应该有所帮助。
答案 0 :(得分:5)
Trait
无法知道其$container
的类型。在您的示例中,它是SplObjectStorage
,但如果不是,那该怎么办?
您还需要将$container
放在Trait
内,并将其声明为SplObjectStorage
。然后它应该工作。通过这种方式,您还可以确定宣布Trait实际的人 $container
是否可以使用。
trait Something {
/**
* @var SplObjectStorage
*/
private $container;
...
我想你可以强制解决这个问题:
public function add()
{
/**
* @var $cont SplObjectStorage
*/
$cont = $this->container;
$cont->attach(new stdClass());
}
答案 1 :(得分:1)
还有其他几种方法可以完成这项工作。
在特征中定义$container
(如@Iserni建议的那样),但定义变量本身。无论如何,在特质中定义它实际上更有意义,因为特征方法实际上依赖于它。
trait Something {
/** @var \SplObjectStorage */
protected $container;
public function add() {
$this->container->attach(new stdClass());
}
}
将其作为函数中的参数传递
public function add(\SplObjectStorage $container) {
$container->attach(new stdClass());
}
PHPStorm必须有一种方法可以引用该类来执行自动完成等操作。您的特征无法从调用类继承其文档。但是,您的班级可以从包含的特征继承文档。