3

PHP 调试工具kint有一个奇怪的语法,其中某些符号可以作为函数的前缀来改变它们的行为,如本指南所示。

相关资料:

修饰符是一种无需使用其他函数即可更改 Kint 输出的方法。只需在调用 kint 前加上修饰符即可应用它:

! Expand all data in this dump automatically  
+ Disable the depth limit in this dump  
- Attempt to clear any buffered output before this dump  
@ Return the output of this dump instead of echoing it  
~ Use the text renderer for this dump

Example:

+Kint::dump($data); // Disabled depth limit
!d($data); // Expanded automatically

这是如何运作的?

通过查看源代码,这些符号似乎被解析为一个名为$modifiers. 但是你怎么能用 PHP 做到这一点呢?这个范围是什么,我是否也可以使用其他 unicode 符号来执行此操作,或者只有五个有问题的符号(+、-、~、!、@)。

'@' 前缀在 PHP 中已经有了用处,请参阅:PHP 中 @ 符号的用途是什么?. 这怎么能被推翻?


编辑:对给出的答案的后续问题是 kint 究竟如何弯曲(php)规则。例如为什么~不给出语法错误。考虑这个例子:

<?php
function d($args) {
  echo $args[0];
}
d([1,2,3]); // prints 1
~d([1,2,3]); // syntax error, unsupported operand types

对比

<?php
require 'kint.php';
~d([1,2,3]); // prints the array with the text renderer with no issues

编辑 2:删除了 kint 使用 eval() 的未经证实的说法

4

2 回答 2

1

这么晚才回复很抱歉。我只是在阅读 Kint 文档并且有同样的问题。找到您的问题后,我决定进行调查。您现在可能已经弄清楚了,但是 kind实际上会读取调用它的文件的源代码,以根据这些“修饰符”是否存在来更改其行为

就我而言,这种行为是绝对不可预测的,我无法相信有人会将这种技巧用作概念证明之外的任何东西。值得注意的是,因为文件必须是可读的,kint 修饰符在 eval()'d 代码(你不应该开始使用)上失败,也许在其他不寻常的情况下也是如此。

于 2018-04-25T08:33:18.447 回答
1

Kint 的原作者在这里。

抱歉,您发现它令人困惑!添加了操作数作为速记,以切换常见用例场景的一些常用设置。

由于 Kint 已经解析了调用它的 PHP 代码,以获取和显示正在转储的传递变量的名称(或表达式) ,因此添加操作数是对该功能的次要添加。

显示的变量名

注意变量名显示为 ^。截至撰写本文时,Kint 仍然是唯一可以做到这一点的自卸车!


对 OP 问题的实际解释来自这个深入的答案

PHP 一元运算符:

因此,完全可以使用这些运算符为函数调用添加前缀,只要函数返回运算符通常可以处理的值类型

function foo() {
    return 0;
}

// All of these work just fine, and generate no errors:
-foo();
+foo();
!foo();
~foo();
于 2021-11-08T21:15:23.887 回答