2017-02-28 100 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