Oui oui, c'est largement possible mais c'est pas ce qu'il y a de plus beau. Préférez utiliser le pattern Factory qui lui sera beaucoup plus propre et testable que des inner classes.
Mais parfois, créer une inner class peut rendre service justement pour tester une methode typée sans forcément passer par des frameworks de test.

Dans cet article, je vais vous montrer comment on peut facilement créer une inner class en utilisant la structure de langage eval(). Certes je ne suis pas fan de cette structure de langage et l'utilise jamais car elle est source de pas mal de fails mais elle est parfois utile si utilisée à bon escient.
Après tout, ça n'est qu'une question d'habitude...

Mise en oeuvre

Voici donc comment créer une inner class. Je travail avec PHP 5.3.2 mais cela n'a pas beaucoup d'importance, juste ayez une version >= 5.1 pour avoir le typage des méthodes.

<?php
// inner_class.php
// Class declaration
class Foo
{
    // Here is the type hinting method which accepts only Bar objects
    public function typeHintingMethod(Bar $instance)
    {
        return $instance->bar();
    }
 
    // This method will create a Bar substitution object
    public function mockBar($string)
    {
        $string = addslashes($string);
        $source = <<< CLASS
class Bar
{
    public function bar()
    {
        return '$string';
    }
}
CLASS;
        eval($source);
        return new Bar();
    }
}
 
// Test
$foo = new Foo;
$bar = $foo->mockBar('I give a foobar!');
var_dump($foo->typeHintingMethod($bar));
?>

Résultat obtenu :

string 'I give a foobar!' (length=16)

Bon, ça n'a rien de fantastique mais c'est toujours bon à savoir... Donc oui, on peut faire des inner classes en PHP au moyen de ce petit hack.


Joris Berthelot