Zend_CodeGenerator

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().

  1. // Passage de configuration au constructor:
  2. $file = new Zend_CodeGenerator_Php_File(array(
  3.     'classes' => array(
  4.         new Zend_CodeGenerator_Php_Class(array(
  5.             'name'    => 'World',
  6.             'methods' => array(
  7.                 new Zend_CodeGenerator_Php_Method(array(
  8.                     'name' => 'hello',
  9.                     'body' => 'echo \'Hello world!\';',
  10.                 )),
  11.             ),
  12.         )),
  13.     )
  14. ));
  15.  
  16. // Configuration après instanciation
  17. $method = new Zend_CodeGenerator_Php_Method();
  18. $method->setName('hello')
  19.        ->setBody('echo \'Hello world!\';');
  20.  
  21. $class = new Zend_CodeGenerator_Php_Class();
  22. $class->setName('World')
  23.       ->setMethod($method);
  24.  
  25. $file = new Zend_CodeGenerator_Php_File();
  26. $file->setClass($class);
  27.  
  28. // Rendu du fichier généré:
  29. echo $file;
  30.  
  31. // 2criture du fichier généré:
  32. file_put_contents('World.php', $file->generate());

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

  1. <?php
  2.  
  3. class World
  4. {
  5.  
  6.     public function hello()
  7.     {
  8.         echo 'Hello world!';
  9.     }
  10.  
  11. }

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 :

  1. $class = Zend_CodeGenerator_Php_Class::fromReflection(
  2.     new Zend_Reflection_Class('World')
  3. );
  4.  
  5. $method = new Zend_CodeGenerator_Php_Method();
  6. $method->setName('mrMcFeeley')
  7.        ->setBody('echo \'Hello, Mr. McFeeley!\';');
  8. $class->setMethod($method);
  9.  
  10. $file = new Zend_CodeGenerator_Php_File();
  11. $file->setClass($class);
  12.  
  13. // Rendu du code généré
  14. echo $file;
  15.  
  16. // Ou encore sauvegarde par dessus l'ancien fichier
  17. file_put_contents('World.php', $file->generate());

La nouvelle classe ressemblera à ça :

  1. <?php
  2.  
  3. class World
  4. {
  5.  
  6.     public function hello()
  7.     {
  8.         echo 'Hello world!';
  9.     }
  10.  
  11.     public function mrMcFeeley()
  12.     {
  13.         echo 'Hellow Mr. McFeeley!';
  14.     }
  15.  
  16. }

Zend_CodeGenerator