# Introduction

Zend_CodeGenerator est un outils permettant de générer du code PHP en utilisant une interface orientée objet. Il peut générer ou mettre à jour du code. Il est aussi possible d'étendre ces classes afin de changer le langage de référence pour générer du Javascript, des hôtes virtuels Apache ..., par exemple.

## Théorie

Dans la plupart des cas, vous créerez une instance du générateur de code, et vous le configurez. Pour afficher le code généré, un simple echo suffira, ou l'appel à sa méthode generate().

    // Passage de configuration au constructor:
    $file = new Zend_CodeGenerator_Php_File(array(
        'classes' => array(
            new Zend_CodeGenerator_Php_Class(array(
                'name'    => 'World',
                'methods' => array(
                    new Zend_CodeGenerator_Php_Method(array(
                        'name' => 'hello',
                        'body' => 'echo \'Hello world!\';',
                    )),
                ),
            )),
        )
    ));

    // Configuration après instanciation
    $method = new Zend_CodeGenerator_Php_Method();
    $method->setName('hello')
           ->setBody('echo \'Hello world!\';');

    $class = new Zend_CodeGenerator_Php_Class();
    $class->setName('World')
          ->setMethod($method);

    $file = new Zend_CodeGenerator_Php_File();
    $file->setClass($class);

    // Rendu du fichier généré:
    echo $file;

    // 2criture du fichier généré:
    file_put_contents('World.php', $file->generate());

Les 2 exemples ci-dessus vont rendre le même résultat :

    <?php

    class World
    {

        public function hello()
        {
            echo 'Hello world!';
        }

    }

Il est aussi possible de mettre à jour un code existant, par exemple, ajouter une méthode à une classe. Dans ce cas, vous devez inspecter le code existant en utilisant la réflexion, puis ajouter une nouvelle méthode. Zend_CodeGenerator rend ceci très simple en utilisant Zend_Reflection.

Par exemple, imaginons que nous avons sauvegardé le code de l'exemple ci-dessus dans un fichier "`World.php`" que nous avons alors inclus. Nous pourrions dès lors agir comme suit :

    $class = Zend_CodeGenerator_Php_Class::fromReflection(
        new Zend_Reflection_Class('World')
    );

    $method = new Zend_CodeGenerator_Php_Method();
    $method->setName('mrMcFeeley')
           ->setBody('echo \'Hello, Mr. McFeeley!\';');
    $class->setMethod($method);

    $file = new Zend_CodeGenerator_Php_File();
    $file->setClass($class);

    // Rendu du code généré
    echo $file;

    // Ou encore sauvegarde par dessus l'ancien fichier
    file_put_contents('World.php', $file->generate());

La nouvelle classe ressemblera à ça :

    <?php

    class World
    {

        public function hello()
        {
            echo 'Hello world!';
        }

        public function mrMcFeeley()
        {
            echo 'Hellow Mr. McFeeley!';
        }

    }