【问题标题】:IDE static analysis for dynamically instantiated classes动态实例化类的 IDE 静态分析
【发布时间】:2017-02-28 16:56:19
【问题描述】:

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

$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
    ...
}

【问题讨论】:

  • 如果问题只与您的 IDE 有关,您一定要说出是哪一个。我对PHP不是很了解,但是用java+eclipse有一些注解可以帮助IDE的静态分析,对编译后的代码没有副作用。这些注解是特定于 IDE 的,在另一个注解下无效。

标签: php oop static-analysis


【解决方案1】:

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

例如:

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

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

所以也许:

 $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

【讨论】:

  • 似乎很有用。我最近会试试的
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-04-16
    • 2014-01-26
    • 2019-11-08
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-11
    相关资源
    最近更新 更多