Live самообновляющийся класс PHP

У меня есть один класс PHP, который может взаимодействовать с API, который мы разрабатываем. Вместо того, чтобы использовать разные версии API и позволить пользователю вручную обновлять скрипт класса PHP, я хотел бы сделать этот процесс автоматическим.

Это обновление должно быть сделано на лету, когда обновление было найдено. Это моя идея:

  • Программа пользователя пытается получить доступ к API через предоставляемый нами класс PHP
  • Класс PHP проверяет наличие обновлений
  • При наличии обновления класс загружает новую версию класса и хочет, чтобы новая версия класса обрабатывала запрос API.

Это, очевидно, означает, что класс PHP должен иметь права на запись в файл, в котором существует класс, поэтому он может просто перезаписать класс новой версией.

Но как можно старый класс теперь выполняет запрошенный запрос API через новую версию класса? В идеальном мире я ищу способ сделать это без использования eval (), так как эта функция заблокирована на многих хостах.

Разработать:

$myApi = new MyApi;
$myApi->registerCustomer($customerData);

Функция registerCustomer () будет делать что-то вроде этого:

if (classNotUpToDate) {
downloadNewClass();
registerCustomerthroughNewClass()
} else {
registerCustomerDo();
}

Теперь единственный способ сделать это:

  • Загрузите новую версию класса в переменную
  • В этой переменной замените class MyApi {... с class MyApiUpdate {..
  • Включите текущий файл снова, загружая новый, обновленный класс
  • Создайте экземпляр нового класса: $myApiUpdate = new MyApiUpdate;
  • Вызвать registerCustomer() функция: $myApiUpdate->registerCustomer($customerData);
  • Перезаписать текущее содержимое файла новым кодом класса (без замен)

Это единственный способ достичь того, чего я хочу, без создания нового файла или использования eval ()? Я не думаю, что это очень красивый метод, поэтому я ищу более чистый способ добиться этого.

0

Решение

Я бы посчитал такой подход глубоко небезопасно, и поэтому не рекомендую его.

Вместо этого я рекомендую, чтобы ваш API требовал отправки индикатора «Версия API» при каждом запросе: клиент сообщает серверу, какую версию API он использует, а сервер аналогичным образом сообщает клиенту, какая версия отвечает на него.

Сделайте версии максимально совместимыми вверх. Более новая версия API может взаимодействовать со старой версией, и, поскольку обе стороны идентифицируют себя, вы точно знаете, какие запросы может и не может использовать каждый. Если вы изобрели новый вызов API, который заменяет старый, оставьте и то и другое из них в реализации, даже если вы «заглушите» один из них или имеете реализацию более старого вызова, вызовите код более нового.

Различные версии API могут, при необходимости и целесообразности, быть реализованы с использованием подклассов.

Вы, конечно, должны иметь наборы тестов для каждой версии API, и вы должны убедиться, что все старые тесты продолжают работать правильно с более новыми версиями. То есть, нет «регрессии».

Но нет, нет «автоматические обновления на лету» и нет записываемые файлы. Так как они сказали: «Не только» нет «, но»ад, нет!»

6

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector