aza / phpgen
AzaPhpGen - Anizoptera CMF PHP代码生成(转储)组件。允许将复杂数组、对象、闭包和基本数据类型作为PHP代码转储。部分上,这可以称为某种序列化。您可以按照自己的意愿自定义转储的PHP代码。
Requires
- php: >=5.3.3
Suggests
- ext-reflection: Used for closure support
- ext-spl: Used for closure support
- aza/benchmark: Used in benchmark tests
This package is not auto-updated.
Last update: 2024-09-14 15:12:16 UTC
README
Anizoptera CMF PHP代码生成(转储、序列化)组件。
https://github.com/Anizoptera/AzaPhpGen
目录
简介
允许将复杂数组、对象、闭包和基本数据类型作为PHP代码转储。部分上,这可以称为某种序列化。并且您可以按照自己的意愿自定义转储的PHP代码。
对于代码编译(通常用于缓存目的)非常有用。
特性
- 支持所有标量值(bool、int、float、string)、null、数组、可序列化对象;
- 可遍历支持(转储为数组,见示例 #3);
- 闭包支持(带 "use" 的闭包,同一行上多个闭包不支持!)(见示例 #4);
- 使用 IPhpGenerable 接口 自定义对象转储(见示例 #5);
- 捆绑简单 CustomCode 类(见示例 #6);
- 使用定义的处理程序自定义对象转储(见示例 #7);
- 非常灵活的配置(9个代码构建选项,见PhpGen 类代码);
- 自动识别二进制字符串;
- 方便、完全文档化且经过测试的API;
比 var_export()
的优点
var_export
不支持闭包转储;var_export
只支持具有__set_state
函数的对象。AzaPhpGen 支持所有可序列化对象;- AzaPhpGen 将可遍历对象转储为数组(通过
iterator_to_array
); - 对于二进制字符串,
var_export
生成的代码非常丑陋,难以使用且容易损坏; - 对于对象,
var_export
生成的代码不能在命名空间中评估; - AzaPhpGen 允许您通过自定义处理程序和
IPhpGenerable
接口完全控制对象的转储; - 使用 AzaPhpGen,您可以灵活地自定义代码的格式(对数组很有用);
- AzaPhpGen 可以生成带有或不带有尾随分号的代码。
var_export
从不输出它 :) - 您可以在Tests/PhpGenBenchmarkTest.php中查看一些详细的比较;
需求
- PHP 5.3.3(或更高版本);
- SPL和Reflection扩展支持闭包(均默认捆绑在PHP中);
安装
推荐安装AzaPhpGen的方式是通过composer。您可以在Packagist上查看包信息。
{ "require": { "aza/phpgen": "~1.0" } }
示例
您可以使用examples/example.php来运行所有示例。
示例 #1 - 简单的转储
// 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\";}");
示例 #2 - 数组转储
// 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]; */
示例 #3 - 可遍历对象转储
AzaPhpGen将所有可遍历对象视为数组(使用iterator_to_array
)。
$var = new SplFixedArray(3); $var[0] = 'a'; $var[1] = 'b'; echo $phpGen->getCodeNoFormat($var) . PHP_EOL; // ["a","b",null];
示例 #4 - 闭包(匿名函数)示例
警告:闭包以原样转储。因此,不支持复杂的闭包。
- 带有"使用"语句的闭包(从父作用域继承变量的闭包);
- 同一行上的多个闭包;
- 在闭包中使用非限定类名(导入);
- 使用
$this
变量的闭包;
$closure = function($a, $b) { return round($a, $b) . "example\t\n"; }; echo $phpGen->getCode($closure) . PHP_EOL; /* function($a, $b) { return round($a, $b) . "example\t\n"; }; */ echo $phpGen->getCode(array('key' => $closure)) . PHP_EOL; /* [ "key" => function($a, $b) { return round($a, $b) . "example\t\n"; }, ]; */
示例 #5 - 使用IPhpGenerable接口进行自定义对象转储
您可以通过实现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];
示例 #6 - 使用捆绑的CustomCode类
对于IPhpGenerable
接口最简单的用法,您可以使用捆绑的类CustomCode
。它只需将所需的代码作为构造函数参数。
$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];
示例 #7 - 使用定义的处理程序进行自定义对象转储
结果代码自定义的第二种方式是使用定义的处理程序(钩子)对类进行操作。这样,您可以自定义任何可能的类的转储!
// 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";
示例 #8 - AzaPhpGen自定义
AzaPhpGen有很多选项。因此,配置您的结果代码以满足特殊需求(例如代码风格)非常简单。您可以在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", ), ), ); */
测试
测试位于Tests
文件夹,达到100%代码覆盖率。要运行它们,您需要PHPUnit。示例
$ phpunit --configuration phpunit.xml.dist
或带有覆盖率报告
$ phpunit --configuration phpunit.xml.dist --coverage-html code_coverage/
致谢
AzaPhpGen是Anizoptera CMF的一部分,由Amal Samally(amal.samally at gmail.com)和AzaGroup团队编写。
许可证
在MIT许可证下发布。
链接
- Composer包
- 在Travis CI上的最后构建
- 在Ohloh上的项目配置文件
- 在GitHub / Packagist上的其他Anizoptera CMF组件
- (RU) AzaGroup团队博客