Dependency Injection in PHP
Upcoming SlideShare
Loading in...5
×
 

Dependency Injection in PHP

on

  • 9,629 views

Slides from my talk during PHPCon Poland.

Slides from my talk during PHPCon Poland.
Szczyrk 25/10/2013

Statistics

Views

Total Views
9,629
Views on SlideShare
7,637
Embed Views
1,992

Actions

Likes
17
Downloads
53
Comments
2

21 Embeds 1,992

http://localhost 697
http://xlab.pl 461
http://techportal.inviqa.com 296
https://twitter.com 281
http://www.webtuts.com.pl 107
http://piotrpasich.com 63
http://piotrpasich.papidev.com 34
http://cloud.feedly.com 22
http://www.google.com 6
http://digg.com 5
http://192.168.1.5 3
http://symfony2developer.com 3
http://www.linkedin.com 2
http://ipv6.symfony2developer.com 2
http://xsolve_feed.tutorials 2
http://rss-reader.debian 2
http://feedly.com 2
https://drive.jolicloud.com 1
http://feeds.feedburner.com 1
http://test.idoc.vn 1
http://newsblur.com 1
More...

Accessibility

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel

12 of 2

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Dependency Injection in PHP Dependency Injection in PHP Presentation Transcript

    • Dependency Injection in PHP PHPCon Poland Szczyrk 25/10/13 ! by @cakper flickr.com/limowreck666/223731385/
    • Kacper Gunia // @cakper Software Engineer @SensioLabsUK Symfony Certified Developer #Symfony-PL // SymfonyLab.pl Silesian PHP User Group // SPUG.pl
    • Inversion of Control Dependency Injection Events Aspect Oriented Programming flickr.com/goetter/4559773791/
    • Diving into Dependency Injection flickr.com/haniamir/651043585/
    • Dependency Injection ! ! class  DvdPlayer   {          public  function  playDisc(Disc  $disc)          {                  echo  'Now  playing:  '.$disc-­‐>getMovieTitle();   !                $tv  =  new  Tv('Samsung  40"');                  $tv-­‐>sendToOutput($disc-­‐>getResource());          }   }
    • Dependency Injection class  DvdPlayer   {          private  $tv;   !        public  function  __construct()          {                  $this-­‐>tv  =  new  Tv('Samsung  40"');;          }   !        public  function  playDisc(Disc  $disc)          {                  echo  'Now  playing:  '  .  $disc-­‐>getMovieTitle();                  $this-­‐>tv-­‐>sendToOutput($disc-­‐>getResource());          }   }
    • Dependency Injection class  DvdPlayer   {          private  $tv;   !        public  function  __construct(Tv  $tv)          {                  $this-­‐>tv  =  $tv;          }  //  (...)   }   ! $tv  =  new  Tv('Samsung  40"');   $dvdPlayer  =  new  DvdPlayer($tv);
    • Dependency Injection class  DvdPlayer   {          private  $device;   !        public  function  __construct(HdmiDevice  $device)          {                  $this-­‐>device  =  $device;          }  //  (...)   }   ! $projector  =  new  Projector('Epson  EB');   $dvdPlayer  =  new  DvdPlayer($tv);
    • Nailed it!
    • “Dependency Injection 
 is where components are given their dependencies through their constructors, methods, or directly into fields.” ! “(...) it is a 25-dollar term for a 5-cent concept” source: picocontainer.codehaus.org jamesshore.com
    • Types of Injection Constructor Setter Property Reflection flickr.com/jensfinke/4417602702/
    • Constructor Injection class  Tv  implements  HdmiDevice{}   class  DvdPlayer   {          private  $device;   !        public  function  __construct(HdmiDevice  $device)          {                  $this-­‐>device  =  $device;          }   }   ! $tv  =  new  Tv('Samsung  40"');   $dvdPlayer  =  new  DvdPlayer($tv);
    • Setter Injection class  BlurayDisc  implements  Disc{}   class  DvdPlayer   {          private  $disc;   !        public  function  setDisc(Disc  $disc)          {                  $this-­‐>disc  =  $disc;          }   }   ! $disc  =  new  BlurayDisc('Pulp  Fiction');   $dvdPlayer  =  new  DvdPlayer();   $dvdPlayer-­‐>setDisc($disc);
    • Property Injection class  DvdPlayer   {          public  $remote;   }   ! $dvdPlayer  =  new  DvdPlayer();   $dvdPlayer-­‐>remote  =  new  Remote();
    • Reflection Injection class  DvdPlayer   {          private  $powerSupply;   }   ! $dvdPlayer  =  new  DvdPlayer();   $reflector  =  new  ReflectionClass($dvdPlayer);   $powerSupply  =  $reflector-­‐>getProperty('powerSupply');   $powerSupply-­‐>setAccessible(true);   ! $powerSupply-­‐>setValue($dvdPlayer,  new  PowerSupply());
    • Pros & Cons flickr.com/paperpariah/3589690234/
    • Advantage #1 Decoupling flickr.com/roonster/3387705446/
    • Advantage #2 Dependency Inversion Principle flickr.com/antonsiniorg/1876733029/
    • Advantage #3 Reusability flickr.com/ejpphoto/2314610838/
    • Advantage #4 Clean code flickr.com/38659937@N06/4020413080/
    • Advantage #5 Easier testing flickr.com/nattu/895220635/
    • Advantage #6 Instance management flickr.com/34094515@N00/3817086937/
    • Advantage #7 IDE support flickr.com/gavin_fordham/9407339641/
    • Disadvantage Complex initialisation flickr.com/toniblay/52445415/
    • Simple Solution Factory flickr.com/lenscrack/5577431429/
    • Proper Solution Dependency Injection Container flickr.com/thomashawk/24089964/
    • “Dependency Injection Container is simply a PHP object that manages the instantiation of other objects” ! We call them “Services” source: symfony.com
    • Our DvdPlayer ! ! $tv  =  new  Tv('Samsung  40"');   $dvdPlayer  =  new  DvdPlayer($tv);   ! $disc  =  new  Disc('Pulp  Fiction');   $dvdPlayer-­‐>playDisc($disc);
    • Simple Container class class  Container   {          public  function  getTv()          {                  return  new  Tv('Samsung  40"');          }   !        public  function  getDvdPlayer()          {                  return  new  DvdPlayer($this-­‐>getTv());          }   }
    • Container use ! ! $container  =  new  Container();   ! $dvdPlayer  =  $container-­‐>getDvdPlayer();   ! $disc  =  new  Disc('Pulp  Fiction');   $dvdPlayer-­‐>playDisc($disc);
    • DIC Implementations Twittee Pimple PHP-DI  ZendDi IlluminateContainer OrnoDi LeagueDi SymfonyDependencyInjection  flickr.com/smb_flickr/313116995/
    • DI & DIC Patterns flickr.com/thelearningcurvedotca/8645721482/
    • Pattern #1 Expect Interfaces, not Implementations flickr.com/deapeajay/2969264395/
    • Pattern #2 Don’t check null values flickr.com/g-ratphotos/3328593629/
    • class  DvdPlayer   {          public  $disc;   !        public  function  play()          {                  if  (!is_null($this-­‐>disc))  {                          $this-­‐>sendToOutput($this-­‐>disc-­‐>getResource());                  }          }   !        public  function  play()          {                  if  ($this-­‐>disc  instanceof  Disc)  {                          $this-­‐>sendToOutput($this-­‐>disc-­‐>getResource());                  }          }   }
    • Pattern #3 Avoid ‘Service Locator’ flickr.com/mateus27_24-25/2224073271/
    • class  DvdPlayer   {          private  $locator;   !        public  function  __construct()          {                  $this-­‐>locator  =  ServiceLocator::getInstance();          }   ! !        public  function  playDisc(Disc  $disc)          {                  $this-­‐>locator                            -­‐>getTv()                            -­‐>sendToOutput($disc-­‐>getResource());          }   }
    • Pattern #4 Don’t inject whole container flickr.com/ucumari/580865728/
    • Pattern #5 In DIC store Services and Properties, but not Entities flickr.com/madlyinlovewithlife/8674850717/
    • Pattern #6 Don’t be afraid to create plenty of small Classes flickr.com/geoki/2691420977/
    • Symfony DIC in action
    • Services new  Tv('Samsung  40”’)   ! services:      tv:          class:            Tv          arguments:    [“Samsung  40"”]  
    • Parameters new  Tv('Samsung  40”’)   ! parameters:      tv_name:    Samsung  40"  
    • Parameters & Services new  Tv('Samsung  40”’)   ! parameters:      tv_name:    Samsung  40"   ! services:      tv:          class:            Tv          arguments:    [“%tv_name%”]   ! $container-­‐>get('tv');
    • Compiled Container ! ! ! ! protected  function  getTvService()   {          return  $this-­‐>services['tv']  =  new  Tv('Samsung');   }  
    • Static Factory services:          tv                  class:                    Tv                    factory_class:    TvFactory                  factory_method:  get
    • Factory services:          tv_factory:                  class:                      TvFactory          tv                  class:                      Tv                    factory_service:  tv_factory                  factory_method:    get
    • Optional Dependencies class  DvdPlayer   {      function  __construct(HdmiDevice  $device  =  null){}   }   ! services:      tv:          class:            Tv          arguments:    [%tv_name%]      dvd_player:              class:        DvdPlayer              arguments  ["@?tv"]  
    • Lazy-loaded Services services:      tv:          class:            Tv          arguments:    [“%tv_name%”]       lazy:         true
    • Private Services services:      drm_decryptor:          class:            DrmDecryptor       public:       false      dvd_player:              class:        DvdPlayer              arguments  [“@drm_decryptor”]
    • Scopes services:      tv:          class:            Tv          arguments:    [“%tv_name%”]       scope:       prototype
    • PHPStorm support Adrien Brault sxc.hu/photo/228094/
    • Questions? ! Thank you! :) ! joind.in/9760 flickr.com/eole/3809742516/