Anizoptera CMF PHP Code Generation (volcado, serialización) componente.
https://github.com/anizoptera/azaphpgen
Permite volcar matrices, objetos, cierres y tipos de datos básicos como código PHP. En parte, esto puede llamarse algún tipo de serialización. Y puede personalizar su código PHP arrojado como desee.
Es muy útil para la compilación de códigos (generalmente para el almacenamiento en caché).
Características:
Beneficios sobre var_export() ::
var_export no admite el vertido de cierres;var_export admite solo objetos con la función __set_state . AzaphpGen admite todos los objetos serializables;iterator_to_array );var_export genera un código muy feo que es incómodo de usar y puede ser fácilmente dañado;var_export genera código que no se puede evaluar en el espacio de nombres;IPhpGenerable ;var_export nunca lo genera :)La forma recomendada de instalar AzaphpGen es a través del compositor. Puede ver información del paquete en Packagist.
{
"require" : {
"aza/phpgen" : " ~1.0 "
}
}Puede usar ejemplos/ejemplo.php para ejecutar todos los ejemplos.
// Get singleton instance of PhpGen (fast and simple variant)
$ phpGen = PhpGen:: instance ();
// Integer
echo $ phpGen -> getCode ( 123456789 ) . PHP_EOL ; // 123456789;
// String (binary strings are supported as well)
echo $ phpGen -> getCode ( ' some string ' . ' example ' ) . PHP_EOL ; // "some string example";
// Float without trailing semicolon
echo $ phpGen -> getCodeNoTail ( 12.345 ) . PHP_EOL ; // 12.345
// Simple serializable objects
$ var = new stdClass ();
echo $ phpGen -> getCode ( $ var ) . PHP_EOL ; // unserialize("O:8:"stdClass":0:{}");
// Another object example
$ var = new DateTime ( ' 2013-02-23 00:49:36 ' , new DateTimeZone ( ' UTC ' ));
echo $ phpGen -> getCode ( $ var ) . PHP_EOL ; // unserialize("O:8:"DateTime":3:{s:4:"date";s:19:"2013-02-23 00:49:36";s:13:"timezone_type";i:3;s:8:"timezone";s:3:"UTC";}"); // AzaPhpGen will use short array syntax if possible by default (PHP >= 5.4)
echo $ phpGen -> getCode ( array (
true , false , null
)) . PHP_EOL ;
/*
[
true,
false,
null,
];
*/
// Build code without formatting
echo $ phpGen -> getCodeNoFormat ( array (
true , false , null
)) . PHP_EOL ;
/*
[true,false,null];
*/
// Complex array (some sort of config for example)
$ array = array (
' key1 ' => ' value ' ,
' long_key ' => ' value ' ,
' array ' => array (
' short_value '
),
' array2 ' => array (
' very very very very very very very very very very very very long value '
),
' other ' ,
123456789
);
echo $ phpGen -> getCode ( $ array ) . PHP_EOL ;
/*
[
"key1" => "value",
"long_key" => "value",
"array" => ["short_value"],
"array2" => [
"very very very very very very very very very very very very long value",
],
0 => "other",
1 => 123456789,
];
*/
// And wothout formatting
echo $ phpGen -> getCodeNoFormat ( $ array ) . PHP_EOL ;
/*
["key1"=>"value","long_key"=>"value","array"=>["short_value"],"array2"=>["very very very very very very very very very very very very long value"],0=>"other",1=>123456789];
*/ AzaphpGen trata a todos los objetos transitables como matrices (con iterator_to_array).
$ var = new SplFixedArray ( 3 );
$ var [ 0 ] = ' a ' ;
$ var [ 1 ] = ' b ' ;
echo $ phpGen -> getCodeNoFormat ( $ var ) . PHP_EOL ; // ["a","b",null]; ADVERTENCIA: los cierres se arrojan tal como están. Por lo tanto, los cierres complejos no son compatibles:
$this uso variable; $ closure = function ( $ a , $ b ) {
return round ( $ a , $ b ) . " example tn" ;
};
echo $ phpGen -> getCode ( $ closure ) . PHP_EOL ;
/*
function($a, $b) {
return round($a, $b) . "exampletn";
};
*/
echo $ phpGen -> getCode ( array ( ' key ' => $ closure )) . PHP_EOL ;
/*
[
"key" => function($a, $b) {
return round($a, $b) . "exampletn";
},
];
*/ Puede personalizar el vertido de sus clases implementando la interfaz IPhpGenerable .
class ExampleCustomCode implements IPhpGenerable
{
public function generateCode ()
{
return ' 32434 + 5678 ' ;
}
}
$ var = new ExampleCustomCode ();
echo $ phpGen -> getCode ( $ var ) . PHP_EOL ; // 32434 + 5678;
echo $ phpGen -> getCode ( array ( $ var )) . PHP_EOL ; // [32434 + 5678]; Para la varIt más simple de los usos de interfaz IPhpGenerable , puede usar la clase Bundled - CustomCode . Solo toma el código requerido como argumento de constructor.
$ var = new CustomCode ( ' "some code" . PHP_EOL ' );
echo $ phpGen -> getCode ( $ var ) . PHP_EOL ; // "some code" . PHP_EOL;
echo $ phpGen -> getCode ( array ( $ var )) . PHP_EOL ; // ["some code" . PHP_EOL]; Segunda varint de personalización del código resultante: uso de manejadores definidos (ganchos) para las clases. ¡De esta manera puede personalizar el volcado de cualquier clase posible!
// Set custom handler for DateTime type
$ phpGen -> addCustomHandler ( ' DateTime ' , function ( $ data ) use ( $ phpGen ) {
/** @var $data DateTime */
return $ phpGen -> getCodeNoTail (
$ data -> format ( " Y-m-dO " )
);
});
// Build code
$ var = new DateTime ( ' 2013-02-23 00:49:36 ' , new DateTimeZone ( ' UTC ' ));
echo $ phpGen -> getCode ( $ var ) . PHP_EOL ; // "2013-02-23+0000"; Azaphpgen tiene muchas opciones. Por lo tanto, es muy simple configurar su código resultante para sus necesidades especiales (estilo de código, por ejemplo). Puede ver todas las opciones disponibles en el código de clase PHPGEN.
// Disable short array syntax and use 6 spaces for indentation
$ phpGen -> shortArraySyntax = false ;
$ phpGen -> useSpaces = true ;
$ phpGen -> tabLength = 6 ;
$ var = array ( array ( array ( 23 => ' example ' )));
echo $ phpGen -> getCode ( $ var ) . PHP_EOL ;
/*
array(
array(
array(
23 => "example",
),
),
);
*/ Las pruebas están en la carpeta Tests y alcanzan el 100% de cobertura de código. Para ejecutarlos, necesitas phpunit. Ejemplo:
$ phpunit --configuration phpunit.xml.dist
O con informe de cobertura:
$ phpunit --configuration phpunit.xml.dist --coverage-html code_coverage/
AzaphpGen es parte de Anizoptera CMF, escrito por Amal Samally (Amal.samally en Gmail.com) y el equipo de AzoGroup.
Liberado bajo la licencia MIT.