Skip to content

Instantly share code, notes, and snippets.

@Anahkiasen
Created August 2, 2013 01:24
Show Gist options
  • Save Anahkiasen/6136831 to your computer and use it in GitHub Desktop.
Save Anahkiasen/6136831 to your computer and use it in GitHub Desktop.
<?php
// Si on passe les dépendances manuellement
class HTML
{
function __construct(URL $url)
{
$this->url = $url;
}
public function link($to, $text)
{
$link = $this->url->to($to);
return sprintf('<a href="%s">%s</a>', $link, $text);
}
}
// On créer nos classes, on passe URL à HTML
$url = new URL;
$html = new HTML($url)
// Jusqu'ici tout va bien
// Le code dessous retourne <a href="http://localhost.com/admin">Administration</a>
$html->link('admin', 'Administration')
// Maintenant on a crée notre classe d'URL
class MaSuperUrl
{
public function to($link)
{
return 'http://jaimelafrite.com/'.$link;
}
}
// Si je veux que HTML utilise ma classe, bah je peux pas.
// On a déjà passé URL à HTML, elle l'utilise déjà, c'est mort
//////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////
// Avec un container
class HTML
{
public function __construct(Container $app)
{
$this->container = $app;
}
public function link($to, $text)
{
$link = $this->container['url']->to($to);
return sprintf('<a href="%s">%s</a>', $link, $text);
}
}
$app = new Container;
$app['url'] = new URL;
$app['html'] = new HTML($app);
$app['html']->link('admin', 'Administration')
// Retourne toujours <a href="http://localhost.com/admin">Administration</a>
// Jusqu'ici tout va bien
// Mais maintenant on peut échanger les dépendances à la volée
$app['url'] = new MaSuperUrl;
$app['html']->link('admin', 'Administration');
// Retourne <a href="http://jaimelafrite.com/admin">Administration</a>
// Parce que quand HTML a eu besoin de URL il a été la chercher dans le container
// Et comme il n'y a _qu'un seul_ container, partout tout le temps
// Quand on a échangé la classe d'URL par MaSuperURL, ça c'est aussi répercuté
// à l'intérieur de HTML
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment