riimu/kit-phpencoder

PHP代码生成的高可定制替代方案,类似于内置函数var_export

v2.4.2 2022-12-10 18:12 UTC

This package is auto-updated.

Last update: 2024-09-12 16:00:18 UTC


README

PHPEncoder 是一个PHP库,用于导出变量和生成变量的PHP代码表示,类似于内置函数 var_export()。然而,与内置函数相比,此库提供了更多选项来自定义输出,这使得生成不同目的的代码(如可读配置文件或优化缓存文件)更加容易。

此库的目的是解决内置 var_export() 的一些缺点。例如,无法控制输出的空白量,也无法在不同的数组表示法之间进行选择。此外,此库还提供了将对象转换为PHP代码的功能,与内置函数相比,这实际上非常有用。

此库中大量的自定义选项使您能够创建符合您目的的代码。当您需要限制输出的大小,您可以创建非常紧凑的代码;或者您可以根据需要创建适合动态生成的PHP文件的代码风格。

API文档可在以下位置找到: http://kit.riimu.net/api/phpencoder/

CI Scrutinizer codecov Packagist

要求

  • 最低支持的PHP版本是5.6

安装

使用Composer安装

使用Composer处理依赖关系是安装此库的最简单方法。要使用Composer安装此库,请按照以下两个步骤操作

  1. 通过在项目根目录中运行Composer的 命令行安装 获取 composer.phar 文件。

  2. 一旦运行了安装脚本,您应该在项目根目录中找到 composer.phar 文件,并可以运行以下命令

    php composer.phar require "riimu/kit-phpencoder:^2.3"
    

通过Composer安装此库后,您可以通过包含Composer在安装过程中生成的 vendor/autoload.php 文件来加载库。

将库作为依赖项添加

如果您已经熟悉如何使用Composer,您还可以通过向项目添加以下 composer.json 文件并将 composer install 命令添加到项目中,将库作为依赖项添加。

{
    "require": {
        "riimu/kit-phpencoder": "^2.3"
    }
}

手动安装

如果您不想使用Composer来加载库,您还可以通过下载 最新版本 并将 src 文件夹提取到您的项目中手动安装库。然后,您可以包含提供的 src/autoload.php 文件来加载库类。

使用方法

此库提供的最相关的方法是 PHPEncoder 提供的 encode() 方法。此方法接受任何值作为参数,并返回该值的PHP代码表示。

例如

<?php

require 'vendor/autoload.php';
$encoder = new \Riimu\Kit\PHPEncoder\PHPEncoder();
echo $encoder->encode(['foo' => 'bar', [1, true, false, null, 1.0]]);

这将生成以下输出

[
    'foo' => 'bar',
    [1, true, false, null, 1.0],
]

当然,此库最重要的功能是自定义生成的PHP代码。作为第二个参数,encode() 方法接受一个选项数组,可以用来自定义返回的PHP代码。例如

<?php

require 'vendor/autoload.php';
$encoder = new \Riimu\Kit\PHPEncoder\PHPEncoder();
echo $encoder->encode(['foo' => 'bar', [1, true, false, null, 1.0]], [
    'array.inline' => false,
    'array.omit' => false,
    'array.indent' => 2,
    'boolean.capitalize' => true,
    'null.capitalize' => true,
]);

这将生成以下输出

[
  'foo' => 'bar',
  0 => [
    0 => 1,
    1 => TRUE,
    2 => FALSE,
    3 => NULL,
    4 => 1.0,
  ],
]

选项

编码选项允许您自定义 encode() 方法的输出。可以通过三种不同的方式设置这些选项

  • 选项可以作为数组提供给 PHPEncoder 构造函数。
  • 可以通过 setOption() 方法设置选项值。
  • 可以将选项作为数组传递给 encode() 方法的第二个参数。

请注意,传递给 encode() 方法的选项仅是临时的,并且不会应用于后续调用。

