
在 codeigniter 3 中,自定义库(位于 `application/libraries/`)无法直接访问 `$this->load`,因其不继承 ci_controller;需通过 `get_instance()` 获取主应用实例后,再调用 `load->library()` 才能成功加载 session 等核心库。
在 CodeIgniter 3 中,$this->load 是控制器(CI_Controller)的专属属性,而自定义库类(如 Gdrive_api)默认是普通 PHP 类,不继承任何框架基类,因此直接使用 $this->load->library('session') 会导致 "Undefined property: Gdrive_api::$load" 错误。
✅ 正确做法是:在库的构造函数中调用 get_instance() —— 这是一个 CodeIgniter 提供的全局辅助函数,用于获取当前 CI 超级对象(即主应用实例),从而访问所有已加载的组件(如 load、db、session 等)。
以下是标准实现方式:
ci = &get_instance();
// 通过实例加载 session 库(自动启用 session 驱动)
$this->ci->load->library('session');
// ✅ 此时可安全使用 session 方法
// $this->ci->session->set_userdata('key', 'value');
// echo $this->ci->session->userdata('key');
}
}? 注意事项:
- 必须使用 &get_instance()(带引用符号 &),确保操作的是原始 CI 实例,避免副本导致状态不同步;
- Session 库需已在 application/config/autoload.php 中配置自动加载,或确保在控制器中已初始化(因 Session 依赖于 input 和 security 等前置组件);
- 若 Session 尚未启动(如未调用 session_start() 或未配置有效驱动),调用 session 方法可能静默失败,建议检查 config/config.php 中的 sess_driver、sess_save_path 等配置;
- 不推荐在库中重复加载已存在的库(如多次调用 load->library('session')),CodeIgniter 会自动跳过重复加载,但为清晰起见,可加判断:if (!isset($this->ci->session)) { ... }。
? 进阶提示:
你还可以在构造函数中一并加载其他依赖库,例如:
$this->ci->load->library(['session', 'email', 'encryption']);
或按需注入常用服务,提升库的复用性与可测试性。
总之,get_instance() 是打通自定义库与 CodeIgniter 核心功能的关键桥梁——掌握它,即可在 Library、Helper 甚至 Model 中灵活调用框架全部能力。










