Tabla de contenidos
- 20.1. Introducción
- 20.2. Ejemplos de Zend_CodeGenerator
- 20.3. Referencia de Zend_CodeGenerator
- 20.3.1. Clases abstractas e interfaces
- 20.3.2. Clases concretas de CodeGenerator
- 20.3.2.1. Zend_CodeGenerator_Php_Body
- 20.3.2.2. Zend_CodeGenerator_Php_Class
- 20.3.2.3. Zend_CodeGenerator_Php_Docblock
- 20.3.2.4. Zend_CodeGenerator_Php_Docblock_Tag
- 20.3.2.5. Zend_CodeGenerator_Php_DocBlock_Tag_Param
- 20.3.2.6. Zend_CodeGenerator_Php_DocBlock_Tag_Return
- 20.3.2.7. Zend_CodeGenerator_Php_File
- 20.3.2.8. Zend_CodeGenerator_Php_Member_Container
- 20.3.2.9. Zend_CodeGenerator_Php_Method
- 20.3.2.10. Zend_CodeGenerator_Php_Parameter
- 20.3.2.11. Zend_CodeGenerator_Php_Property
Zend_CodeGenerator ofrece funciones para generar
código arbitrario mediante una interfaz orientada a objetos, tanto para crear
código nuevo como para actualizar código existente. Aunque la
implementación actual está limitada a generar código PHP, se puede extender fácilmente
la clase base para ofrecer generación de código para otras tareas:
JavaScript, archivos de configuración, vhosts de apache, etc.
En el caso de uso más habitual, simplemente se instancia una clase
generadora de código y se le pasa la configuración apropiada, o
se configura después de la instanciación. Para generar el código, basta
con hacer un echo del objeto o llamar a su método generate().
// Passing configuration to the 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!\';',
)),
),
)),
)
));
// Configuring after instantiation
$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);
// Render the generated file
echo $file;
// or write it to a file:
file_put_contents('World.php', $file->generate());
Ambos ejemplos anteriores generarán el mismo resultado:
<?php
class World
{
public function hello()
{
echo 'Hello world!';
}
}
Otro caso de uso habitual es actualizar código existente, por ejemplo,
para añadir un método a una clase. En tal caso, primero hay que inspeccionar
el código existente utilizando reflexión, y luego añadir el nuevo método.
Zend_CodeGenerator hace que esto sea extremadamente sencillo,
aprovechando Zend_Reflection.
Como ejemplo, supongamos que hemos guardado lo anterior en el archivo
"World.php", y que ya lo hemos incluido. Podríamos entonces hacer lo
siguiente:
$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);
// Render the generated file
echo $file;
// Or, better yet, write it back to the original file:
file_put_contents('World.php', $file->generate());
El archivo de clase resultante ahora se verá así:
<?php
class World
{
public function hello()
{
echo 'Hello world!';
}
public function mrMcFeeley()
{
echo 'Hellow Mr. McFeeley!';
}
}