class Container { protected $s=array(); function __set($k, $c) { $this->s[$k]=$c; } function __get($k) { return $this->s[$k]($this); } }
Twittee is the smallest, and still useful, Dependency Injection Container in PHP; it is also probably one of the first public software to use the newest anonymous functions support of PHP 5.3.
Packed in less than 140 characters, it fits in a tweet.
Despite its size, Twittee is a full-featured Dependency Injection Container with support for object definitions, object injection and parameters.
Published in 2009 by Fabien Potencier, Twittee is in the Public Domain. Tweet me if you find a bug!
Like all the kool kids, Twittee is of course available on Github.
You can also simply copy the PHP code above and save it in a twittee.php
file somewhere on your disk.
Finding a simple example to demonstrate a Dependency Injection Container is not an easy task. Instead of showing a classic "Hello World!" example, which would have been too simple to demonstrate the power of Twittee, I have converted the example I used to introduce the Symfony 2 Dependency Injection Container on my blog.
The following example shows how to create a Zend_Mail
object that sends its emails using a Gmail account:
$c = new Container(); // parameters $c->mailer_class = function () { return 'Zend_Mail'; }; $c->mailer_username = function () { return 'fabien'; }; $c->mailer_password = function () { return 'myPass'; }; // objects / services $c->mailer_transport = function ($c) { return new Zend_Mail_Transport_Smtp( 'smtp.gmail.com', array( 'auth' => 'login', 'username' => $c->mailer_username, 'password' => $c->mailer_password, 'ssl' => 'ssl', 'port' => 465, ) ); }; $c->mailer = function ($c) { $obj = new $c->mailer_class(); $obj->setDefaultTransport($c->mailer_transport); return $obj; }; // get the mailer $mailer = $c->mailer;
Some explanations about the code are in order:
If you like Twittee, you will also probably like Twitto, the Web Framework that fits in a tweet!