ci4中加载helper的正确写法是helper()函数,如helper('tx_helper')或helper(['url', 'text']),文件必须置于app/helpers/且严格小写带_helper后缀,basecontroller中可通过protected $helpers = ['url', 'tx_helper']预加载。

CI4 中控制器内加载 helper 的正确写法
直接用 helper() 函数,不是 $this->load->helper() —— 那是 CI3 的写法,CI4 已废弃该语法,硬写会报 Call to undefined method CodeIgniter\Controller::load() 错误。
-
helper('tx_helper'):加载app/Helpers/tx_helper.php(注意必须带_helper后缀) -
helper(['url', 'text']):一次加载多个,传数组即可 - 不能写成
helper('tx')或helper('Tx_helper')—— 文件名、参数名必须全小写且严格匹配 - 函数调用前必须先加载,否则会提示
Call to undefined function
为什么 helper() 找不到我刚写的函数?
常见原因是文件位置或命名不合规。CI4 的 helper() 仅扫描以下路径:
-
app/Helpers/(最高优先级,最先加载) - 各 PSR-4 命名空间下的
Helpers/子目录(按app/Config/Autoload.php中$psr4定义顺序) -
system/Helpers/(最后加载,不可覆盖)
所以如果你把 my_helper.php 放在 app/helpers/(小写 helpers)或 app/MyHelper.php,它根本不会被发现。
CI3 和 CI4 加载 helper 的关键区别
别混用旧习惯。CI3 是面向对象加载,CI4 是纯函数式,且机制完全不同:
- CI3:
$this->load->helper('myfunc')→ 加载application/helpers/myfunc_helper.php - CI4:
helper('myfunc_helper')→ 加载app/Helpers/myfunc_helper.php - CI4 不支持自动后缀补全,
helper('myfunc')不会尝试找myfunc_helper.php,必须显式写全名 - CI4 中 helper 文件里定义的函数默认进入全局作用域,无需
use或命名空间引用
在 BaseController 中预加载 helper 怎么做?
如果多个控制器都要用同一组 helper,别重复写 helper(),改配置更稳妥:
- 编辑
app/Controllers/BaseController.php - 在类属性中声明:
protected $helpers = ['url', 'tx_helper']; - 这个数组会在每次继承 BaseController 的控制器实例化时自动触发
helper() - 注意:这里填的仍是文件名(如
tx_helper),不是函数名,也不加.php
最容易被忽略的是:CI4 的 helper 加载是「静态扫描 + 运行时函数注入」,没有类实例、不走 autoloader,所以拼错一个字母、多一个空格、大小写不对,函数就永远不可见 —— 没报错,只报 undefined function。











