2016-07-26 11 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ですが、そうでない場合はどうなりますか?

$containerTrait内に配置し、SplObjectStorageと宣言する必要があります。そうすればうまくいくはずです。このようにして、Traitが実際にと宣言している人は誰でも$containerという文字列を使用することができます。

trait Something { 
    /** 
    * @var SplObjectStorage 
    */ 
    private $container; 

    ... 

私はあなたが問題を強制することができたとします

public function add() 
{ 
    /** 
    * @var $cont SplObjectStorage 
    */ 
    $cont = $this->container; 
    $cont->attach(new stdClass()); 
} 
1

この作品を作るために、他のいくつかの方法があります。

  1. (@Iserniが示唆されているように)形質内部$containerを定義するが、変数自体を定義します。これは、実際には特性法が実際にそれに頼っているので、実際にはそれを特性の中に定義する方が実際には意味があります。

    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は、オートコンプリートのようなことを行うために戻ってクラスを参照する方法を持っている必要があります。あなたの特性は呼び出しクラスからドキュメントを継承することはできません。ただし、クラスは含まれている特性からドキュメントを継承できます。