eloquent/depict

此包已被放弃,不再维护。未建议替代包。

var_dump/var_export/print_r 的快速、递归安全且简洁的替代品。

0.1.0 2017-01-10 00:23 UTC

This package is auto-updated.

Last update: 2023-08-08 04:17:48 UTC


README

不再维护

此包不再维护。有关更多信息,请参阅此声明

Depict

var_dump/var_export/print_r 的快速、递归安全且简洁的替代品。

Current version image Current build status image Current Windows build status image Tested against HHVM Current coverage status image

安装

使用方法

use Eloquent\Depict\InlineExporter;

$exporter = InlineExporter::create();
echo $exporter->export(['a', 'b', 'c', 1, 2, 3]); // outputs '#0["a", "b", "c", 1, 2, 3]'

什么是 Depict

Depict 是一个专注于性能、简洁性和递归安全性的 var_dump()/var_export()/print_r() 替代品。与许多提供类似功能的库相比,Depict 专门为命令行输出(而非 HTML)设计。

Depict 基于 Phony 所使用的 exporter,基本上是相同的代码,去除了 Phony 特定的部分。

导出器

Depict 目前仅实现了一个导出器,即 InlineExporter。未来可能会实现更多导出器。导出器实现了非常简单的 Exporter 接口。

InlineExporter

此导出器设计用于单行输出值。要创建内联导出器,使用 InlineExporter::create()

$exporter = InlineExporter::create();

InlineExporter::create() 还可以接受一个选项数组来自定义其输出

$exporter = InlineExporter::create(['depth' => 1]);

InlineExporter::create() 可用的选项

选项 描述 默认
depth 一个整数,用于确定 Depict 在截断输出之前将导出多深。负值被视为无限深度。 -1
breadth 一个整数,用于确定 Depict 在截断输出之前将导出多少个子值。负值被视为无限宽度。 -1
useShortNames true 时,Depict 将从导出的符号名称中省略命名空间信息。 true
useShortPaths true 时,Depict 将仅导出闭包路径的基本名。 false

导出格式

Depict 生成任何 PHP 值的简洁、明确、可读的表示,包括递归对象和数组

输入值 导出器输出
null 'null'
true 'true'
false 'false'
111 '111'
1.11 '1.110000e+0'
'1.11' '"1.11"'
"a\nb" '"a\nb"'
STDIN 'resource#1'
[1, 2] '#0[1, 2]'
['a' => 1, 'b' => 2] '#0["a": 1, "b": 2]
(object) ['a' => 1, 'b' => 2] '#0{a: 1, b: 2}'
new ClassA() 'ClassA#0{}'

导出标识符和引用

导出的数组和对象包含一个数字标识符,可用于识别相同值的重复出现。这表示为井号(#)后跟标识符

$value = (object) array();
// $value is exported as '#0{}'

当值出现多次时,其内部结构将只在第一次出现时描述。后续出现将由对值标识符的引用表示。这表示为符号(&)后跟标识符

$inner = [1, 2];
$value = [&$inner, &$inner];
// $value is exported as '#0[#1[1, 2], &1[]]'

$inner = (object) ['a' => 1];
$value = (object) ['b' => $inner, 'c' => $inner];
// $value is exported as '#0{b: #1{a: 1}, c: &1{}}'

导出引用类型

数组引用后跟方括号(例如 &0[]),对象引用后跟花括号(例如 &0{}

$array = [];
$object = (object) [];

$value = [&$array, &$array];
// $value is exported as '#0[#1[], &1[]]'

$value = [$object, $object];
// $value is exported as '#0[#0{}, &0{}]'

这是必要的,以便区分引用,因为数组和其他类型有时可能有相同的标识符

$value = [
    (object) [],
    [
        (object) [],
    ],
];
// $value is exported as '#0[#0{}, #1[#1{}]]'

导出引用排除

除了排除内容外,对象引用还排除类名,以简明扼要

$inner = new ClassA();
$inner->c = "d";
$value = (object) ['a' => $inner, 'b' => $inner];
// $value is exported as '#0{a: ClassA#1{c: "d"}, b: &1{}}'

导出标识符持久性

对象标识符在导出器调用之间持久,并共享一个单一的数字序列

$a = (object) [];
$b = (object) [];

$value = [$a, $b, $a];
// $value is exported as '#0[#0{}, #1{}, &0{}]'

$value = [$b, $a, $b];
// $value is exported as '#0[#1{}, #0{}, &1{}]'

但由于PHP的限制,数组标识符仅在单个导出器调用内持久

$a = [];
$b = [];

$valueA = [&$a, &$b, &$a];
$valueB = [&$b, &$a, &$b];
// both $valueA and $valueB are exported as '#0[#1[], #2[], &1[]]'

导出递归值

如果导出递归值,递归点将作为[引用]导出,就像处理相同值的多个实例一样

$value = [];
$value[] = &$value;
// $value is exported as '#0[&0[]]'

$value = (object) [];
$value->a = $value;
// $value is exported as '#0{a: &0{}}'

导出器特殊情况

对于某些类型的值,导出器将表现出特殊行为,以提高其输出的有用性,或提高常见用例的性能。

导出闭包

当导出闭包时,输出将包括文件路径和起始行号

$closure = function () {}; // file path is /path/to/example.php, line number is 123
// $closure is exported as 'Closure#0{}[/path/to/example.php:123]'

请注意,类名始终导出为Closure,即使对于使用不同闭包类名的运行时(例如HHVM)也是如此。

导出异常

当导出异常时,将从输出中删除一些PHP内部细节,包括文件路径、行号和堆栈跟踪

$exception = new Exception('a', 1, new Exception());
// $exception is exported as 'Exception#0{message: "a", code: 1, previous: Exception#1{}}'

此外,当消息为''、代码为0和/或前一个异常为null时,这些值将因简明而被排除

$exception = new RuntimeException();
// $exception is exported as 'RuntimeException#0{}'

导出深度和广度

对于复杂的嵌套结构,导出整个结构并不总是希望的。 Depict 可以设置对要导出的值的深度广度的限制。

当值超出导出深度,并且有子值时,其内容将被特殊符号替换,仅指示该值内存在多少子值

$value = [[], ['a', 'b', 'c']];
// with a depth of 1, $value is exported as '#0[#1[], #2[~3]]'

$value = [(object) [], (object) ['a', 'b', 'c']];
// with a depth of 1, $value is exported as '#0[#0{}, #1{~3}]'

当值的广度限制达到时,将使用类似的符号来指示还有多少子值未被导出

$value = ['a', 'b', 'c', 'd', 'e'];
// with a breadth of 2, $value is exported as '#0["a", "b", ~3]'