PhpStorm:类型提示链接方法

时间:2019-01-08 02:46:21

标签: php 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();
}

2 个答案:

答案 0 :(得分:1)

正如LazyOne在评论中提到的那样,您不能输入提示三级实体。

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

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

答案 1 :(得分:0)

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

为使此错误消失,您可以尝试将$ this-> container分配给变量,然后使用具体的类显式键入提示。

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

如果logger是该类的实际属性,而不是通过魔术获取器访问的属性,则可以使用。在这种情况下,您可能必须将logger分配给另一个变量,并执行相同的显式类型提示。

另一个选择是抑制该行的侵害。 https://www.jetbrains.com/help/webstorm/2017.2/suppressing-inspections.html#d218445e68