2016-07-26 1 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 должен иметь возможность сослаться назад к классу, чтобы сделать такие вещи, как автозаполнение. Ваша черта не может наследовать свои документы из вызывающего класса. Однако ваш класс может наследовать документы из включенного признака.

Смежные вопросы