Я имею следующую структуру классаПредложенные методы проигравшие в PhpStorm, когда реализуется подкласс
Я использую сервис Symfony2 для управления BaseHandler
и BaseManager
классы
class BaseHandler implements IHandler
{
/**
* @var IManager
*/
protected $manager;
...
public function setManager(IManager $manager)
{
$this->manager = $manager;
}
...
}
Все произведения отлично, но проблема в том, что я пытаюсь использовать некоторые методы класса SpecializedManager
, и предложения PhpStorm не показывают их методы, только методы, относящиеся к IManager
.
Например, в моем контроллере
public function indexAction(){
$handler = $this->get('appbundle.handler.specialized_handler');
$items = $this->manager->mySubClassMethod(); // PHPStorm shows warning
...
}
Я не знаю, как установить в обработчик подкласса аннотацию вар manager
, чтобы изменить что-то вроде этого @var SpecializedHandler $manager
, ни другой альтернативные пути методов появляются в предложения.
ПРИМЕЧАНИЕ: базовый класс или расширенный для мультипликаторов специализированных подклассов.
Посмотрите на [это] (http://stackoverflow.com/questions/24105260/php-upcasting-object). Вопрос. –
Возможно, вам понадобится использовать промежуточную переменную ('$ manager = $ this-> manager; $ manager-> mySubClassMethod()'), которую вы можете набрать с помощью встроенного '@ var', как вы предложили. Другой подход (лучше, поскольку он опирается только на PHPDoc) заключается в том, чтобы повторно объявить свойство '$ manager' в текущем/родительском классе через' @ property' (должно быть расположено в PHPDoc для этого класса). Все это из-за того, что с помощью PHPDoc (и статического анализа PhpStorm) вы можете вводить только объекты 1-го уровня ('например' $ this', '$ manager' и т. Д.) И не может выполнять n-level (' $ this-> manager' и т. Д.). – LazyOne
Существуют и другие подходы, такие как: ввести 'getManager()' метод в этом/родительском классе, который будет содержать правильный тег '@ return' и использовать его вместо' $ this-> manager' в вашем коде. – LazyOne