PhpStorm:类型提示链接方法

PhpStorm: Type hinting chained methods

在下面的代码片段中,我在 $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();
}

正如 LazyOne 在评论中提到的,您不能键入提示第 3 级实体。

要保留方法名称重构,您可以做的是将 class 元素分配给一个变量,然后键入提示:

/** @var $logger \Monolog\Logger */
$logger = $this->container->logger;
$logger->addInfo('Some exception', $e->getMessage());

接口在 PHP 中不能有状态,只有方法签名。

要消除此错误,您可以尝试将 $this->container 分配给一个变量,并使用具体的 class.

显式键入提示
/** @var $container \Some\ConcreteContainerClass */
$container = $this->container;
$container->logger->addInfo('Some exception', $e->getMessage());

如果 logger 是那个 class 的实际 属性 而不是通过 magic getters 访问的东西,这将起作用。在这种情况下,您可能必须将记录器分配给另一个变量并执行相同的显式类型提示。

另一种选择是禁止对该行进行检查。 https://www.jetbrains.com/help/webstorm/2017.2/suppressing-inspections.html#d218445e68