TigerZF
🌐Español

Capítulo 20. Zend_CodeGenerator

20.1. Introducción

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.

20.1.1. Teoría de funcionamiento

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!';
    }

}