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()
(这必须是一个安全问题),但我无法弄清楚它是如何工作的。
答案 0 :(得分:1)
很抱歉迟到的回复。我刚刚阅读了Kint文档并遇到了同样的问题。找到你的问题后,我决定调查。您可能现在已经弄清楚了,但是实际上读取了调用它的文件的源代码,以根据这些&#34;修饰符&#34;中的任何一个来改变它的行为。在场。
就我而言,这种行为绝对无法预测,我无法相信任何人都会使用这种技巧作为概念证明。值得注意的是,因为文件必须是可读的,所以kint修饰符在eval()代码(你不应该开始使用它)时失败,也许在其他异常情况下也是如此。