PHP:: 字符串的完全限定方法文字

PHP:: Fully-qualified method literal to string

本质上,我试图将静态 class 方法传递给回调,但不希望使用硬编码字符串,而是完全限定的 class 方法文字.我们可以像这样使用 classes 来做到这一点:

$name = NS\FooClass::class;

而不是:

$name = 'NS\FooClass';

这将为我们提供 class 的完全限定名称的字符串。我寻求能够为 class 方法做类似的事情,如下所示:

$name = NS\FooClass::foo_method::method;

而不是:

$name = 'NS\FooClass::foo_method';

它更易于管理,我可以使用文字更好地使用 IDE 功能。有什么类似的方法可以在不使用字符串的情况下使用 class 方法实现我想要的效果?

目前语言中没有内置这样的机制。有人建议 - 例如参见 [​​=20=] - 但要考虑的细微差别比立即显而易见的要多;特别是:

  • 语法是否应该在 运行 时解析并检查 class 和方法(::class 在大多数情况下不存在;像 [= 这样的裸函数12=] 由于名称空间的解析方式而必须这样做;实现 __callStatic 的对象永远不能以这种方式使用)?
  • 结果应该是字符串、数组(见下文)还是 Closure 对象?

无论如何,这是其他地方的话题...

正如the manual page on the callable type所说,有两种方法可以指定静态方法作为回调:

  • 作为字符串,如您的示例 'NS\FooClass::foo_method'
  • 作为数组,其中第一部分是 class 名称,第二部分是方法名称:['NS\FooClass', 'foo_method']

因为只有 class 名称需要使用命名空间信息进行限定,您可以使用 ::class 和第二种语法来获得几乎您想要的结果:

$callback = [NS\FooClass::class, 'foo_method'];

这允许任何体面的 IDE 发现对 class 的引用,并允许您通过 an imported or aliased name.

引用它

值得注意的是,如果 callable 类型在参数或 return 类型声明或文档块中指定,某些 IDEs(例如 PhpStorm)将“理解”格式作为对方法的引用,并将其包含在“查找用法”和“转到声明”等功能中。