如何让PHPStan识别基于class_implements的条件接口方法调用
解决PHPStan无法识别父类中基于接口实现的条件调用问题
问题描述
在抽象父类ParentClass的run方法中,通过class_implements(static::class)判断子类是否实现Displayable接口,再调用display()方法,但PHPStan提示错误:Call to an undefined method ParentClass::display()——它无法识别该运行时条件判断的逻辑。
代码示例
<?php declare(strict_types = 1); interface Displayable { public function display(): string; } abstract class ParentClass { public function run(): string { if (in_array(Displayable::class, class_implements(static::class))) { return $this->display(); } return ''; } } class ChildClass extends ParentClass implements Displayable { public function display(): string { return 'dis'; } }
解决方案
方法一:使用instanceof替代class_implements
instanceof是PHPStan可静态分析的类型判断方式,替换后工具能直接识别当前$this的类型:
public function run(): string { if ($this instanceof Displayable) { return $this->display(); } return ''; }
方法二:添加PHPDoc类型注解(兼容旧写法)
如果要保留class_implements的写法,可在判断后的代码块前添加注解,明确告知PHPStan当前$this的类型:
public function run(): string { if (in_array(Displayable::class, class_implements(static::class))) { /** @var Displayable $this */ return $this->display(); } return ''; }
推荐优先使用第一种方法,instanceof本身就是更直观的类型检查方式,无需额外注解就能让静态分析工具准确识别逻辑。
内容的提问来源于stack exchange,提问作者Zoomyboy
相关产品推荐
相关产品推荐

