В приведенном ниже фрагменте кода я получаю подсказку типа на $contactInfo[0] и снова на $order.
Я хотел бы то же самое с logger, который является объектом типа \Monolog\Logger, доступ к которому осуществляется как член \psr\container\ContainerInterface.
Я использую PhpStorm, который предупреждает меня, что Field 'logger' not found in Psr\Container\ContainerInterface
/**
* @param Order $order
* @param ContactInfo[] $contactInfo
* @var Monolog\Logger $this->container->logger
*/
private function buildCreateOrderJSON(Order $order, $contactInfo)
{
try {
$currentDate = new DateTime();
} catch (Exception $e) {
$this->container->logger->addInfo('Some exception', $e->getMessage());
return;
}
$lastName = $contactInfo[0]->getLastName();
$order->getInvoiceNumber();
}
Хаха да, хотя спасибо!
Если ContainerInterface - own code, попробуйте добавить объявление @var в интерфейс для logger var.
@var Monolog\Logger $this->container->logger - это просто неправильно, так как вы не можете напечатать сущность 3-го уровня таким образом. PHPDoc и PhpStorm позволяют печатать только 1-го уровня.
У Вас есть какие-то предложения?
Обычно вы создаете какой-нибудь файл-заглушку (только для глаз IDE) с классом, который описывает ваш класс контейнера, и объявляете там logger как свойство. Нет лучших идей.
Что ж, проблема в том, что у интерфейса не может быть членов. Вы должны объявить $ container как конкретный класс (используя / ** @var $ container SomeClass ** /






Как LazyOne упомянул в комментариях, вы не можете ввести подсказку для объекта 3-го уровня.
Что вы можете сделать, чтобы сохранить рефакторинг имени метода, так это присвоить свой элемент класса переменной, а затем ввести подсказку, которая:
/** @var $logger \Monolog\Logger */
$logger = $this->container->logger;
$logger->addInfo('Some exception', $e->getMessage());
Интерфейсы не могут иметь состояния в PHP, только сигнатуры методов.
Чтобы эта ошибка исчезла, вы можете попробовать назначить $ this-> container переменной и ввести подсказку, которая явно связана с конкретным классом.
/** @var $container \Some\ConcreteContainerClass */
$container = $this->container;
$container->logger->addInfo('Some exception', $e->getMessage());
Это сработает, если logger является фактическим свойством этого класса, а не чем-то, доступным через магические геттеры. В этом случае вам, возможно, придется назначить регистратор другой переменной и сделать такую же явную подсказку типа.
Другой вариант - подавить пересечение этой линии. https://www.jetbrains.com/help/webstorm/2017.2/suppressing-inspections.html#d218445e68
прежде чем идти дальше: вы использовали стандартный метод исправления ошибок Jetbrains ??? это будет 'файл-> переиндексировать и перезапустить'