Zend Framework 2 - 构造函数中的类型提示 - IDE抱怨类型

时间:2015-10-11 09:14:21

标签: php zend-framework2 phpstorm type-hinting

在Zend Framework 2模块中,我使用了一个闭包作为工厂:

'controllers' => [
    'factories' => [
        'ZendSkeletonModule\Controller\Skeleton' => function(AbstractPluginManager $pm) {
            return new Controller\SkeletonController($pm->getServiceLocator()->get('Doctrine\ORM\EntityManager'));
        },
    ],
],

虽然这没有任何问题,但我的IDE(PHP Storm)在$pm->getServiceLocator()->get('Doctrine\ORM\EntityManager')抱怨以下消息:

  

预期\ Doctrine \ ORM \ EntityManagerInterface,得到数组|对象   调用参数类型与声明的不兼容。

那是因为在控制器中,我使用Doctrine\ORM\EntityManagerInterface作为类型提示,我明白了。

但为什么PHP Storm会抱怨,我在这里看不到任何错误?此外,代码工作正常,所以我有点困惑。我是否需要添加某种特殊评论或某些内容来帮助' IDE?

1 个答案:

答案 0 :(得分:1)

将EntityManager分配给带有PhpStorm静态分析可以使用的注释的变量。 get方法本身对它不透明:

use Doctrine\ORM\EntityManager;
// snip
'controllers' => [
    'factories' => [
        'ZendSkeletonModule\Controller\Skeleton' => function(AbstractPluginManager $pm) {
            /** @var EntityManager $entityManager */
            $entityManager = $pm->getServiceLocator()->get(EntityManager::class);
            return new Controller\SkeletonController($entityManager);
        },
    ],
],

另外一些建议:

  1. 使用具体的工厂类,而不是使用闭包。这是因为闭包不能被操作码缓存,如果它包含闭包,你的配置数组也不能被缓存。

  2. 一个小问题,但假设PHP 5.5+,请考虑使用\Doctrine\ORM\EntityManager::class,就像我在上面的示例中所做的那样,而不是使用ServiceLocator上的get方法的字符串文字。