www.ciklum.net



Dependency Injection

                    Pavel Voznenko
      PHP Developer, CSC Project Office
Мы сегодня поговорим о...




1. Dependency
2. Inversion of Control
3. Dependency Injection
4. DI Container
5. DI Containers (Phemto)




                  www.ciklum.net   2
Dependency
 Зависимость




    www.ciklum.net   3
Зависимость




         www.ciklum.net   4
Зависимость




 Dependency
  Detected!


         www.ciklum.net   5
Зависимость




  UserClass()

       DbClass()

         www.ciklum.net   6
Зависимость




- Class
- Interface

                       www.ciklum.net   7
Зависимость




                          0_о?
         www.ciklum.net          8
Чем плоха зависимость?



1. Сложность в тестировании
2. Критерии по Роберту Мартину:
 • Жесткость - изменения влекут за собой другие изменения
 • Хрупкость - изменения вызывают поломку
 • Неподвижность - нельзя использовать повторно
 • Вязкость архитектуры - проще писать «плохой» код чем
 «хороший»




                         www.ciklum.net                     9
Inversion of Control
 Инверсия управления




        www.ciklum.net   10
Принцип инверсии зависимостей




    Модули верхнего уровня
 не должны зависеть от
    модулей нижних уровней



                  www.ciklum.net   11
Техники реализации




1. Factory method
2. Service Locator
3. Dependency Injection



                www.ciklum.net   12
Dependency Injection
 Внедрение зависимостей




          www.ciklum.net   13
Внедрение зависимостей - это...




            Настройка объекта         извне
с помощью   передачи зависимых объектов
      через конструктор (метод, атрибут)




                     www.ciklum.net           14
Внедрение зависимостей




              www.ciklum.net   15
Зависимости



UserClass      Session               Db


        Внедрение




   Db           Session           UserClass


                 www.ciklum.net               16
Способы внедрения зависимостей




- Constructor Injection (через конструктор)
- Setter Injection (через метод)
- Property Injection (через атрибут)




                     www.ciklum.net           17
Constructor Injection




              www.ciklum.net   18
Setter Injection




            www.ciklum.net   19
Property Injection




             www.ciklum.net   20
Еще один пример DI




            www.ciklum.net   21
Еще один пример DI




            www.ciklum.net   22
Простое тестирование




             www.ciklum.net   23
Чем хороша внедрения
          зависимостей?

1. Возможность тестирования любого класса в
иерархии зависимостей
2. Принцип единой ответственности
3. Критерии по Роберту Мартину:
 • Жесткость - изменения не влекут за собой другие
 изменения
 • Хрупкость - изменения не вызывают поломку
 • Неподвижность - можно использовать повторно
 • Вязкость архитектуры - нужно писать хороший код!

                        www.ciklum.net               24
DI Контейнер



    www.ciklum.net   25
Зависимость объектов




UserClass       Session           Db




               UserClass
                Session
                       Db


                 www.ciklum.net        26
Порядок внедрения зависимостей




   DI Container                    1. Db


                                   2. Session


                                   3. UserClass




                  www.ciklum.net                  27
Простой контейнер




            www.ciklum.net   28
Чего не хватает?




- Гибкости
- Возможности настраивать




                www.ciklum.net   29
Простой контейнер Фабиена




                www.ciklum.net   30
Простой контейнер Фабиена




                www.ciklum.net   31
Есть одно но




Контейнер может стать
      избыточным
          www.ciklum.net   32
DI Контейнеры



     www.ciklum.net   33
DI Контейнеры




- Symfony Dependency Injection
- Pico Container
- Phemto
- и другие :)




                   www.ciklum.net   34
Phemto



 www.ciklum.net   35
Phemto



– автор Маркус Бэйкер
– сайт проекта: http://phemto.sourceforge.net
– это легкий, автоматизированный DI
контейнер (всего три файла)
– выявление всех зависимостей
объекта



                      www.ciklum.net        36
Phemto




         www.ciklum.net   37
Phemto




         www.ciklum.net   38
Phemto




         www.ciklum.net   39
Phemto




Контроль жизненного цикла объектов:
- Всегда создает новый экземпляр объекта
- Отдает ссылки на один и тот же экземпляр
- Хранит экземпляр объекта в системной
переменной PHP $_SESSION




                     www.ciklum.net          40
Полезные ссылки

- Martin Fowler:
    http://ow.ly/99dmF
- Fabien Potencier:
    http://ow.ly/99dmX
    http://ow.ly/99dnd
- Robert C. Martin:
    http://ow.ly/99doa
- Phemto:
    http://phemto.sourceforge.net




                           www.ciklum.net   41
Спасибо Вам!
 Можно задавать вопросы

                     - P-URL: http://ow.ly/99dvA
                     - Skype: p.voznenko
                     - Twitter: pvoznenko
                     - E-mail: p.voznenko@gmail.com

         www.ciklum.net                          42

Ciklum Odessa PHP Saturday - Dependency Injection