Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Dependency Injection with PHP
Search
Bastian Hofmann
July 18, 2012
Programming
640
5
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Dependency Injection with PHP
Bastian Hofmann
July 18, 2012
More Decks by Bastian Hofmann
See All by Bastian Hofmann
Monitoring in Kubernetes with Prometheus and Grafana
bastianhofmann
0
370
Creating a fast Kubernetes Development Workflow
bastianhofmann
0
150
Highly available cross-region deployments with Kubernetes
bastianhofmann
1
180
From source to Kubernetes in 30 minutes
bastianhofmann
0
200
Introduction to Kubernetes
bastianhofmann
1
140
CI/CD with Kubernetes
bastianhofmann
0
250
Creating a fast Kubernetes Development Workflow
bastianhofmann
1
290
Deploying your first Micro-Service application to Kubernetes
bastianhofmann
2
220
Creating a fast Kubernetes Development Workflow
bastianhofmann
0
280
Other Decks in Programming
See All in Programming
コンパウンドプロダクト開発のためのローカルプロセスマネージャー再発明 #layerxgo
izumin5210
0
650
スマート反転とウェブアクセシビリティ
camiha
0
130
{ Android | Kotlin } Gradle Plugin in 2026
ryunen344
1
290
MIZARU@SPAJAM2026 第二回予選
1901drama
0
110
【デモ】Kiroで体験する仕様駆動開発|設計からコーディングまでAIと進める開発フロー
cmkudo
0
590
アクセシビリティから考える情報設計
high_g_engineer
0
270
Kiroで創り、AgentCoreで繋ぐ!AWSで実践する「AI-DLC」から「AIエージェント統合」までの最新地図
licux
2
350
DynamoDBの基礎を振り返りながらベクトル検索機能を理解する
musan
3
270
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
LL言語やWebフレームワークのPostgreSQL対応 〜DBの機能がユーザーに届くまで〜
kentaroutakeda
0
140
XHTMLが残したもの
yosuke_furukawa
PRO
2
420
AIは賢い。でも実行環境は? CLIおじさんがAI時代に伝えたいこと ~ CLIおじさんがAI時代に伝えたいこと ~
curekoshimizu
1
160
Featured
See All Featured
エンジニアに許された特別な時間の終わり
watany
108
250k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
RailsConf 2023
tenderlove
30
1.5k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
400
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
510
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
Leo the Paperboy
mayatellez
8
2.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
First, design no harm
axbom
PRO
2
1.3k
A designer walks into a library…
pauljervisheath
211
25k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
200
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Transcript
Dependency Injection with PHP @BastianHofmann
None
None
?
None
None
None
None
None
None
None
Dependency Inversion
http://www.doolwind.com/blog/solid-principles-for-game-developers/
http://www.doolwind.com/blog/solid-principles-for-game-developers/
High-level modules should not depend on low level modules but
on abstractions. ”
A B C
A B C <<interface>> <<interface>>
A B C <<interface>>
A B Adapter <<interface>> C
Dependencies
None
Dependency Injection
Constructor
None
None
Setter
None
Method argument
None
Constructing classes
None
Benefits
Easier to change
Easier testing
Only test the class, not the dependencies
None
Mocking
None
None
http://www.doolwind.com/blog/solid-principles-for-game-developers/
But...
None
Make it easier with factories
None
Dependency Injection Container
None
rg\injektor inspired by google-guice
https://github.com/researchgate/injektor
http://getcomposer.org/ http://packagist.org/
$ cat composer.json
$ wget http://getcomposer.org/composer.phar $ php composer.phar install Installing dependencies -
Installing monolog/monolog (1.1.0) Downloading: 100% ... monolog/monolog suggests installing mlehner/ gelf-php (Allow sending log messages to a GrayLog2 server) Writing lock file Generating autoload files
Creating an instance of a class
None
None
None
Automatic creation of dependencies through Typehints
None
@inject
None
What classes can be injected?
No constructor
None
Constructor without arguments
None
Constructor with arguments that have default values
None
Injectable constructor
None
None
By the way: Property Injection
None
Singletons with public static getInstance method following the same rules
None
STOP: Don‘t use Singeltons
Singletons are evil!
Let the DIC take care of instances
@singleton
None
Passing additional, fixed values to instance
None
Working with Interfaces
None
But we can not create an instance of an Interface!
@implementedBy
None
Named @implementedBy
None
None
Method invocation at DIC
None
Same rules
None
None
And if you don‘t like annotations... ... or want to
integrate 3rd party code
None
None
None
None
DEMO
None
https://github.com/symfony/DependencyInjection
None
None
None
https://github.com/bashofmann/dic_demo/
DEMO
None
https://github.com/zendframework/zf2
None
None
Automatic creation of dependencies through Typehints
DEMO
AOP
http://flow3.typo3.org/documentation/guide/partiii/ aspectorientedprogramming.html
class Forum { /** * @FLOW3\Inject
* @var ApplicationLoggerInterface */ protected $applicationLogger; /** * @param Post $post * @return void */ public function deletePost(Post $post) { $this-‐>applicationLogger-‐>log('Removing post'); $this-‐>posts-‐>remove($post); } }
class Forum { /** * Delete a
forum post * * @param Post $post * @return void */ public function deletePost(Post $post) { $this-‐>posts-‐>remove($post); } }
/** * @FLOW3\Aspect */ class LoggingAspect { /**
* @FLOW3\Inject * @var ApplicationLoggerInterface */ protected $applicationLogger; /** * @FLOW3\Before("method(Forum-‐>deletePost())") */ public function logDeletePost(\TYPO3\FLOW3\AOP \JoinPointInterface $joinPoint) { $post = $joinPoint-‐>getMethodArgument('post'); $this-‐>applicationLogger-‐>log('Removing post); } }
rg\injektor inspired by google-guice
None
h"p://twi"er.com/Bas2anHofmann h"p://profiles.google.com/bashofmann h"p://lanyrd.com/people/Bas2anHofmann h"p://speakerdeck.com/u/bas2anhofmann h"ps://github.com/bashofmann
[email protected]
Did you like this
talk? http://bit.ly/oscon2012_di_php