eloquent / depict
var_dump/var_export/print_r 的快速、递归安全且简洁的替代品。
Requires
- php: >=5.3
Requires (Dev)
This package is auto-updated.
Last update: 2023-08-08 04:17:48 UTC
README
不再维护
此包不再维护。有关更多信息,请参阅此声明。
Depict
var_dump/var_export/print_r 的快速、递归安全且简洁的替代品。
安装
- 作为 Composer 包 eloquent/depict 提供。
使用方法
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]'