如何将PHPMailer功能封装到类中 报Trait未找到致命错误
问题原因
触发该报错有两个核心语法错误:
- 错误将普通类当作Trait引入:PHP语法中,类内部写的
use Xxx仅用于导入Trait,而PHPMailer\PHPMailer\PHPMailer、PHPMailer\PHPMailer\SMTP、PHPMailer\PHPMailer\Exception都是普通功能类,不属于Trait,自然会触发找不到Trait的报错。 - 文件加载时机错误:PHP的命名空间导入、类定义解析是编译阶段执行的逻辑,你把加载PHPMailer文件的
require语句写在了类的构造函数里,编译阶段PHPMailer相关文件还没被加载,根本找不到对应的类定义。
修复方案
调整代码结构,把文件加载、命名空间类导入移到类定义外层,删除类内部错误的Trait引入语句即可。
修改后的自定义邮件类代码如下:
// 提前加载PHPMailer相关文件,不要放在构造函数内 require "phpmailer/PHPMailer.php"; require "phpmailer/SMTP.php"; require "phpmailer/Exception.php"; // 类外部的use是命名空间导入,用于简化后续类名调用 use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; class sendPHPMailer{ // 此处删除原来错误写在类内部的三个use引入语句 function __construct(){ // 构造函数不需要重复写require加载逻辑 } function send_email($name = "", $email = "", $remaining_days = ""){ // 外层已经完成命名空间导入,此处可以直接实例化 $mail = new PHPMailer(true); // 后续你原有的SMTP配置、发件人/收件人设置、邮件内容拼接、发信执行逻辑保持不变即可 } }
实例化调用的代码不需要改动,保持原有写法即可正常运行:
$email_send = new sendPHPMailer(); $email_send->send_email($name, $email, $days);
补充说明:如果你的项目已经接入Composer自动加载,连开头的三个
require语句都不需要手动写,直接引入Composer生成的autoload.php文件即可自动加载PHPMailer相关类,代码会更简洁。
内容的提问来源于stack exchange,提问作者Novice
相关产品推荐
相关产品推荐

