背景(介绍)
Kint是一种 PHP 调试工具,可作为 PHP 的var_dump()
、、print_r()
和debug_backtrace()
. Kint 的一个不寻常的——至少对于 PHP 来说——的特性是能够以操作数的形式使用实时修饰符。以下是手册对该功能的说明:
您可以使用几个实时修改器:
- ~d($var) 此调用将以纯文本格式输出。
- +d($var) 将忽略深度级别限制并输出所有内容。小心,这会使您的浏览器挂在大型物体上!
- !d($var) 将自动扩展输出。
- -d($var) 将尝试 ob_clean 先前的输出并在打印后刷新。
- 你也可以组合修饰符:~+d($var)
如果您需要更多信息,有一个与此问题类似的较旧的现有 SO 问题。
问题
- Kint 如何在不触发 PHP 错误的情况下添加这些操作数?
- 如何模拟/捕获使用这些操作数的任何调用?
如果您尝试使用这些操作数或创建自己的函数来捕获您获得的 Kint 操作数调用,则无需加载 Kint Fatal error: Uncaught Error: Unsupported operand types
。
重要提示:我正在使用该kint.phar
文件,并且没有使用 composer 或任何类型的 CLI 用法。
我的用例(请不要从问题中分心)
我正在为那些好奇的人添加此信息并进一步澄清我的问题。我真诚地想了解和了解他们是如何做到这一点的,并希望能得到答案。这个问题不是关于捍卫/批评/不同意我的用例:
为了安全和优化,我正在创建一个假的(空)Kint 类,当我的站点处于生产模式时加载该类。这确保了任何意外遗留在代码中的 Kint 调用都不会触发致命错误,永远不会打印出任何内容,并且与加载真正的 Kint 类相比,使用的资源更少。
我知道你可以禁用 Kint ,Kint::$enabled_mode = false;
但不要专注于此。这是我用来伪造 Kint 类的代码。所缺少的只是捕获使用这些非标准操作数的调用:
/**
* Fake class.
*/
class Kint {
const STATIC_BLACKHOLE = '';
public static $enabled_mode = false;
public function blackhole( $a ) {
return;
}
public function __call( $m, $a ) {
return call_user_func_array( array( $this, $this->blackhole ), $a );
}
public static function __callStatic( $m, $a ) {
return self::STATIC_BLACKHOLE;
}
}
$kint = new Kint();
// Alias of Kint::dump().
/**
* Fake function to catch d().
*
* @return void
*/
function d() {
return;
}
// Kint::dump basic mode.
/**
* Fake function to catch s().
*
* @return void
*/
function s() {
return;
}
\define( 'KINT_DIR', '/classes/Kint' );
\define( 'KINT_WIN', DIRECTORY_SEPARATOR !== '/' );
\define( 'KINT_PHP70', ( \version_compare( PHP_VERSION, '7.0' ) >= 0 ) );
\define( 'KINT_PHP71', ( \version_compare( PHP_VERSION, '7.1' ) >= 0 ) );
\define( 'KINT_PHP72', ( \version_compare( PHP_VERSION, '7.2' ) >= 0 ) );
\define( 'KINT_PHP73', ( \version_compare( PHP_VERSION, '7.3' ) >= 0 ) );
\define( 'KINT_PHP74', ( \version_compare( PHP_VERSION, '7.4' ) >= 0 ) );
\define( 'KINT_PHP80', ( \version_compare( PHP_VERSION, '8.0' ) >= 0 ) );