如何解决使用set方法时,PHP-DI可能会进行多态调用
问题
当我尝试在PHP-DI容器中设置新值时,来自PHPStorm的意外警告。
给出以下代码:
function inject(Psr\Container\ContainerInterface $container){
$container->set(RandomClass::class,new RandomClass());
}
$container = new DI\Container(); class is instantiated
inject($container);
以下警告已触发
可能是多态调用。层次结构中没有成员
我了解警告的含义,但我不明白为什么会弹出警告,特别是因为在Google和SO上查找时没有发现这种情况的任何发生,并且文档中没有提及它。
我有什么想念的,还是“假阳性”?
解决方法
问题背后的原因
给出以下代码(与我使用的代码非常相似)
function inject(Psr\Container\ContainerInterface $container){
$container->set(RandomClass::class,new RandomClass());
}
$container = new DI\Container(); class is instantiated
inject($container);
$container->set(...)
调用将触发以下警告
可能是多态调用。层次结构中没有成员
这是可以预期的,因为Psr\Container\ContainerInterface
仅包含以下方法的定义
-
get($id)
-
has($id)
解决方案
此问题的两种可能的解决方案:
- 直接在容器中键入方法,确保不使用类的FQN,而仅使用
Container
和“使用名称空间”,这将使更改到新的容器包更加容易(因为这是仍然能够实现PSR的目标,几乎能够热交换软件包。 - 基于
Psr\Container\ContainerInterface
创建一个自定义界面,并向其中添加所需的方法。
或者,最终,您可以尝试使 PHP-FIG 扩展 PSR-11 标准,使其包含标准set($id,$value)
方法。
set()
方法不是Psr\Container\ContainerInterface
的一部分。
如果要使用该方法,则不能在界面上键入提示,因为您的代码明确需要一个PHP-DI实例。
您的代码不必是通用的,不要想太多。 PSR主要用于框架和库(它们需要与多个容器兼容),而不是最终用户。
切换容器库的那一天,除了替换set()
调用之外,您还有许多其他复杂的事情要做。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。