ci3用$this->load->helper()加载,ci4用helper()函数;ci3路径为application/helpers/,ci4为app/helpers/;文件名须xxx_helper.php,函数定义于全局作用域,否则调用报call to undefined function或空白页。

CI3 和 CI4 加载 helper 的方式完全不同,混用会直接报 Call to undefined function 或空白页——不是函数写错了,是根本没加载成功。
CI3 怎么加载 helper:必须用 $this->load->helper()
CI3 中 helper 是类方法调用,不支持全局函数式加载。任何地方写 helper('url') 都会出错。
- 控制器里加载单个:
$this->load->helper('url'),之后可直接用site_url() - 一次加载多个:
$this->load->helper(['form', 'text', 'string']),注意是数组,不是字符串拼接 - 别在构造函数里盲目加载所有 helper——影响性能,也掩盖未声明依赖的问题
- 如果调用
set_cookie()报错,第一反应不是 cookie 配置问题,而是漏了$this->load->helper('cookie')
CI4 怎么加载 helper:直接调用 helper() 函数
CI4 废除了 $this->load 这套机制,helper 是纯函数,加载即全局可用。但 URL helper 例外:它默认已加载,无需手动调用 helper('url')。
- 加载单个:
helper('cookie'),之后就能用set_cookie() - 加载多个:
helper(['date', 'file']) - 不能写成
$this->load->helper('date')——CI4 没这个对象,会报Call to undefined method - 自定义 helper 必须放在
app/Helpers/下,文件名以_helper.php结尾,例如my_logger_helper.php
加载后调用函数还是报 undefined?检查这四点
常见错误不是语法问题,而是环境或结构问题。
- 文件名是否为
xxx_helper.php?写成xxx_helper或xxx.php都加载失败 - 函数是否定义在全局作用域?包在
class、if块或命名空间里,函数就不可见 - 是否有命名冲突?两个 helper 都定义了
limit_text(),第二个加载时会 fatal error,页面空白无提示 - 文件是否含 BOM?Windows 编辑器(如记事本)容易偷偷加 UTF-8 BOM,导致解析失败,建议用 VS Code 或 Sublime 保存为 “UTF-8 无 BOM”
什么时候该自动加载,什么时候该按需加载
自动加载适合全站高频、无条件使用的 helper,比如 url(CI4 默认已做)、text;按需加载更适合业务相关、低频或有副作用的 helper,比如 cookie、download。
- CI3:在
application/config/autoload.php中把 helper 名加进$autoload['helpers']数组,例如$autoload['helpers'] = ['url', 'form']; - CI4:没有全局 autoload.php,但可在
app/Config/Autoload.php的$psr4或$files中注册,不过更推荐按需调用helper(),避免污染全局作用域 -
cookie_helper不建议自动加载——因为set_cookie()必须在 header 发送前调用,若在视图里加载再用,大概率静默失效
最易被忽略的是:CI3 和 CI4 的 helper 文件存放路径不同、加载语法不同、甚至同名函数行为也可能因版本差异而微妙变化——别靠记忆,每次打开项目先看 composer.json 里的 codeigniter4/framework 或 codeigniter/framework 版本号,再决定用哪套规则。











