PHP中类方法指定自定义类型参数后如何正确初始化对应变量
问题根因与解决方法
类型报错的核心原因是传入构造方法的变量类型和声明的EmailService自定义类型不匹配,示例代码还存在一处属性赋值的语法错误,按以下步骤修正即可:
- 首先需要先定义
EmailService类,原代码中只有类型声明,没有对应的类实现:
class EmailService { // 可根据业务需求封装邮件服务相关逻辑,这里举个简单示例存储邮箱服务商信息 public string $provider; public function __construct(string $provider) { $this->provider = $provider; } }
- 修正原
test类的属性赋值错误,原写法$this->$emailService多了一个$符号,属于动态属性写法,不符合预期,同时建议提前声明类属性:
class Test { // 声明类属性,PHP 7.4及以上版本支持属性类型声明 public EmailService $emailService; public function __construct(EmailService $emailService) { $this->emailService = $emailService; } }
- 初始化变量时,先实例化
EmailService类,再传入Test类的构造方法,就符合类型约束要求了:
// 先实例化自定义的EmailService类,把gmail作为参数传入 $emailService = new EmailService("gmail"); // 此时$emailService就是EmailService类型,传入构造方法不会报错 $test = new Test($emailService);
补充说明
如果需要更高的扩展性,可以把EmailService定义为接口,不同的邮件服务商(gmail、outlook等)分别实现这个接口,构造方法的类型约束使用接口,就能兼容所有实现了该接口的类实例,符合依赖倒置原则。
内容的提问来源于stack exchange,提问作者Lawrence Cooke
相关产品推荐
相关产品推荐

