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

时间:2017-02-28 16:56:19

标签: php oop static-analysis

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

$controller = new $controllerClassName();

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

这就是我想要做的事情:

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

编辑:我正在使用PhpStorm IDE

解决方案:

正如 yivi 所示,我使用过PHP-Doc注释,所以现在它正常工作

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

请注意,“MyInterface”可以是类或接口。

另外,我尝试过以下代码,但无效。似乎注释必须位于变量的同一块中:

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

2 个答案:

答案 0 :(得分:1)

您没有指定您的ide,但在大多数称职的PHP IDE中,您可以使用PHP-DOC annotations指定类型并帮助进行静态分析。

E.g:

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

在您的情况下,由于您出于某种原因动态实例化您的类,您可能应该(如您所说)使用由您可能实例化的类实现的接口,或者该系列的父类。 / p>

所以也许:

 $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

答案 1 :(得分:-1)

也许您需要稍微调整一下IDE 或者为了清楚说明您的IDE,您可以使用指向var Test = "3700 NO LAND VALUE (Lease Property) (0.10)" var regExp = /\(([0-9|.]+)\)/; var matches = regExp.exec(Test); var result = matches[1]; console.log(result);的名称空间 您可以阅读有关名称空间here

的更多信息