PHP::将完全限定的方法文本转换为字符串

PHP::将完全限定的方法文本转换为字符串,php,string,class,methods,literals,Php,String,Class,Methods,Literals,本质上,我试图将静态类方法传递给回调,但不希望使用硬编码字符串,而是完全限定类方法文本。我们可以使用这样的类来实现这一点: $name = NS\FooClass::class; 而不是: $name = 'NS\FooClass'; $name = 'NS\FooClass::foo_method'; 这将为我们提供类的完全限定名字符串。我希望能够为这样的类方法做类似的事情: $name = NS\FooClass::foo_method::method; 而不是: $name = '

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

$name = NS\FooClass::class;
而不是:

$name = 'NS\FooClass';
$name = 'NS\FooClass::foo_method';
这将为我们提供类的完全限定名字符串。我希望能够为这样的类方法做类似的事情:

$name = NS\FooClass::foo_method::method;
而不是:

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

它更易于管理,而且我可以更好地使用IDE功能,使用文字。有没有类似的方法可以在不使用字符串的情况下通过类方法实现我想要的功能?

目前该语言中没有内置这种机制。有人建议——比如说——但要考虑的细微差别要比可能立即显现出来的多;值得注意的是:

  • 语法是否应该在运行时解析并检查类和方法的存在(
    ::class
    在大多数情况下不会;由于名称空间解析的方式,像
    strlen::func
    这样的裸函数必须解析;实现
    \u callStatic
    的对象永远不能以这种方式使用)
  • 结果应该是字符串、数组(见下文)还是
    Closure
    对象
无论如何,这是其他地方的一个话题

如上所述,有两种方法可以指定用作回调的静态方法:

  • 作为字符串,如您的示例
    'NS\FooClass::foo\u method'
  • 作为一个数组,其中第一部分是类名,第二部分是方法名:
    ['NS\FooClass','foo\u method']
由于只需使用名称空间信息限定类名,因此可以使用第二种语法使用
::class
,以获得所需的内容:

$callback = [NS\FooClass::class, 'foo_method'];
这允许任何像样的IDE发现对该类的引用,并允许您通过


值得注意的是,如果在参数或返回类型声明或docblock中指定了
可调用的
类型,则某些IDE(例如PhpStorm)将“理解”任何一种格式作为方法的引用,并将其包含在“查找用法”和“转到声明”等功能中。

回答得非常好!回答问题的单一陈述,然后是非常详细的解释以及解决方法。非常感谢你!