Предположим, вы создаете веб-приложение, которое однажды станет упакованным продуктом, которое пользователи захотят расширить и настроить.
Он поставляется с базовой библиотекой, состоящей из файлов PHP, содержащих классы:
/library/
/library/frontend.class.php
/library/filesystem.class.php
/library/backend.class.php
Теперь предположим, что вы хотите сохранить чистое ядро , которое пользователи не смогут исправить. Тем не менее, вы хотите, чтобы пользователь мог настраивать каждую гайку и болт, если это необходимо.
Моя текущая идея состоит в том, чтобы создать механизм автозагрузки, который при создании экземпляра сначала загружает ядро:
/library/frontend.class.php
затем переключается в каталог user
и проверяет, есть ли включение с таким же именем:
/user/library/frontend.class.php
если таковой существует, он также включает это.
Очевидно, что пользовательский файл include должен содержать определение класса, расширяющее определение в ядре include.
Теперь мой вопрос: как бы мне создать такой класс? В конце концов, я всегда могу быть уверен, что есть определение:
class frontend_core
но я не могу быть уверен, что есть
class frontend_user extends frontend_core
Тем не менее, я хотел бы иметь возможность полагаться на одно имя класса и создавать его экземпляры независимо от того, было ли пользовательское расширение класса или нет.
Есть ли умный способ, идея или шаблон, как этого достичь?
Конечно, я мог бы написать простую фабричную вспомогательную функцию, которая сначала ищет класс user
, а затем класс core
и возвращает инициализированный объект, но мне бы очень хотелось, чтобы это было так просто и понятно, как возможно, потому что, как я уже сказал, это будет упакованный продукт.
Я ищу умный трюк или шаблон, который использует как можно меньше кода и вводит как можно меньше новых функций.