Отражение для вызова функции в классе, который удовлетворяет свойству - PullRequest
0 голосов
/ 02 июня 2018

У меня есть несколько классов, которые реализуют 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 еще нет?Есть ли другой способ, когда я могу во время выполнения вызвать функцию в классе, который может существовать или не существовать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...