You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中字符串形式的函数名为何会被自动解释执行?

PHP 字符串字面量直接调用函数的原理
  • 这是PHP 7.0及以上版本对可变函数特性的扩展支持:PHP原生就支持可变函数逻辑,即如果一个值后面紧跟带参数的括号结构,PHP会尝试将该值识别为可调用结构并执行,传统写法是把函数名赋值给变量后调用:
    $func = 'system';
    $func('id'); // 等价于system('id')
    
    PHP 7.0之后,该逻辑支持直接作用于字符串字面量、数组元素、表达式返回值等结构,不需要提前赋值给变量,因此"system"("id")会被直接解析为调用system函数。
  • 内核解析层面,PHP语法解析器遇到(表达式)(参数列表)结构时,会先对前面的表达式做类型判断:如果返回值是字符串类型,且全局作用域下存在和字符串同名的函数,就会直接触发函数执行逻辑,不需要依赖call_user_func等中转函数。
  • 针对你提到的绕过仅允许base_convert的过滤器场景,该特性可以直接搭配base_convert生成的函数字符串使用,不需要额外存储变量,举个可行的利用示例:
    // base_convert(1751257635,10,36)的返回结果为字符串"system"
    base_convert(1751257635,10,36)('id');
    
    这种写法可以绕过大部分只过滤固定函数名、没有拦截动态函数调用逻辑的过滤器。

内容的提问来源于stack exchange,提问作者Bryton。

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:42:01