选项列表

  • whitespace : <布尔值> (true)
    当设置为 false 时,将禁用所有额外空白字符的生成,并且忽略所有影响空白的其他设置。

  • hex.capitalize : <布尔值> (false)
    当设置为 true 时,输出中的所有十六进制字符都使用大写字母而不是小写字母。

  • null.capitalize : <布尔值> (false)
    当设置为 true 时,所有 null 值都使用大写字母而不是小写字母。

  • boolean.capitalize : <布尔值> (false)
    当设置为 true 时,所有 truefalse 值都使用大写字母而不是小写字母。

  • integer.type : <"binary"|"octal"|"decimal"|"hexadecimal"> ("decimal")
    更改整数的输出语法。例如,使用类型 "hexadecimal" 将数字 15 输出为 0xf

  • float.integers : <布尔值|"all"> (false)
    当设置为 true 时,任何表示整数且值精确表示为浮点数的浮点数将被编码为整数而不是浮点数。(例如,值 2.0 将被编码为 2)。要包括无法精确表示的值,可以将选项设置为 "all"

  • float.export : <布尔值> (false)
    当设置为 true 时,使用 var_export() 编码浮点数,这会导致非整数浮点数的输出与标准实现方法略有不同。在某些情况下,这可能会产生更准确的数字,但表示可能不太整洁。

  • float.precision : <整数|false> (17)
    编码浮点值的最大精度,这通常也意味着编码浮点数的最大位数。如果将值设置为 false,则将使用 PHP ini 设置 serialize_precision。请注意,由于浮点值的工作方式,大于 17 的值不会提供任何额外的精度。

  • string.binary : <布尔值> (false)
    当设置为 true 时,任何不是有效 UTF-8 的字符串将被编码为 base 64 并用 base64_decode() 调用包裹。

  • string.escape : <布尔值> (true)
    当设置为 true 时,所有包含 32-126 ASCII 范围之外的字节的字符串都将用双引号括起来,并且范围之外的字符将被转义。

  • string.utf8 : <布尔值> (false)
    当此选项和 string.escape 都设置为 true 时,所有字符串中的有效多字节 UTF-8 字符都使用 PHP7 Unicode 代码点语法进行编码。请注意,此语法在 PHP 7.0 之前的版本中不起作用。

  • string.classes : <字符串数组> ([])
    定义一个类或类命名空间前缀的列表,这些类可以在遇到字符串时使用类解析运算符 ::class 进行编码。例如,提供值 ['Riimu\\'] 将编码所有看起来像类名的 Riimu 命名空间中的字符串,如 Riimu\Kit\PHPEncoder::class

  • string.imports : <字符串数组> ([])
    结果代码文件中使用的导入列表,允许使用较短格式编写类名。列表应是一个关联数组,其中命名空间或类是键,使用名称是值。使用空字符串表示当前命名空间。

    例如,如果结果文件将具有 namespace Riimu\Kit\PHPEncoder;use PHPUnit\Framework\TestCase;,则可以设置数组为 ['Riimu\\Kit\\PHPEncoder\\' => '', 'PHPUnit\\Framework\\TestCase' => 'TestCase']

  • array.short : <布尔值> (true)
    当设置为true时,数组使用方括号[]括起来,而不是使用长数组表示法array()

  • array.base : <整数|string> (0)
    数组的基本缩进,以空格数或字符串形式表示。当需要将代码输出到具有特定缩进级别的文件时,提供了便利。

  • array.indent : <整数|string> (4)
    单个缩进级别的缩进量,以空格数或字符串形式表示。

  • array.align : <布尔值> (false)
    当设置为true时,数组赋值运算符=>将使用空格对齐到同一列。即使启用,array.omitarray.inline选项仍然受到尊重,但只有当特定数组的所有键都可以省略时。

  • array.inline : <布尔值|整数> (70)
    当设置为true时,任何可以不带任何数组键编写的数组都将写成一行。如果提供了整数,则只有在该数组不超出该字符数时,数组才会写成一行。当array.omit设置为false时,此选项不起作用。

  • array.omit : <布尔值> (true)
    当设置为true时,任何冗余的数组键将不会包含(例如,数组[0 => 'a', 1 => 'b']将仅编码为['a', 'b'])。

  • array.eol : <字符串|false> (false)
    数组输出使用的换行符。当设置为false时,将使用默认的PHP_EOL

  • object.method : <布尔值> (true)
    当设置为true时,任何编码的对象都将检查是否有toPHP()toPHPValue()方法。如果存在toPHP()方法,则返回的字符串将用作对象的PHP代码表示。如果存在toPHPValue()方法,则返回的值将被编码为PHP,并用作对象的代码表示。

  • object.format : <字符串> ('vars')
    默认对象编码格式。可能的值包括

    • string将对象转换为字符串,然后将其编码为PHP。
    • serialize序列化对象,并用unserialize()包裹。
    • export模拟var_export()对象表示。
    • array将对象转换为数组并编码该数组。
    • vars使用get_object_vars()将对象转换为数组。
    • iterate通过foreach迭代将对象转换为数组。
  • object.cast : <布尔值> (true)
    当使用对象编码格式varsarrayiterate时,是否在从对象生成的数组前面添加(object)类型转换。

  • recursion.detect : <布尔值> (true)
    当设置为true时,编码器将尝试检测数组和对象中的循环引用,以避免无限循环。

  • recursion.ignore : <布尔值> (false)
    当设置为true时,任何循环引用将被null替换,而不是抛出异常。

  • recursion.max : <整数|false> (false)
    编码数组和对象时的最大层数。当超出最大值时,将抛出异常。设置为false以无限制。

致谢

本库版权所有(c)2013-2022 Riikka Kalliomäki。

请参阅LICENSE以获取许可和复制信息。