2016-07-26 64 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必須有一種方法來指代回班做的事情一樣自動完成。你的特質不能從調用類繼承它的文檔。然而,你的課程可以從包含的特質中繼承文檔。