assad2008/dump-r

一个更简洁、更轻量级的 print_r() 和 var_dump() 的混合体

1.0 2024-05-22 03:38 UTC

This package is auto-updated.

Last update: 2024-09-22 04:17:47 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
});

过滤、标记 & 递归控制

使用上面介绍的相同 Type 钩子可以修改渲染器和迭代器的其他方面。

根据节点属性或层次结构中的路径跳过特定的节点

// 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;
});

通过类标签节点

// 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;
});