ThinkPHP 6.0 多模块下自定义函数需统一在根目录 bootstrap.php 中 require_once 共享文件;禁止放于 app/{module}/ 下,否则 Swoole reload 时可能重复定义或缺失。

在 ThinkPHP 6.0 多模块(多应用)模式下,各应用默认隔离函数作用域,若未明确配置,app/common.php 只对主应用生效,其他模块(如 admin、api)调用自定义函数会直接报 Fatal error: Call to undefined function。
确认当前是否启用多应用模式
检查项目根目录是否存在 app/ 目录下的子目录(如 app/admin/、app/api/),且入口文件 public/index.php 中已执行 think\initializer\App::init() 或使用了 topthink/think-multi-app 扩展包——这是多应用模式的两个关键标识。
若仅有一个 app/ 目录且无子模块结构,则不属于多模块场景,无需继续往下操作。
全局共享函数库的唯一安全路径
TP6 不允许跨应用自动加载各自 app/{module}/common.php,也不支持通过 Loader::addPsr4() 注册函数文件。唯一合规方式是:在 所有应用共用的 bootstrap.php 入口点 中统一 require_once 一个物理文件。
该文件必须位于项目根目录或 vendor 下等非应用专属路径,例如:app/functions.php 或 common/functions.php。
【禁止将函数文件放在任一 app/{module}/ 目录下】,否则 Swoole 常驻进程 reload 时可能因路径解析错乱导致函数重复定义或缺失。
实操步骤:让 admin 和 api 模块同时可用自定义函数
第一步:在项目根目录新建 common/functions.php,内容仅含函数定义,不执行任何逻辑、不依赖 app() 或容器对象。
第二步:打开 app/bootstrap.php(不是 provider.php 或 event.php),在文件顶部添加:
require_once __DIR__ . '/../common/functions.php';
第三步:确保 app/admin/bootstrap.php 和 app/api/bootstrap.php 都存在,且内容为:
<?php // 空文件即可,但必须存在,否则 TP6 多应用初始化会跳过该模块
第四步:验证——在 app/admin/controller/Index.php 中调用你定义的 my_format_date(),不报错即生效。
为什么不能在每个模块的 bootstrap.php 里单独 require?
TP6 多应用启动时,会为每个模块独立执行其 bootstrap.php,但 app/bootstrap.php 是最先加载的全局入口;若你在 app/admin/bootstrap.php 里再 require 一次同一函数文件,Swoole 模式下会触发 Fatal error: Cannot redeclare —— 因为常驻内存中函数已注册,二次加载直接崩溃。
这一步操作起来很简单,直接把 require_once 放到最顶层的 app/bootstrap.php 就行。


















