CodeIgniter 3集成PHPMailer失败 调用load()方法报空对象错误
CodeIgniter 3集成PHPMailer报
Call to a member function load() on null修复方案 核心报错原因
报错本质是$this->Phpmailer_library没有被成功实例化、值为null,常见诱因有两个:一是模型重写构造方法时未调用父类构造函数,导致CI框架加载器未正常初始化;二是composer自动加载路径配置错误、类文件加载逻辑冗余。
分步修复操作
1. 补全模型构造函数的父类调用
CI3中自定义模型如果重写__construct方法,必须先调用父类CI_Model的构造方法,否则框架的资源加载、超级对象挂载逻辑都不会执行,之前写的$this->load->library()实际上没有生效。
修正后的SendEmail模型构造方法代码:
public function __construct(){ parent::__construct(); // 必须新增该行,放在所有业务逻辑之前 $this->load->library('Phpmailer_library'); }
2. 修正composer自动加载路径配置
当前composer自动加载的路径配置错误:配置项$config['composer_autoload']的相对路径默认以项目入口文件index.php所在目录为根,你将vendor目录放在了application文件夹下,所以要改成绝对路径匹配。
打开application/config/config.php,修改对应配置为:
$config['composer_autoload'] = APPPATH . 'vendor/autoload.php';
修改完成后在项目根目录执行命令重新生成自动加载映射:
composer dump-autoload
3. 简化自定义类库的加载逻辑
开启composer自动加载后,不需要手动require_once引入PHPMailer的源文件,直接通过命名空间实例化即可,避免重复加载、路径错误问题。
修正后的application/libraries/Phpmailer_library.php代码:
<?php defined('BASEPATH') OR exit('No direct script access allowed'); use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; class Phpmailer_library { public function __construct() { log_message('Debug', 'PHPMailer class is loaded.'); } public function load() { $objMail = new PHPMailer(true); return $objMail; } }
校验注意事项
- 类库文件名严格和类名大小写保持一致,Linux服务器环境下文件名大小写敏感,
Phpmailer_library.php不能随意改大小写 - 修改完成后可以先在调用处打印
var_dump($this->Phpmailer_library),确认返回类实例而非null后,再调用load()方法 - 如果仍加载失败,检查
application/vendor/phpmailer目录是否完整,缺文件的话重新执行composer require phpmailer/phpmailer安装依赖即可
内容的提问来源于stack exchange,提问作者Jose Rizal
相关产品推荐
相关产品推荐

