如何在接口中使用方法注入,解决实现类契约不符报错
解决方法
首先修正原代码中的语法错误:实现类的getUser方法定义里不能直接写实参值('clientA'、'user-login'),这些是调用方法时传入的参数,不属于方法定义的内容。
要在遵守接口契约的前提下实现依赖注入,有两种可行方案:
方案一:构造函数注入依赖(推荐)
将验证器依赖注入到UserRepository类的属性中,这样getUser方法可以完全遵循接口的签名,同时在方法内部使用已注入的验证器:
interface UserRepositoryInterface { public function getUser($userType, $login): Builder; } class UserRepository implements UserRepositoryInterface { private $emailValidator; private $phoneValidator; // 通过构造函数注入验证器依赖 public function __construct( EmailValidatorInterface $emailValidator, PhoneValidatorInterface $phoneValidator ) { $this->emailValidator = $emailValidator; $this->phoneValidator = $phoneValidator; } // 严格匹配接口的方法签名 public function getUser($userType, $login): Builder { // 在方法内使用注入的验证器 $this->emailValidator->validate($login); // ... 执行其他业务逻辑 return new Builder(); } }
方案二:修改接口添加可选参数(仅当接口可修改时使用)
如果允许调整接口定义,可以给接口方法添加可选参数,支持调用getUser时直接注入依赖:
// 修改接口,添加可选的验证器参数 interface UserRepositoryInterface { public function getUser( $userType, $login, EmailValidatorInterface $emailValidator = null, PhoneValidatorInterface $phoneValidator = null ): Builder; } class UserRepository implements UserRepositoryInterface { // 方法签名与接口完全匹配 public function getUser( $userType, $login, EmailValidatorInterface $emailValidator = null, PhoneValidatorInterface $phoneValidator = null ): Builder { if (!$emailValidator || !$phoneValidator) { throw new \InvalidArgumentException("必须注入验证器依赖"); } $emailValidator->validate($login); // ... 执行其他业务逻辑 return new Builder(); } }
注意:如果接口属于不可修改的第三方契约,方案一是唯一合规的选择——实现类必须严格遵守接口定义的方法签名,不能随意增加参数。
内容的提问来源于stack exchange,提问作者AidOnline01
相关产品推荐
相关产品推荐

