Ejemplo 20.1. Generar clases PHP
El siguiente ejemplo genera una clase vacía con un DocBlock a nivel de clase.
$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 dará como resultado lo siguiente:
/**
* Sample generated class
*
* This is a class generated with Zend_CodeGenerator.
*
* @version $Rev:$
* @license New BSD
*
*/
class Foo
{
}
Ejemplo 20.2. Generar clases PHP con propiedades de clase
Basándonos en el ejemplo anterior, ahora añadimos 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 da como resultado 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';
}
Ejemplo 20.3. Generar 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 como arrays 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(
// Method passed as 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',
)),
),
)),
),
// Method passed as concrete instance
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;
}
}
Ejemplo 20.4. Generar archivos PHP
Zend_CodeGenerator_Php_File puede usarse para generar el
contenido de un archivo PHP. Puede incluir clases así como un contenido de cuerpo
arbitrario. Al adjuntar clases, debe adjuntar
instancias concretas de Zend_CodeGenerator_Php_Class o un
array que defina la clase.
En el ejemplo siguiente, asumiremos que ha definido
$foo según una de las definiciones de clase de un 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\');',
));
Al llamar a generate() se generará el código, pero no se
escribirá en un archivo. Deberá capturar el contenido y escribirlo
usted mismo en un archivo. Como 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');
Ejemplo 20.5. Generar código de archivo PHP a partir de reflexión
Puede añadir código PHP a un archivo PHP existente
usando el generador de código. Para hacerlo, primero necesita hacer reflexión sobre él. El
método estático fromReflectedFileName() le permite hacer
esto.
$generator = Zend_CodeGenerator_Php_File::fromReflectedFileName($path); $body = $generator->getBody(); $body .= "\n\$foo->bar();"; file_put_contents($path, $generator->generate());
Ejemplo 20.6. Generar código de clase PHP a partir de reflexión
Puede añadir código a una clase existente. Para hacerlo, use primero el
método estático fromReflection() para mapear la clase a un
objeto generador. A partir de ahí, puede añadir propiedades o
métodos adicionales, y luego regenerar la clase.
$generator = Zend_CodeGenerator_Php_Class::fromReflection(
new Zend_Reflection_Class($class)
);
$generator->setMethod(array(
'name' => 'setBaz',
'parameters' => array(
array('name' => 'baz'),
),
'body' => '$this->_baz = $baz;' . "\n" . 'return $this;',
'docblock' => new Zend_CodeGenerator_Php_Docblock(array(
'shortDescription' => 'Set the baz property',
'tags' => array(
new Zend_CodeGenerator_Php_Docblock_Tag_Param(array(
'paramName' => 'baz',
'datatype' => 'string'
)),
new Zend_CodeGenerator_Php_Docblock_Tag_Return(array(
'datatype' => 'string',
)),
),
)),
));
$code = $generator->generate();