PHP中字符串形式的函数名为何会被自动解释执行?
PHP 字符串字面量直接调用函数的原理
- 这是PHP 7.0及以上版本对可变函数特性的扩展支持:PHP原生就支持可变函数逻辑,即如果一个值后面紧跟带参数的括号结构,PHP会尝试将该值识别为可调用结构并执行,传统写法是把函数名赋值给变量后调用:
PHP 7.0之后,该逻辑支持直接作用于字符串字面量、数组元素、表达式返回值等结构,不需要提前赋值给变量,因此$func = 'system'; $func('id'); // 等价于system('id')"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。
相关产品推荐
相关产品推荐

