взглянуть на функцию rtrim
rtrim ($ string, ",");
указанная выше строка удалит символ, если последний символ является запятой
Зачем изобретать колесо? Используйте Pimple в качестве контейнера DI и узнайте, как использовать его в своей документации.
Или используйте микрофрейм Silex в качестве базы для создания собственного фреймворк. Это расширяет функциональность Pimple, поэтому вы можете использовать инъекцию зависимостей.
Чтобы ответить на ваш вопрос, так вы используете DI, не связывая свои классы с ним:
interface ContainerInterface {
public function getService($service_name);
public function registerService($service_name,Closure $service_definition);
}
class Application {
public function __construct(ContainerInterface $container) {
$this->container= $container;
}
public function run() {
// very simple to use!
$this->container->getService('db')->someDatabaseQuery();
}
}
$c = new My_DI_Container;
// Service definitions could be in a separate file
$c->registerService('db',function() { return new Database('some config'); });
// Then you inject your DI container into the objects that need it
$app = new Application($c);
$app->run(); // or whatever
Таким образом , контейнер DI развязан, и в будущем вы можете использовать другую реализацию. Единственное требование состоит в том, что он реализует ContainerInterface.
Обратите внимание, что объект контейнера толкается и не вытягивается. Избегайте использования singleton. Чтобы получить / установить объекты с одним экземпляром, используйте контейнер (это его ответственность). И чтобы получить экземпляр контейнера, просто нажмите его через конструкторы.
Отвечайте на свой вопрос; Посмотрите на PHP автозагрузку . Регистрация классов через автозагрузку делает его таким, что вам не нужно включать / включать всюду, что действительно оказывает положительное влияние на RAD (быстрая разработка приложений).
Мои мысли:
Превосходство в попытке выполнить такую сложную задачу, ваш подход, как представляется, основан на передовой практике, такой как одиночные игры и фабрики.
Мне не нужна инъекция зависимости. OOP основан на инкапсуляции, впрыскивании одного объекта в другой, imo, прерывает эту инкапсуляцию. Когда вы вводите объект в другой объект, целевой объект должен «доверять», что ничего не изменилось в отношении введенного объекта, иначе вы можете получить необычное поведение.
Рассмотрите сопоставление имен между вашими классами (не PHP-интервал между именами, но префикс вашей структуры, например Zend, Zend_), это поможет вам зарегистрировать пространство имен, а затем, когда класс называется автозагрузчиком, убедитесь, что загружен соответствующий класс. Так работает Zend_Framework. Для специфики проверьте Zend_Loader_Autoloader . Система Symfony на самом деле делает этот шаг еще дальше; во время первого запроса он будет проходить через все известные местоположения, которые ищут файлы классов, затем он построит массив классов и путей к файлам, затем сохранит массив в файле (кэширование файлов), поэтому последующие запросы не будут иметь те же накладные расходы. Что-то для вашей рамки.
Что касается файлов конфигурации, Symfony использует файлы YAML, которые я считаю чрезвычайно гибкими. Вы даже можете включить PHP-код для большей гибкости. Symfony предоставил автономный анализатор YAML , который прост в использовании. Вы можете увеличить производительность, добавив слой кэширования и кешировав анализируемые файлы YAML, поэтому вам не нужно разбирать файлы для каждого запроса.
Предполагаю, что вы создаете свою фреймворк поверх ORM. Моя рекомендация не связана с какой-либо функциональностью, характерной для версии ORM, иначе ваша инфраструктура будет сочетаться с этой версией, и вам придется одновременно обновлять ORM и структуру.
Я бы предложил посмотреть под капотом в других рамках и посмотреть, можете ли вы выбрать лучшее из каждого; в результате получается прочная, простая в использовании структура.