如何以 PHPStorm 理解的方式进行依赖注入

问题描述 投票:0回答:1

我目前正在开发一个 PHP 项目,我在我的代码中实现了依赖注入。代码运行正常,但我遇到了 PHPStorm(版本 2023.1)错误解释代码的问题,这导致类型提示中断。我正在向社区寻求帮助以解决此问题并帮助 PHPStorm 正确解释我的代码以恢复无缝类型提示功能。

为了提供一些上下文,这里有一个简化的代码示例:

class B {

    public static function SayHello(){
        echo 'Hello World';
    }

}


class A {

    /**
     * @param B::class $B
     */
    public function __construct(
        private readonly string $B
    ){}

    public function start(){
        $this->B::SayHello(); // <---- I Would like that SayHallo() was available via typehinting
    }

}

class AFactory extends A {

    public function __construct(){
        parent::__construct(B::class);
    }
}


$class = new AFactory();
$class->start();

这种行为令人费解,因为我已经在 PHPDoc 中明确指出

$B
应该是
B::class
类型,指的是类而不仅仅是一个通用字符串。

在尝试解决这个问题时,我多次尝试通知 PHPStorm

$this->B
应该被识别为 B 类的一个实例,而不仅仅是一个字符串。我尝试的一种方法是在 PHPDoc 中指定
$B
应被视为 B 类的实例。然而,这种方法引入了其他问题。

PHPStorm 将 PHPDoc 声明解释为表明

$B
已经被初始化,但事实并非如此。结果,它引入了进一步的混乱并且没有按预期解决问题。

我将非常感谢社区的任何帮助或建议,以解决此问题或找到有效实施依赖注入的替代方法。

php dependency-injection phpstorm php-8.2
1个回答
0
投票

不幸的是,您无法在不污染代码的情况下执行此操作,因为您无法输入提示

$this->B
。解决方法是将它重新分配给另一个变量并键入提示该变量,如下所示:

    public function start(){
        /** @var B $cls */
        $cls = $this->B;
        $cls::SayHello();
    }
© www.soinside.com 2019 - 2024. All rights reserved.