# Ejemplos de Zend_CodeGenerator

## Generando clases PHP

El siguiente ejemplo genera una clase vacía con una clase de nivel DocBlock.

    $foo      = new Zend_CodeGenerator_Php_Class();
    $docblock = new Zend_CodeGenerator_Php_Docblock(array(
        'shortDescription' => 'Sample generated class',
        'longDescription'  => 'This is a class generated with Zend_CodeGenerator.',
        'tags'             => array(
            array(
                'name'        => 'version',
                'description' => '$Rev:$',
            ),
            array(
                'name'        => 'license',
                'description' => 'New BSD',
            ),
        ),
    ));
    $foo->setName('Foo')
        ->setDocblock($docblock);
    echo $foo->generate();

El código anterior resultará en lo siguiente:

    /**
     * Sample generated class
     *
     * This is a class generated with Zend_CodeGenerator.
     *
     * @version $Rev:$
     * @license New BSD
     *
     */
    class Foo
    {

    }

## Generando clases PHP con propiedades de clase

Basándonos en el ejemplo anterior, ahora agreguemos propiedades a nuestra clase generada.

    $foo      = new Zend_CodeGenerator_Php_Class();
    $docblock = new Zend_CodeGenerator_Php_Docblock(array(
        'shortDescription' => 'Sample generated class',
        'longDescription'  => 'This is a class generated with Zend_CodeGenerator.',
        'tags'             => array(
            array(
                'name'        => 'version',
                'description' => '$Rev:$',
            ),
            array(
                'name'        => 'license',
                'description' => 'New BSD',
            ),
        ),
    ));
    $foo->setName('Foo')
        ->setDocblock($docblock)
        ->setProperties(array(
            array(
                'name'         => '_bar',
                'visibility'   => 'protected',
                'defaultValue' => 'baz',
            ),
            array(
                'name'         => 'baz',
                'visibility'   => 'public',
                'defaultValue' => 'bat',
            ),
            array(
                'name'         => 'bat',
                'const'        => true,
                'defaultValue' => 'foobarbazbat',
            ),
        ));
    echo $foo->generate();

Lo anterior resulta en la siguiente definición de clase:

    /**
     * Sample generated class
     *
     * This is a class generated with Zend_CodeGenerator.
     *
     * @version $Rev:$
     * @license New BSD
     *
     */
    class Foo
    {

        protected $_bar = 'baz';

        public $baz = 'bat';

        const bat = 'foobarbazbat';

    }

## Generando clases PHP con métodos de clase

`Zend_CodeGenerator_Php_Class` le permite adjuntar métodos con contenido opcional a sus clases. Los métodos pueden adjuntarse tanto como arrys o como instancias concretas de `Zend_CodeGenerator_Php_Method`.

    $foo      = new Zend_CodeGenerator_Php_Class();
    $docblock = new Zend_CodeGenerator_Php_Docblock(array(
        'shortDescription' => 'Sample generated class',
        'longDescription'  => 'This is a class generated with Zend_CodeGenerator.',
        'tags'             => array(
            array(
                'name'        => 'version',
                'description' => '$Rev:$',
            ),
            array(
                'name'        => 'license',
                'description' => 'New BSD',
            ),
        ),
    ));
    $foo->setName('Foo')
        ->setDocblock($docblock)
        ->setProperties(array(
            array(
                'name'         => '_bar',
                'visibility'   => 'protected',
                'defaultValue' => 'baz',
            ),
            array(
                'name'         => 'baz',
                'visibility'   => 'public',
                'defaultValue' => 'bat',
            ),
            array(
                'name'         => 'bat',
                'const'        => true,
                'defaultValue' => 'foobarbazbat',
            ),
        ))
        ->setMethods(array(
            // Método pasado como array
            array(
                'name'       => 'setBar',
                'parameters' => array(
                    array('name' => 'bar'),
                ),
                'body'       => '$this->_bar = $bar;' . "\n" . 'return $this;',
                'docblock'   => new Zend_CodeGenerator_Php_Docblock(array(
                    'shortDescription' => 'Set the bar property',
                    'tags'             => array(
                        new Zend_CodeGenerator_Php_Docblock_Tag_Param(array(
                            'paramName' => 'bar',
                            'datatype'  => 'string'
                        )),
                        new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
                            'datatype'  => 'string',
                        )),
                    ),
                )),
            ),
            // Método pasado como instancia concreta
            new Zend_CodeGenerator_Php_Method(array(
                'name' => 'getBar',
                'body'       => 'return $this->_bar;',
                'docblock'   => new Zend_CodeGenerator_Php_Docblock(array(
                    'shortDescription' => 'Retrieve the bar property',
                    'tags'             => array(
                        new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
                            'datatype'  => 'string|null',
                        )),
                    ),
                )),
            )),
        ));

    echo $foo->generate();

Lo anterior genera la siguiente salida:

    /**
     * Sample generated class
     *
     * This is a class generated with Zend_CodeGenerator.
     *
     * @version $Rev:$
     * @license New BSD
     */
    class Foo
    {

        protected $_bar = 'baz';

        public $baz = 'bat';

        const bat = 'foobarbazbat';

        /**
         * Set the bar property
         *
         * @param string bar
         * @return string
         */
        public function setBar($bar)
        {
            $this->_bar = $bar;
            return $this;
        }

        /**
         * Retrieve the bar property
         *
         * @return string|null
         */
        public function getBar()
        {
            return $this->_bar;
        }

    }

## Generando archivos PHP

`Zend_CodeGenerator_Php_File` puede ser utilizada para generar el contenido de un archivo PHP. Usted puede incluir clases, así como el contenido arbitrario del cuerpo. Cuando acople clases, debe adjuntar instancias concretas de `Zend_CodeGenerator_Php_Class` o un array definiendo la clase.

En el ejemplo siguiente, asumiremos que ha definido `$foo` como una de las definiciones de clase del ejemplo anterior.

    $file = new Zend_CodeGenerator_Php_File(array(
        'classes'  => array($foo);
        'docblock' => new Zend_CodeGenerator_Php_Docblock(array(
            'shortDescription' => 'Foo class file',
            'tags'             => array(
                array(
                    'name'        => 'license',
                    'description' => 'New BSD',
                ),
            ),
        )),
        'body'     => 'define(\'APPLICATION_ENV\', \'testing\');',
    ));

Llamando a `generate()` generará el código -- pero no lo grabará en un archivo. Usted mismo deberá capturar y grabar los contenidos en un archivo. Por ejemplo:

    $code = $file->generate();
    file_put_contents('Foo.php', $code);

Lo anterior generará el siguiente archivo:

    <?php
    /**
     * Foo class file
     *
     * @license New BSD
     */

    /**
     * Sample generated class
     *
     * This is a class generated with Zend_CodeGenerator.
     *
     * @version $Rev:$
     * @license New BSD
     */
    class Foo
    {

        protected $_bar = 'baz';

        public $baz = 'bat';

        const bat = 'foobarbazbat';

        /**
         * Set the bar property
         *
         * @param string bar
         * @return string
         */
        public function setBar($bar)
        {
            $this->_bar = $bar;
            return $this;
        }

        /**
         * Retrieve the bar property
         *
         * @return string|null
         */
        public function getBar()
        {
            return $this->_bar;
        }

    }

    define('APPLICATION_ENV', 'testing');

## Sembrando la generación de código para un archivo PHP via reflection

## Sembrando la generación de clases PHP via reflection

## Sembrando la generación de métodos PHP via reflection