Introduction

Exemples Zend_CodeGenerator

Example #1 Génération de classes PHP

L'exemple suivant génère le code d'une classe avec son bloc de commentaires PHPDoc.

  1. span style="color: #ff0000;">'shortDescription' => 'Sample generated class',
  2.     'longDescription'  => 'This is a class generated with Zend_CodeGenerator.',
  3.     'tags''name'        => 'version',
  4.             'description' => '$Rev:$''name'        => 'license',
  5.             'description' => 'New BSD',
  6.         ),
  7.     ),
  8. ));
  9. $foo->setName('Foo'

Le résultat est :

  1. /**
  2. * Sample generated class
  3. *
  4. * This is a class generated with Zend_CodeGenerator.
  5. *
  6. * @version $Rev:$
  7. * @license New BSD
  8. *
  9. */

Example #2 Générer des classes PHP avec des attributs de classe

Suivant l'exemple précédant, nous ajoutons maintenant des attributs à la classe.

  1. span style="color: #ff0000;">'shortDescription' => 'Sample generated class',
  2.     'longDescription'  => 'This is a class generated with Zend_CodeGenerator.',
  3.     'tags''name'        => 'version',
  4.             'description' => '$Rev:$''name'        => 'license',
  5.             'description' => 'New BSD',
  6.         ),
  7.     ),
  8. ));
  9. $foo->setName('Foo''name'         => '_bar',
  10.             'visibility'   => 'protected',
  11.             'defaultValue' => 'baz''name'         => 'baz',
  12.             'visibility'   => 'public',
  13.             'defaultValue' => 'bat''name'         => 'bat',
  14.             'const''defaultValue' => 'foobarbazbat'

Le résultat sera :

  1. /**
  2. * Sample generated class
  3. *
  4. * This is a class generated with Zend_CodeGenerator.
  5. *
  6. * @version $Rev:$
  7. * @license New BSD
  8. *
  9. */'baz''bat';
  10.  
  11.     const bat = 'foobarbazbat';
  12.  
  13. }

Example #3 Générer des classes PHP avec des méthodes

Zend_CodeGenerator_Php_Class vous permet d'attacher des méthodes à vos classes générées. L'attachement se fait soit par des tableaux, soit directement des objets Zend_CodeGenerator_Php_Method.

  1. span style="color: #ff0000;">'shortDescription' => 'Sample generated class',
  2.     'longDescription'  => 'This is a class generated with Zend_CodeGenerator.',
  3.     'tags''name'        => 'version',
  4.             'description' => '$Rev:$''name'        => 'license',
  5.             'description' => 'New BSD',
  6.         ),
  7.     ),
  8. ));
  9. $foo->setName('Foo''name'         => '_bar',
  10.             'visibility'   => 'protected',
  11.             'defaultValue' => 'baz''name'         => 'baz',
  12.             'visibility'   => 'public',
  13.             'defaultValue' => 'bat''name'         => 'bat',
  14.             'const''defaultValue' => 'foobarbazbat'// Method passed as array
  15. 'name'       => 'setBar',
  16.             'parameters''name' => 'bar'),
  17.             ),
  18.             'body'       => '$this->_bar = $bar;' . "\n" . 'return $this;',
  19.             'docblock''shortDescription' => 'Set the bar property',
  20.                 'tags''paramName' => 'bar',
  21.                         'datatype'  => 'string''datatype'  => 'string',
  22.                     )),
  23.                 ),
  24.             )),
  25.         ),
  26.         // Method passed as concrete instance
  27. 'name' => 'getBar',
  28.             'body'       => 'return $this->_bar;',
  29.             'docblock''shortDescription' => 'Retrieve the bar property',
  30.                 'tags''datatype'  => 'string|null'

Le résultat sera :

  1. /**
  2. * Sample generated class
  3. *
  4. * This is a class generated with Zend_CodeGenerator.
  5. *
  6. * @version $Rev:$
  7. * @license New BSD
  8. */'baz''bat';
  9.  
  10.     const bat = 'foobarbazbat';
  11.  
  12.     /**
  13.      * Set the bar property
  14.      *
  15.      * @param string bar
  16.      * @return string
  17.      *//**
  18.      * Retrieve the bar property
  19.      *
  20.      * @return string|null
  21.      */

Example #4 Générer des fichiers PHP

Zend_CodeGenerator_Php_File sert à générer le contenu de fichiers PHP. Il est possible d'insérer du code de classes, ou n'importe quel code. Si vous attachez des classes, vous pouvez les passer sous forme de tableaux ou directement d'objets Zend_CodeGenerator_Php_Class.

Dans l'exemple suivant, nous supposons que vous avez défini $foo comme étant le code d'une des classes des exemples précédents.

  1. span style="color: #ff0000;">'classes''docblock''shortDescription' => 'Foo class file',
  2.         'tags''name'        => 'license',
  3.                 'description' => 'New BSD',
  4.             ),
  5.         ),
  6.     )),
  7.     'body'     => 'define(\'APPLICATION_ENV\', \'testing\');',
  8. ));

L'appel à generate() va générer le code, mais pas l'écrire dans un fichier. Pour ce faire, il faudra d'abord capturer le contenu:

  1. span style="color: #ff0000;">'Foo.php', $code);

Le résultat sera :

  1. span style="color: #808080; font-style: italic;">/**
  2. * Foo class file
  3. *
  4. * @license New BSD
  5. */
  6.  
  7. /**
  8. * Sample generated class
  9. *
  10. * This is a class generated with Zend_CodeGenerator.
  11. *
  12. * @version $Rev:$
  13. * @license New BSD
  14. */'baz''bat';
  15.  
  16.     const bat = 'foobarbazbat';
  17.  
  18.     /**
  19.      * Set the bar property
  20.      *
  21.      * @param string bar
  22.      * @return string
  23.      *//**
  24.      * Retrieve the bar property
  25.      *
  26.      * @return string|null
  27.      */'APPLICATION_ENV', 'testing');

Example #5 Ajouter du code à un fichier PHP existant en utilisant la réflexion

Vous pouvez ajouter du code PHP à n'importe quel fichier PHP existant à condition d'utiliser la réflexion sur celui-ci afin de l'analyser. La méthode fromReflectedFileName() va vous y aider.

  1. span style="color: #ff0000;">"\n\$foo->bar();"

Example #6 Ajouter du code à une classe PHP existante en utilisant la réflexion

Vous pouvez aussi ajouter du code à une classe existante. Utilisez fromReflection() pour transformer la classe en objet Reflection. Ajoutez ensuite des méthodes, des attributs, puis régénérez le code de la classe modifiée :

  1. span style="color: #ff0000;">'name'       => 'setBaz',
  2.     'parameters''name' => 'baz'),
  3.     ),
  4.     'body'       => '$this->_baz = $baz;' . "\n" . 'return $this;',
  5.     'docblock''shortDescription' => 'Set the baz property',
  6.         'tags''paramName' => 'baz',
  7.                 'datatype'  => 'string''datatype'  => 'string',
  8.             )),
  9.         ),
  10.     )),
  11. ));
  12. $code = $generator->generate();

Introduction