kint如何解析以符号为前缀的PHP函数(加号/减号,波浪号,感叹号,at)?

时间:2017-12-08 13:26:02

标签: php kint

PHP调试工具kint有一种奇怪的语法,其中某些符号可以作为前缀添加到函数中以改变它们的行为,如this guide所示。

相关信息:

  

修饰符是一种在不必使用其他功能的情况下更改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中使用,请参阅:What is the use of the @ symbol in 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

VS

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

我可以看到kint本身使用eval()(这必须是一个安全问题),但我无法弄清楚它是如何工作的。

1 个答案:

答案 0 :(得分:1)

很抱歉迟到的回复。我刚刚阅读了Kint文档并遇到了同样的问题。找到你的问题后,我决定调查。您可能现在已经弄清楚了,但是实际上读取了调用它的文件的源代码,以根据这些&#34;修饰符&#34;中的任何一个来改变它的行为。在场

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