/**
  * @covers DependencyInjection::getInstance
  * @todo   Implement testGetInstance().
  */
 public function testGetInstance()
 {
     $this->assertTrue($this->object->getInstance(A::class) instanceof A);
     $this->object->setModule(I::class, B::class);
     $this->assertTrue($this->object->getInstance(I::class) instanceof B);
     $this->object->setModule(B::class, C::class);
     $this->assertTrue($this->object->getInstance(B::class) instanceof C);
     try {
         $this->object->getInstance('InexistantClassName');
         $this->fail('Expected DependencyInjection_Exception');
     } catch (DependencyInjection_Exception $ex) {
     }
     $p = $this->object->getInstance(P::class);
     $this->assertSame($p, $this->object->getInstance(P::class));
     try {
         $this->object->getInstance(NI::class);
         $this->fail('Expected DependencyInjection_Exception');
     } catch (DependencyInjection_Exception $ex) {
     }
     $ni = new NI();
     $this->object->setInstance($ni);
     $this->assertSame($ni, $this->object->getInstance(NI::class));
     $inject = $this->object->getInstance(Inject::class);
     $this->assertTrue($inject->i instanceof I);
     $this->assertTrue($inject->a instanceof A);
     $withoutFactory = $this->object->getInstance(WithoutCustomFactory::class);
     $this->assertSame(0, $withoutFactory->a);
     $this->assertSame(1, $withoutFactory->b);
     $withFactory = $this->object->getInstance(WithCustomFactory::class);
     $this->assertSame(5, $withFactory->a);
     $this->assertSame(3, $withFactory->b);
     $this->object->setModule(MyAbstractFactory::class, InvalidInterfaceFactory::class);
     try {
         $this->object->getInstance(WithAbstractFactory::class);
         $this->fail('Expected DependencyInjection_Exception');
     } catch (DependencyInjection_Exception $ex) {
     }
     $this->object->setModule(MyAbstractFactory::class, InvalidImplFactory::class);
     try {
         $this->object->getInstance(WithAbstractFactory::class);
         $this->fail('Expected DependencyInjection_Exception');
     } catch (DependencyInjection_Exception $ex) {
     }
     $this->object->setModule(MyAbstractFactory::class, ValidFactory::class);
     $withAbstract = $this->object->getInstance(WithAbstractFactory::class);
     $this->assertTrue($withAbstract->a instanceof A);
     $this->assertSame(9, $withAbstract->value);
     $this->object->setModule(MyAbstractFactory::class, ValidFactory2::class);
     $withAbstract = $this->object->getInstance(WithAbstractFactory::class);
     $this->assertTrue($withAbstract->a instanceof A);
     $this->assertSame(9 * 2, $withAbstract->value);
 }
class Config
{
    private $data;
    public function __construct()
    {
        $this->data = ['dsn' => 'mysql:host=127.0.0.1;dbname=test', 'username' => 'test', 'password' => ''];
    }
    public function __get($name)
    {
        return $this->data[$name];
    }
}
//Crée l'injecteur
$injector = new DependencyInjection();
//Définie Database en tant que implémentation de PDO
$injector->setModule(PDO::class, Database::class);
//Seule une instance unique de PDO (ou Database) sera gardé en mémoire en utilisant l'injecteur
$tickets = $injector->getInstance(PDO::class)->query('SELECT * FROM TICKET')->fetchAll();
?>
<!DOCTYPE html>
<html>
    <head>
        <title>Mon blog</title>
    </head>
    <body>
        <h1>Mon blog</h1>
        <?php 
foreach ($tickets as $ticket) {
    ?>
        <article>
            <h2><?php