leeoniya / dump-r
更简洁、更精简的 print_r() 和 var_dump() 的混合
Requires
- php: >=5.4.0
Suggests
- jdorn/sql-formatter: Pretty-print dumped SQL strings
This package is not auto-updated.
Last update: 2024-09-28 12:26:05 UTC
README
更简洁、更精简的 print_r()
和 var_dump()
混合(MIT 许可证)
演示: http://o-0.me/dump_r/
安装
Composer
https://packagist.org.cn/packages/leeoniya/dump-r
{ "require": { "leeoniya/dump-r": "dev-master" } }
需求
require 'dump_r.php';
使用 & 配置
使用 dump_r()
作为 print_r()
和 var_dump()
的直接替换。它有一些额外的参数来控制输出。函数的全签名是
function dump_r($value, $return = false, $html = true, $depth = 1e3, $expand = 1e3);
$value
是你想转储的内容$return
决定是否返回转储而不是输出到屏幕$html
控制输出是文本还是 html$depth
设置转储的递归限制$expand
设置自动展开的子节点深度
还有两个修饰键可以用来控制节点展开/折叠的工作方式
- 按住
Shift
同时切换将展开/折叠节点的完整深度。 - 按住
Ctrl
同时切换也将展开/折叠该节点之后的所有兄弟节点。如果你有一个对象/数组的数组,并且想通过仅单击组中的第一个来同时将它们展开到同一级别,这很有用。它非常适合深度复杂对象。 Shift
和Ctrl
可以一起使用。
双击二进制字符串将在混合的十六进制/ASCII 和仅十六进制表示之间切换。
某些类型的字符串可以美化打印,并且可以调整额外的渲染选项(以默认值显示)
dump_r\Rend::$xml_pretty = false; // pretty-print xml strings dump_r\Rend::$json_pretty = false; // pretty-print json strings dump_r\Rend::$sql_pretty = false; // pretty-print sql strings (requires https://github.com/jdorn/sql-formatter) dump_r\Rend::$recset_tbls = true; // recordset detection & table-style output dump_r\Rend::$trace_info = true; // show file & line where dump_r was invoked dump_r\Rend::$val_space = 4; // number of spaces between key and value columns (affects text output only, not html)
循环引用(递归)检测和重复输出分别用以下方式表示:数组用 [*]
,对象用 {*}
,闭包用 (*)
,资源用 <*>
。
您可以使用 CSS 重新设计 html 输出的所有方面,所有内容都带有类标签。
扩展
添加你自己的分类器和解析器非常简单。这里有一些说明和两个具体示例,说明如何对 String
基类型进行子类型化。首先是显示 jpeg
和 tiff
图像路径的 EXIF 数据,然后显示 CSV 文件路径的行数据。
这个数组
$stuff = [ 'imgs/img_1771.jpg', 'data/people.csv', ];
通常像这样转储
可以通过子类型化像这样转储
要这样做,钩入正确的核心类型,并提供一个分类和处理原始值的功能,然后修改并返回一个 Type
实例。以下是您可以修改/增强的属性
$type->types
- 您选择的子类型字符串数组。这些将被附加为 CSS 类,并也显示为内联。$type->nodes
- 要显示的可展开子节点数组。如果不需要子节点或要保留由核心类型提取的任何子节点,则提供null
。$type->length
- 要显示在行末的字符串,表示子节点长度。您还可以滥用此参数来显示其他类似长度的信息(下面的 EXIF 示例使用它来显示内联图像尺寸)。提供null
以保留默认长度显示。
use dump_r\Type; // Example 1: dump EXIF data with image filepath strings Type::hook('_String', function($raw, Type $type, $path) { // match path-esque strings (containing '/' or '\') trailed by an // EXIF-capable image extension, then verify this file actually exists if (preg_match('#[\/]+.+\.(jpe?g|tiff?)$#', $raw) && is_file($raw)) { $nodes = $exif = exif_read_data($raw, 0, true); $len = $exif['COMPUTED']['Width'] . 'x' . $exif['COMPUTED']['Height']; $type->types = ['image']; $type->nodes = ['EXIF' => $nodes['EXIF']]; $type->length = $len; return $type; } }); // Example 2: dump CSV records with csv filepath strings Type::hook('_String', function($raw, Type $type, $path) { if (preg_match('#[\/]+.+\.csv$#', $raw) && is_file($raw)) { $type->types = ['csv']; $type->nodes = csv2array($raw); $type->length = count($type->nodes); return $type; } }); function csv2array($file) { $csv = []; $rows = array_map('str_getcsv', file($file)); $header = array_shift($rows); foreach ($rows as $row) $csv[] = array_combine($header, $row); return $csv; }
所有核心类型(请参阅 src/dump_r/Node
目录)都可以通过它们的完全命名空间名称进行挂钩。例如,如果您想进一步子类型化 JSON 对象字符串,则可以使用
Type::hook('_String\\_JSON\\_Object', function($raw, Type $type, $path) { // code here });
过滤、标记和递归控制
使用相同的类型
钩子(如上所述)允许您修改渲染器和迭代器的其他方面。
根据节点属性或层次结构中的路径跳过特定节点
// prevent anything keyd under 'xxx' from dumping Type::hook('*', function($raw, Type $type, $path) { if (end($path) === 'xxx') return false; });
停止特定节点的递归
// prevent arrays keyed under 'c' from dumping sub-nodes Type::hook('_Array', function($raw, Type $type, $path) { if (end($path) === 'c') $type->depth = 1; return $type; });
通过类选择CSS标签节点
// tag nodes keyed under `yyy` with addl CSS classes Type::hook('*', function($raw, Type $type, $path) { if (end($path) === 'yyy') { $type->classes[] = 'marked'; } return $type; });