PHP中DirFilter类方法的弃用错误及版本兼容性咨询
问题分析与修复方案
核心原因
这些方法并非不受支持,而是PHP 7.4及以上版本对方法返回类型的兼容性要求更严格。SPL库中的RecursiveFilterIterator和FilterIterator在PHP 7.4+中为方法添加了明确的返回类型声明,你的子类方法未匹配这些声明,因此触发弃用错误:
FilterIterator::accept()声明返回bool类型RecursiveFilterIterator::getChildren()声明返回?RecursiveFilterIterator(可空的RecursiveFilterIterator实例)
修复方案
方案一:添加严格返回类型声明(推荐)
直接为子类方法添加匹配父类的返回类型,符合现代PHP代码规范:
class DirFilter extends RecursiveFilterIterator { protected $exclude; public function __construct($iterator, array $exclude) { parent::__construct($iterator); $this->exclude = $exclude; } public function accept(): bool { return !($this->isDir() && in_array($this->getFilename(), $this->exclude)); } public function getChildren(): ?RecursiveFilterIterator { return new DirFilter($this->getInnerIterator()->getChildren(), $this->exclude); } }
方案二:添加兼容属性(临时兼容旧版本)
如果需要同时兼容PHP 7.3及以下版本,可通过#[\ReturnTypeWillChange]属性告诉PHP暂时忽略返回类型检查:
class DirFilter extends RecursiveFilterIterator { protected $exclude; public function __construct($iterator, array $exclude) { parent::__construct($iterator); $this->exclude = $exclude; } #[\ReturnTypeWillChange] public function accept() { return !($this->isDir() && in_array($this->getFilename(), $this->exclude)); } #[\ReturnTypeWillChange] public function getChildren() { return new DirFilter($this->getInnerIterator()->getChildren(), $this->exclude); } }
内容的提问来源于stack exchange,提问作者Gökhan AYVAZ
相关产品推荐
相关产品推荐

