Хотя вы, безусловно, можете указать своей IDE тип объекта, извлекаемого из контейнера каждый раз, когда вы получаете к нему доступ, лучше сделать это один раз. Оба из следующих решений включают создание подкласса контейнера. Я только начал использовать Pimple, который все равно рекомендует это делать.
Для контейнеров, в которых используются члены экземпляра, доступ к которым осуществляется с помощью ->
или предоставляется с помощью волшебного метода __get
, вы можете сообщить своей IDE, какой тип они содержат. Это здорово, потому что он не требует дополнительного анализа при запуске кода - он беспокоит только IDE.
/**
* My container. It contains things. Duh.
*
* @property MyService $service
* @property MyDao $dao
*/
class MyContainer extends Container { }
Для Pimple и других контейнеров, которые действуют как массивы, вы можете создавать функции доступа для объектов верхнего уровня, которые вам понадобятся. Хотя это означает, что при создании контейнера требуется больше разбора, это следует сделать один раз и сохранить в APC. В любом случае, я предпочитаю метод, а не доступ к массиву, поскольку он помещает легко забываемый ключ массива в автоматически завершенный метод.
class MyContainer extends Pimple
{
/**
* @return MyService
*/
public function getMyService() {
return $this['service'];
}
}
Кстати, для встроенных переменных с подсказками типов с @var
в NetBeans необходимо использовать /*
с одной звездочкой . Это , а не комментарий блока документов и не работает с /**
или //
. Также имя предшествует типу.
public function foo() {
/* @var $service MyService */
$service = $container['service'];
...
}