leeoniya/dump-r

更简洁、更精简的 print_r() 和 var_dump() 的混合

2.1 2015-09-04 22:05 UTC

This package is not auto-updated.

Last update: 2024-09-28 12:26:05 UTC


README

更简洁、更精简的 print_r()var_dump() 混合(MIT 许可证)

screenshot

演示: 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 设置自动展开的子节点深度

还有两个修饰键可以用来控制节点展开/折叠的工作方式

  1. 按住 Shift 同时切换将展开/折叠节点的完整深度。
  2. 按住 Ctrl 同时切换也将展开/折叠该节点之后的所有兄弟节点。如果你有一个对象/数组的数组,并且想通过仅单击组中的第一个来同时将它们展开到同一级别,这很有用。它非常适合深度复杂对象。
  3. ShiftCtrl 可以一起使用。

双击二进制字符串将在混合的十六进制/ASCII 和仅十六进制表示之间切换。

binary_toggle

某些类型的字符串可以美化打印,并且可以调整额外的渲染选项(以默认值显示)

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 基类型进行子类型化。首先是显示 jpegtiff 图像路径的 EXIF 数据,然后显示 CSV 文件路径的行数据。

这个数组

$stuff = [
	'imgs/img_1771.jpg',
	'data/people.csv',
];

通常像这样转储

coretyped

可以通过子类型化像这样转储

usertyped

要这样做,钩入正确的核心类型,并提供一个分类和处理原始值的功能,然后修改并返回一个 Type 实例。以下是您可以修改/增强的属性

  1. $type->types - 您选择的子类型字符串数组。这些将被附加为 CSS 类,并也显示为内联。
  2. $type->nodes - 要显示的可展开子节点数组。如果不需要子节点或要保留由核心类型提取的任何子节点,则提供 null
  3. $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;
});