PhpStorm: цепные методы с подсказками типов

В приведенном ниже фрагменте кода я получаю подсказку типа на $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();
}

прежде чем идти дальше: вы использовали стандартный метод исправления ошибок Jetbrains ??? это будет 'файл-> переиндексировать и перезапустить'

YvesLeBorg 08.01.2019 04:14

Хаха да, хотя спасибо!

pcgben 08.01.2019 04:17

Если ContainerInterface - own code, попробуйте добавить объявление @var в интерфейс для logger var.

YvesLeBorg 08.01.2019 04:20
@var Monolog\Logger $this->container->logger - это просто неправильно, так как вы не можете напечатать сущность 3-го уровня таким образом. PHPDoc и PhpStorm позволяют печатать только 1-го уровня.
LazyOne 08.01.2019 11:05

У Вас есть какие-то предложения?

pcgben 08.01.2019 22:29

Обычно вы создаете какой-нибудь файл-заглушку (только для глаз IDE) с классом, который описывает ваш класс контейнера, и объявляете там logger как свойство. Нет лучших идей.

LazyOne 09.01.2019 20:29

Что ж, проблема в том, что у интерфейса не может быть членов. Вы должны объявить $ container как конкретный класс (используя / ** @var $ container SomeClass ** /

JorgeeFG 10.01.2019 23:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
7
357
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Как 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

Другие вопросы по теме