2017-02-28 64 views
1

我创建自变量类(在受控环境中)IDE静态分析:像这样动态实例化类

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

如果问题只涉及您的IDE,你应该肯定地说,它是。我不太了解PHP,但是使用java + eclipse有一些注释可以帮助IDE的静态分析,并且在编译的代码中没有副作用。这些注释特定于IDE,并且在另一个下面不起作用。 – Aaron

回答

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 
+0

似乎很有用。最近我会尝试 – dimasdmm

+1

完美的yivi,谢谢 – dimasdmm

-1

也许您需要调整您的IDE一点。
还是要清楚你的IDE,你可以使用命名空间,这将指向你new $controllerClassName();
你可以阅读更多关于命名空间here