如何实现类似::class的方法名引用?支持重构与IDE识别
PHP中方法引用的重构友好方案探讨
在框架配置里,我们经常要引用类名和方法名:
$setting = [ 'controller' => DemoController::class, 'action' => 'demoAction', // 这里怎么实现类名引用那样的重构便利性? ];
用::class引用类名的好处很明显——重构时IDE能自动识别、更新这些引用,甚至当类被标记为废弃时会直接提示。但方法名用字符串写就没这待遇了,字符串不是真正的引用,类或方法改名、废弃时,IDE不会给任何提示,很容易留下隐患。
现有方案与思路
1. 未落地的官方提案
有一个名为《函数引用》的PHP RFC提案,提出了类似类名::方法名的语法,用来获取方法名的字符串,和::class的逻辑完全对应。比如可以写成:
$setting = [ 'controller' => DemoController::class, 'action' => DemoController::demoAction, ];
这样IDE就能像识别类引用一样处理方法引用,重构、废弃提示都能正常工作。但这个提案目前还在讨论阶段,没被纳入PHP核心版本。
2. 手动维护类常量
在类内部定义对应方法名的常量,配置里直接引用常量:
class DemoController { public const ACTION_DEMO = 'demoAction'; public function demoAction() { // 业务逻辑 } } // 配置中引用常量 $setting = [ 'controller' => DemoController::class, 'action' => DemoController::ACTION_DEMO, ];
这种方式是语言层面的支持,重构时只要修改常量值,所有引用的地方都会被IDE识别到,可靠性很高,就是需要手动给每个要引用的方法加常量,有点繁琐。
3. IDE层面的注释标记
像PhpStorm这类主流IDE,支持用注释把字符串标记为方法引用:
$setting = [ 'controller' => DemoController::class, /** @method DemoController::demoAction */ 'action' => 'demoAction', ];
IDE会识别这个注释,把字符串当成真实的方法引用处理,提供重构提示和废弃警告。但这只是单个IDE的特性,换其他IDE就失效了,属于“软支持”。
4. 闭包引用(不适合配置场景)
如果不是静态配置文件,能使用闭包的话,可以直接用闭包指向方法,但配置一般是可序列化的数组,闭包没法序列化,所以这个方案基本用不上。
总的来说,PHP目前还没有官方的方法引用语法,那个RFC是未来可能的方向。当下最实用的就是类常量方案,虽然麻烦但可靠;追求便捷的话可以用IDE注释,但要注意兼容性。
内容的提问来源于stack exchange,提问作者NuSphere
相关产品推荐
相关产品推荐

