Я создаю класс из переменных (в контролируемой среде) следующим образом:
$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 IDE вы можете использовать PHP-DOC аннотации указать тип и помочь со статическим анализом.
Например.:
/** @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
Возможно, вам нужно немного настроить свою IDE.
Или чтобы прояснить для вашей IDE, вы можете использовать пространства имен, которые будут указывать на ваш new $controllerClassName();
Вы можете прочитать больше о пространствах имен Вот