PhpStorm Trait方法自动完成不起作用

时间:2016-07-26 18:55:19

标签: php oop phpstorm

我在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应该有所帮助。

2 个答案:

答案 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)

还有其他几种方法可以完成这项工作。

  1. 在特征中定义$container(如@Iserni建议的那样),但定义变量本身。无论如何,在特质中定义它实际上更有意义,因为特征方法实际上依赖于它。

    trait Something {
        /** @var \SplObjectStorage */
        protected $container;
    
        public function add() {
            $this->container->attach(new stdClass());
        }
    }
    
  2. 将其作为函数中的参数传递

    public function add(\SplObjectStorage $container) {
        $container->attach(new stdClass());
    }
    
  3. PHPStorm必须有一种方法可以引用该类来执行自动完成等操作。您的特征无法从调用类继承其文档。但是,您的班级可以从包含的特征继承文档。