不行。::是作用域操作符,仅适用于类、接口、trait或命名空间的静态成员,而匿名函数是运行时创建的Closure对象,无类名上下文,也不属于任何命名空间作用域,语法上禁止使用::调用。
:: 不能用于匿名函数直接回答:不行。:: 是作用域操作符(Scope Resolution Operator),只适用于类、接口、trait 或命名空间下的静态成员(static 属性/方法)、常量,而匿名函数是运行时创建的 Closure 对象,没有类名上下文,也不属于任何命名空间作用域——它本身不是“作用域内声明的静态成员”,所以语法上不允许用 :: 调用。
Closure 对象没有类名,无法通过 :: 访问匿名函数被实例化后是 Closure 类型的对象,但它不是用户定义的类,也没有可被 :: 引用的静态结构。即使你尝试 Closure::someMethod(),也会报错:Fatal error: Uncaught Error: Class 'Closure' cannot be used as a (PHP 8.2+)或更早版本的
class nameCall to undefined method Closure::xxx()。
Closure 类本身没有公开的静态方法可供调用:: 绑定或调用匿名函数自身——它必须通过变量或 call_user_func() 等方式执行use ($var))或在内部显式写 SomeClass::$prop / SomeClass::method()
有人试图写类似 $fn::call($obj, ...$args) 来模拟绑定调用,这是错的。正确的做法是:
$fn->bindTo($obj, $class)(返回新 Closure)$fn->bindTo($obj)->__invoke(...$args)
($fn->bindTo($obj))(...$args)(PHP 7.4+)SomeClass::staticMethod(),不需要、也不能通过匿名函数中转再加 ::
$fn = function() { return self::VERSION ?? 'n/a'; }; // ❌ self 在匿名函数中无效
$fn = function() use ($version) { return $version; }; // ✅ 显式 use 捕获
$bound = $fn->bindTo($obj); // ✅ 绑定到对象,但仍是 Closure 实例,非类名调用
:: 无关PHP 的 :: 和 JavaScript 的 bind 语法(如 obj::method)毫无关系。JS 的 :: 是提案语法糖(已废弃),而 PHP 的 :: 自 PHP 5.0 起就严格限定于类/命名空间静态解析。别被其他语言带偏。
真正要注意的是:匿名函数的闭包行为(use 捕获)、绑定对象(bindTo)、以及它作为一等公民被赋值/传递时的生命周期——这些才是实际开发中容易出错的地方,而不是琢磨怎么给它加 ::。