aza/phpgen

AzaPhpGen - Anizoptera CMF PHP代码生成(转储)组件。允许将复杂数组、对象、闭包和基本数据类型作为PHP代码转储。部分上,这可以称为某种序列化。您可以按照自己的意愿自定义转储的PHP代码。

v1.1.1 2013-05-28 13:04 UTC

This package is not auto-updated.

Last update: 2024-09-14 15:12:16 UTC


README

Anizoptera CMF PHP代码生成(转储、序列化)组件。

https://github.com/Anizoptera/AzaPhpGen

Build Status

目录

  1. 简介
  2. 需求
  3. 安装
  4. 示例
  5. 测试
  6. 致谢
  7. 许可证
  8. 链接

简介

允许将复杂数组、对象、闭包和基本数据类型作为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许可证下发布。

链接