PHP中如何为返回$this的方法提供IDE语言服务器类型提示支持
解决方案
通用兼容方案(支持所有PHP7+版本)
目前PHP低版本虽未原生支持static作为返回类型声明,但主流PHP IDE和语言服务器(包括你使用的Intelephense)均支持通过PHPDoc标注实现该能力,完全可以满足链式调用的类型提示需求,无需修改业务逻辑:
<?php class A { /** * @return static 返回当前调用类的实例 */ function a(): self { return $this; } } class B extends A { /** * @return static 返回当前调用类的实例 */ function b(): self { return $this; } } $o = new B(); $o-> // 正常提示a()、b() $o->a()-> // 同样识别为B类实例,提示a()、b(),符合预期
该方案对trait场景同样生效,只需给trait内的方法加上对应PHPDoc标注即可解决类型识别错误的问题:
trait trait1 { /** * @return static */ function a(): self { return $this; } } trait trait2 { /** * @return static */ function b(): self { return $this; } } class A { use trait1; } class B { use trait1; use trait2; } $o = new B(); $o->a()-> // 正确提示a()、b()两个方法
原生支持方案(PHP 8.3+)
PHP 8.3已经正式支持static作为返回类型声明,原生满足你的需求,无需额外PHPDoc标注:
<?php class A { function a(): static { return $this; } } class B extends A { function b(): static { return $this; } } $o = new B(); $o->a()-> // 原生识别为B类实例,提示所有可用方法
以上两种方案都完美适配流式接口设计场景,第三方开发者扩展子类新增方法后,IDE无需额外配置即可自动识别所有可用方法,不会打断链式调用的代码提示体验。
内容的提问来源于stack exchange,提问作者artfulrobot
相关产品推荐
相关产品推荐

