Возможность настраиваемых классов, но с единым именем класса - PullRequest
6 голосов
/ 11 марта 2010

Предположим, вы создаете веб-приложение, которое однажды станет упакованным продуктом, которое пользователи захотят расширить и настроить.

Он поставляется с базовой библиотекой, состоящей из файлов 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 и возвращает инициализированный объект, но мне бы очень хотелось, чтобы это было так просто и понятно, как возможно, потому что, как я уже сказал, это будет упакованный продукт.

Я ищу умный трюк или шаблон, который использует как можно меньше кода и вводит как можно меньше новых функций.

Ответы [ 5 ]

3 голосов
/ 11 марта 2010

Почему вы не придерживаетесь подхода, используемого Propel? Вы генерируете свои базовые классы и уже предоставляете пустой класс User (расширяющий базовый класс), где ваши пользователи могут помещать свои переопределения / конкретные детали реализации, а в своем коде вы всегда ссылаетесь на классы User. Таким образом, вы просто используете обратную логику, которую вы описали.

Если приведенное выше объяснение не понятно, проверьте http://propel.phpdb.org/trac/wiki/Users/Documentation/1.4/QuickStart#a6.UsingtheGeneratedSQLandOMFiles и сгенерируйте код для небольшой базы данных. Базовые классы находятся в папке om, пользовательские классы (по умолчанию пустые) находятся в корневой папке.

0 голосов
/ 11 марта 2010

У вас может быть класс загрузчика, который будет решать, какой класс создавать:

Loader::instance()->load('Frontend')
0 голосов
/ 11 марта 2010

Я бы использовал конструктор базового класса для определения загружаемого пользовательского класса, а затем реализовал метод фабрики в базовом классе для генерации экземпляров пользовательского класса. Сделав конструктор пользовательского класса защищенным, а пользовательский класс расширит базовый класс, вы можете быть уверены, что код в другом месте не может создать экземпляр пользовательского класса.

С

0 голосов
/ 11 марта 2010

Я думаю, что с одним именем файла все сложнее, если вы хотите использовать наследование. В основном class user_frontend extends core_frontend должен знать, где найти оба класса. Оба должны быть включены.

Если вы просто хотите сделать new Frontend, вы можете использовать PHP5.3 class_alias, чтобы указать Frontend на используемый основной класс. Ниже 5.3. Вы можете использовать ServiceFinder, который знает, как сопоставить имена сервисов с классами, а затем получить внешний интерфейс с $service->get('frontend') или использовать Framework Inpendency Injection .

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

0 голосов
/ 11 марта 2010

Я бы реализовал хуки в ядре, поэтому пользователям не нужно взламывать ядро, но они все еще могут расширять ядро ​​с помощью хуков

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