CodeIgniter 4 中用 session() 函数获取会话实例,CI3 则需 $this->load->library('session');两者不兼容,且 CI4 不自动注入 $this->session,须手动调用或构造函数注入。

session() 是 CodeIgniter 4 的会话辅助函数,它不是“辅助函数”而是服务工厂函数——调用它会返回一个已初始化的 Session 实例;CodeIgniter 3 没有这个函数,只有 $this->session 对象。
怎么初始化 Session:CI4 用 session(),CI3 用 $this->load->library('session')
两者完全不兼容,不能混用。你得先确认自己用的是哪个版本:phpinfo() 或 composer show codeigniter4/framework 查版本号。
- CI4 中,
session()是全局 helper 函数,无需load,直接调用即可:$session = session();
它等价于\Config\Services::session(),但更简洁 - CI3 中,
session()不存在,必须在控制器构造函数或方法里显式加载:$this->load->library('session');且必须确保parent::__construct()已先调用(否则$this->session为 null) - CI3 的
$config['encryption_key']必须非空,否则 session 启动失败,报错类似Unable to load the session library;CI4 则由app/Config/Encryption.php中的$key控制,且默认已生成
为什么不能在 CI4 构造函数里直接用 $this->session?
因为 CI4 的控制器基类 BaseController 默认**不自动注入** session 服务——它只注入 request、response、logger 等基础服务,session 需手动获取或显式声明依赖。
- 错误写法(
$this->session为 null):public function __construct()<br>{<br> if (!$this->session->has('user_id')) { ... } // ❌ Fatal error: Call to a member function has() on null<br>} - 正确做法之一(推荐):在需要时调用
session():public function index()<br>{<br> $session = session();<br> if (!$session->has('user_id')) { ... } // ✅<br>} - 正确做法之二(构造函数注入):类型提示 + 参数接收(仅限 CI4.3+,且需服务容器注册):
public function __construct(\CodeIgniter\Session\Session $session)<br>{<br> $this->session = $session;<br>}但注意:这不是默认行为,需确认你的 CI4 版本和服务配置支持
常见错误现象和对应修复
session 看似“自动运行”,但初始化失败时往往静默失效,导致数据存不进、取不出、登录态丢失——这些问题几乎都卡在初始化环节。
-
CI3 报错
Undefined property: CI::$session:没加载库,或加载前就用了$this->session;检查是否漏了$this->load->library('session'),且是否在parent::__construct()之后调用 -
CI4 调用
session()返回 null:通常是 session 配置损坏,检查app/Config/Session.php中的$driver(如设为'file'但$savePath目录不可写)、$cookieName是否含非法字符 -
存进去的数据下个请求就没了:CI3 检查
$config['sess_save_path']权限;CI4 检查app/Config/Session.php的$savePath(默认是WRITEPATH . 'session'),确认目录存在且 web 服务器可写 -
本地开发正常,上线后 session 失效:服务器禁用了 cookie 或设置了
session.cookie_secure = On但没走 HTTPS;CI4 可在app/Config/Session.php中设$secure = false(仅调试用)
CI4 的 session() 看似简单,但它背后依赖加密配置、存储驱动、Cookie 设置三者协同;任何一环断开,session 就“活着但不工作”——这种静默失败,比报错更难排查。










