php - инъекция зависимостей [дубликат]

взглянуть на функцию rtrim

  rtrim ($ string, ",");   

указанная выше строка удалит символ, если последний символ является запятой

2
задан Kostas Andrianopoulos 8 November 2011 в 23:31
поделиться

2 ответа

Зачем изобретать колесо? Используйте 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. Чтобы получить / установить объекты с одним экземпляром, используйте контейнер (это его ответственность). И чтобы получить экземпляр контейнера, просто нажмите его через конструкторы.

1
ответ дан HappyDeveloper 15 August 2018 в 20:31
поделиться
  • 1
    Я «изобретаю колесо», получить знания и опыт в развитии от него. В противном случае я бы не стал создавать рамки, когда было так много доступных, которые отлично служили. Я заглянул в прыщ и построил нечто подобное, но гораздо проще. – Kostas Andrianopoulos 9 November 2011 в 21:24
  • 2
    Но прежде чем строить контейнер DI, вы должны узнать, почему и как его использовать. И вы, кажется, продолжаете вводить неявные зависимости через статические вызовы (которые вы хотите использовать при использовании DI). Вы также отметили, что DI вводит сложность. Вот для чего нужны контейнеры DI: сделать DI просто – HappyDeveloper 9 November 2011 в 21:28
  • 3
    Это, кажется, более чистый подход от того, что я сделал до сих пор. Ответ принят. – Kostas Andrianopoulos 10 November 2011 в 03:32
  • 4
    Это не инъекция зависимостей, это локатор обслуживания с именем «контейнер» .... -.- – Christoffer Bubach 4 May 2018 в 12:14

Отвечайте на свой вопрос; Посмотрите на PHP автозагрузку . Регистрация классов через автозагрузку делает его таким, что вам не нужно включать / включать всюду, что действительно оказывает положительное влияние на RAD (быстрая разработка приложений).

Мои мысли:

Превосходство в попытке выполнить такую ​​сложную задачу, ваш подход, как представляется, основан на передовой практике, такой как одиночные игры и фабрики.

Мне не нужна инъекция зависимости. OOP основан на инкапсуляции, впрыскивании одного объекта в другой, imo, прерывает эту инкапсуляцию. Когда вы вводите объект в другой объект, целевой объект должен «доверять», что ничего не изменилось в отношении введенного объекта, иначе вы можете получить необычное поведение.

Рассмотрите сопоставление имен между вашими классами (не PHP-интервал между именами, но префикс вашей структуры, например Zend, Zend_), это поможет вам зарегистрировать пространство имен, а затем, когда класс называется автозагрузчиком, убедитесь, что загружен соответствующий класс. Так работает Zend_Framework. Для специфики проверьте Zend_Loader_Autoloader . Система Symfony на самом деле делает этот шаг еще дальше; во время первого запроса он будет проходить через все известные местоположения, которые ищут файлы классов, затем он построит массив классов и путей к файлам, затем сохранит массив в файле (кэширование файлов), поэтому последующие запросы не будут иметь те же накладные расходы. Что-то для вашей рамки.

Что касается файлов конфигурации, Symfony использует файлы YAML, которые я считаю чрезвычайно гибкими. Вы даже можете включить PHP-код для большей гибкости. Symfony предоставил автономный анализатор YAML , который прост в использовании. Вы можете увеличить производительность, добавив слой кэширования и кешировав анализируемые файлы YAML, поэтому вам не нужно разбирать файлы для каждого запроса.

Предполагаю, что вы создаете свою фреймворк поверх ORM. Моя рекомендация не связана с какой-либо функциональностью, характерной для версии ORM, иначе ваша инфраструктура будет сочетаться с этой версией, и вам придется одновременно обновлять ORM и структуру.

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

0
ответ дан Mike Purcell 15 August 2018 в 20:31
поделиться
  • 1
    Спасибо за вклад, но вы на самом деле не отвечаете на мой вопрос. Это моя ошибка, я забыл упомянуть, что я уже использую пространства имен и автозагрузку классов. Мой вопрос заключается не в том, как просто загружать классы, а в том, как загружать их, не вводя жесткой связи между ними и трудно поддерживать код. – Kostas Andrianopoulos 9 November 2011 в 00:39
Другие вопросы по тегам:

Похожие вопросы: