首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >kint如何解析以符号(加号/减号、倾斜号、感叹号、at)为前缀的PHP函数?

kint如何解析以符号(加号/减号、倾斜号、感叹号、at)为前缀的PHP函数?
EN

Stack Overflow用户
提问于 2017-12-08 13:26:01
回答 2查看 202关注 0票数 3

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

有关资料:

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

代码语言:javascript
复制
! 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)规则的。例如,为什么~没有给出语法错误。考虑一下这个例子:

代码语言:javascript
复制
<?php
function d($args) {
  echo $args[0];
}
d([1,2,3]); // prints 1
~d([1,2,3]); // syntax error, unsupported operand types

vs

代码语言:javascript
复制
<?php
require 'kint.php';
~d([1,2,3]); // prints the array with the text renderer with no issues

编辑2:删除kint使用eval()的未经证实的声明

EN

回答 2

Stack Overflow用户

发布于 2021-11-08 21:15:23

这是Kint的原作者。

很抱歉你发现这让人困惑!操作数是作为一个速记添加的,以切换一些常用的通用场景设置。

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

注意,变量名显示为^。到写的时候为止,Kint仍然是唯一能做到这一点的人!

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

PHP一元运算符:

因此,只要函数返回运算符通常使用的值类型,就完全允许在这些运算符中使用前缀函数调用。

代码语言:javascript
复制
function foo() {
    return 0;
}

// All of these work just fine, and generate no errors:
-foo();
+foo();
!foo();
~foo();
票数 2
EN

Stack Overflow用户

发布于 2018-04-25 08:33:18

抱歉,回复晚了。我只是在看Kint文档,也有同样的问题。找到你的问题后我决定调查。到目前为止,您可能已经知道了,但是kind实际上读取了调用它以根据是否存在这些“修饰符”来改变其行为的文件的源代码。

就我而言,这种行为是绝对不可预测的,我不敢相信有人会用这种伎俩作为概念的证明。值得注意的是,由于该文件必须是可读的,所以kint修饰符会在eval()d代码上失败(您不应该首先使用这些代码),也许在其他不寻常的情况下也是如此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47715325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档