PHP不支持$class::$method()语法,必须用call_user_func/call_user_func_array或ReflectionClass动态调用静态方法,禁用eval以防RCE风险。
$class::$method()
PHP 解析器在编译阶段就要求类名和方法名必须是已知的标识符,$class::$method() 这种写法会报 Parse error: syntax error, unexpected '$method' (T_VARIABLE)。它不支持像 JavaScript 那样用变量拼接调用链,必须显式拆解为两步:先确定类,再调用静态方法。
call_user_func 或 call_user_func_array 动态调用静态方法这是最常用、最安全的方式,适用于已知方法签名(参数个数/类型)或需传参的场景。
call_user_func 适合无参或单参调用:call_user_func([$class, $method]);
call_user_func_array:call_user_func_array([$class, $method], [$arg1, $arg2]);
[$cla
ss, $method] 是 PHP 对“静态方法回调”的标准表示,等价于 [$class, $method],不是对象实例调用$class 是完整命名空间类名(如 'App\\Services\\Logger'),必须确保已加载或自动加载可用ReflectionClass 获取并调用静态方法(适合需要检查/控制访问权限的场景)当你需要判断方法是否存在、是否为 public static、或想绕过可见性限制(配合 setAccessible(true)),反射更灵活。
$ref = new ReflectionClass($class);
if ($ref->hasMethod($method)) {
$methodObj = $ref->getMethod($method);
if ($methodObj->isStatic() && $methodObj->isPublic()) {
$result = $methodObj->invoke(null, $arg1, $arg2);
}
}$methodObj->setAccessible(true)
call_user_func 略低,但可控性更强;生产环境慎用于高频调用路径eval 的坑有人会想到拼字符串后 eval("{$class}::{$method}()"),这极其危险且不可维护:
$class 或 $method 来自用户输入,直接导致远程代码执行(RCE)eval 行为更不可靠call_user_func 或反射清晰可控真正要动态调用,就老实用 call_user_func;要查方法元信息,就上 ReflectionClass。硬拼字符串 + eval 在现代 PHP 工程里基本没有合理存在理由。