IntroducciónZend_CodeGenerator ofrece facilidades para
generar código arbitrario usando una interfaz orientada a objetos, tanto
para crear código nuevo como para actualizar código existente.
Mientras que la implementación actual se limita a generar código PHP,
usted fácilmente puede extender la clase base a fin de proveer
generación de código para otras tareas como: JavaScript, archivos de
configuración, apache vhost, etc.
Teoría de Operación
En el caso de uso más típico, simplemente instanciará una clase de
generación de código y podrá pasarle tanto la configuración adecuada
o configurarla después de la instanciación. Para generar el código,
simplemente haga "echo" del objeto o llame a su método
generate().
array(
new Zend_CodeGenerator_Php_Class(array(
'name' => 'World',
'methods' => array(
new Zend_CodeGenerator_Php_Method(array(
'name' => 'hello',
'body' => 'echo \'Hello world!\';',
)),
),
)),
)
));
// Configurando después de la instanciación
$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);
// Mostrar el archivo generado
echo $file;
// o grabarlo a un archivo:
file_put_contents('World.php', $file->generate());
]]>
Ambos ejemplos anteriores mostrarán el mismo resultado:
Otro caso de uso común es actualizar el código actual -- por ejemplo,
para añadir un método a una clase. En ese caso, primero debe
inspeccionar el código actual utilizando reflexión, y entonces
añadir su nuevo método.
Zend_CodeGenerator lo hace trivialmente simple,
aprovechando Zend_Reflection.
Como ejemplo, digamos que hemos grabado lo anterior al archivo
"World.php", y que ya está incluído. Podríamos entonces hacer lo
siguiente:
setName('mrMcFeeley')
->setBody('echo \'Hello, Mr. McFeeley!\';');
$class->setMethod($method);
$file = new Zend_CodeGenerator_Php_File();
$file->setClass($class);
// Mostrar el archivo generado
echo $file;
// O mejor aún, volver a grabarlo al archivo original:
file_put_contents('World.php', $file->generate());
]]>
El archivo de la clase resultante se vería así: