thinkphp 8.0 彻底移除 s()、c()、think_encrypt() 等旧 helper 函数,必须重构:s() 改用 cache::get/set(),c() 改用 config(),think_encrypt() 改用 crypt::encrypt()/decrypt(),其他如 i()、u()、d()、l() 也均有对应新规范。

ThinkPHP 5.1 升级到 8.0 后,大量旧版 Helper 函数(如 S()、C()、think_encrypt() 等)已被彻底移除,不是“弃用警告”,而是直接调用报 Fatal error: Call to undefined function。这些函数在 TP8 中不再存在,必须按新规范替换,不能靠临时补丁或兼容层长期维持。
核心原则:TP8 不提供 Helper 函数兜底,所有替代方案都需显式重构
S() 缓存函数 → 改用 Cache 门面 + 驱动抽象
S('key', $val, 3600) 和 S('key') 这类写法在 TP8 中完全失效。
-
S()是 TP3/TP5.0 的硬编码文件缓存快捷方式,TP5.1 起已删除,TP8 更无回退路径。 - 必须改用
\think\Cache::set()/\think\Cache::get(),并确认缓存驱动已配置(如config/cache.php中启用file或redis)。
常见替换方式:
-
S('user_123')→\think\Cache::get('user_123') -
S('user_123', $data, 3600)→\think\Cache::set('user_123', $data, 3600) -
S(['user', 123])(数组键)→ 不再支持,需拼为字符串'user_123'或加命名空间前缀'cache:user:123'
注意:TP8 默认缓存路径为 runtime/cache/,与旧版 Runtime/Data/ 完全隔离,历史缓存无法复用。
C() 配置读写 → 统一用 config() 助手函数
C('database.host') 或 C('app_debug', true) 在 TP8 中会直接报错。
-
C()函数自 TP5.1 起已被删除,TP8 中不存在同名函数,也无自动别名。 - 所有配置访问必须走
config(),它本质是think\Config的静态代理,支持点号分隔键名、运行时设置、环境合并。
正确用法:
- 读单值:
config('database.hostname')(不是database.host) - 读整组:
config('database')返回关联数组 - 写配置(仅当前请求有效):
config('cache.type', 'redis') - 禁止在
common.php或middleware外提前调用config('key', $val),否则可能被后续加载覆盖
TP8 的 config() 读取的是最终合并结果(含 .env、环境配置、缓存配置),不是原始 PHP 文件。
think_encrypt() / think_decrypt() → 改用 Crypt 门面 + OpenSSL 标准加密
think_encrypt('abc', 'key') 在 TP8 中会触发 Call to undefined function。
- TP5.1 起该函数已被移除,TP8 完全不兼容 TP5.0 的异或+base64 混淆逻辑。
- 必须使用
\think\Crypt::encrypt()/decrypt(),依赖topthink/think-crypt扩展,且密钥必须为 16/24/32 字节(对应 AES-128/192/256)。
迁移要点:
- 先执行
composer require topthink/think-crypt - 运行
php think vendor:publish拉取config/crypt.php - 检查
config/crypt.php中的key是否为二进制安全字符串(推荐用bin2hex(random_bytes(16))生成) - 老数据无法自动解密:TP5.0 加密结果和 TP8 输出结构完全不同(无 IV、无 HMAC),需单独保留旧解密逻辑处理存量数据
其他常见 Helper 函数替代对照
-
I()(输入过滤)→ 改用$request->param()、->get()、->post(),配合验证器Validate -
U()(URL 生成)→ 改用url('index/index')或Url::build()(需 use think\facade\Url) -
D()(模型实例化)→ 直接new User()或依赖注入,TP8 推荐用Db::name('user')或 ORM 模型类 -
L()(语言变量)→ 改用lang('hello'),确保lang/zh-cn.php等语言包已按 TP8 规范放置
不复杂但容易忽略。











