2016-07-26 65 views
3

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

+0

您提供的代码中没有'attach'方法。 –

+0

@u_mulder这是一个[内置类](http://php.net/manual/en/class.splobjectstorage.php) – Machavity

回答

3

Trait无法知道它的$container是什么类型。在你的例子中,它是SplObjectStorage,但如果它不是?

您需要将$container置于Trait之内,并将其声明为SplObjectStorage。那么它应该工作。这样,你也可以确定谁宣称特质 a $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()); 
        } 
    } 
    
  2. 把它作为一个参数在函数

    public function add(\SplObjectStorage $container) { 
        $container->attach(new stdClass()); 
    } 
    

PHPStorm必须有一种方法来指代回班做的事情一样自动完成。你的特质不能从调用类继承它的文档。然而,你的课程可以从包含的特质中继承文档。