У меня есть несколько классов, которые реализуют IInfoProvider
.Каждый подкласс имеет повторно реализованную функцию под названием providesInfoFor()
, которая возвращает string
имени типа устройства, с которым он может выполнять действия.Каждый подкласс предоставляет различные типы действий.Например, ABCInfoProvider
объявит такие функции, как doThis($device)
и doThat($device)
, а XYZInfoProvider
объявит такие функции, как doNow($device)
и doLater($device)
.Я не создавал экземпляров ABCInfoProvider
или XYZInfoProvider
, поэтому они не отображаются в моем списке get_declared_classes
.Это приложение, основанное на Laravel, и ниже приведен фрагмент кода, который я пытаюсь заставить работать:
//Works if I uncomment these two lines, which I don't want to do
//$a = new ABCDeviceInfoProvider();
//$a = new XYZDeviceInfoProvider();
//Iterate over each class
foreach (get_declared_classes() as $className) {
//Check if the class derives from IInfoProvider
if (in_array(IInfoProvider::class, class_implements($className))) {
//Create an instance of the class since it derives from IInfoProvider
$infoProvider = new $className();
//Check that the IInfoProvider has a specific function on it
if (method_exists($infoProvider, $action)) {
//Call the function, this is equivlent to 'new ABCInfoProvider()->doThis($device);'
$response = $infoProvider->$action($device);
return response()->json($response);
} else {
return response()->json(['error' => 'Action not implemented for device'], 400);
}
}
}
Итак, вопрос в том, как заставить это работать, если я не объявилэкземпляр какого-нибудь из моих IInfoProviders
еще нет?Есть ли другой способ, когда я могу во время выполнения вызвать функцию в классе, который может существовать или не существовать?