IDE 动态实例化的静态分析类

IDE static analysis for dynamically instantiated classes

我正在从变量(在受控环境中)创建一个 class,如下所示:

$controller = new $controllerClassName();

但是我的IDE不知道class是什么类型。所以,我想知道是否有办法识别 class(也许我可以创建一个接口)。

这就是我想要做的:

$controller = (InterfaceController) new $controllerClassName();

编辑: 我正在使用 PhpStorm IDE

解法:

正如 yivi 所建议的那样,我已经使用了 PHP-Doc 注释,所以现在 working:

$controller = new $controllerClassName();
/** @var MyInterface $controller */

请注意 "MyInterface" 可以是 class 或接口。

此外,我尝试执行以下代码,但没有成功。看来注解必须在变量的同一块中:

/**
 * @param string $var1
 * @param string $var2
 * ...
 * @var MyInterface $controller
 */
function thisIsAFunction($var1, $var2, ...) {
    ...
    $controller = new $controllerClassName(); // <- Class still unknown
    ...
}

也许您需要稍微调整一下 IDE。
或者为了让您的 IDE 清楚,您可以使用指向您的 new $controllerClassName();
的名称空间 您可以阅读有关命名空间的更多信息 here

您不指定 ide,但在大多数功能强大的 PHP IDE 中,您可以使用 PHP-DOC annotations 指定类型并帮助 static-analysis。

例如:

/** @var SomeClass $someClass */
$someClass->thisCouldBeAutoCompleted();

在您的情况下,由于您出于某种原因动态实例化 class,您可能应该(如您所说)使用由您负责的 classes 实现的接口实例化,或者一个 parent class 的家庭。

所以也许:

 $painter = new $painterImplementingClass();
 /** @var PaintInterface $painter $painter*/
 $painter->line($point1, $point2, $color);
 // auto-completion should work for Pencil, Pen, Brush and other
 // classes that implement PaintInterface

或者

 $vehicle = new $vehicleClass();
 /** @var AbstractVehicle $vehicle */
 $vehicle->accelerate($acceleration, $time);
 // auto-completion and static analysis should work for Car, Bicycle,
 // Boat and other classes that extend AbstractVehicle