自定义函数应放在app/support/helpers.php并用require_once在start.php顶部显式加载,避免命名冲突、隐式依赖和全局状态修改,确保多进程下安全调用。

自定义函数文件该放哪、怎么加载
Webman 没有内置的 helpers.php 自动加载机制,必须手动引入。最稳妥的位置是 app/Support/helpers.php(目录不存在就创建),然后在项目入口文件 start.php 顶部用 require_once 显式加载。
不要放在 config/ 或 route/ 这类配置目录下——这些目录只被框架按配置逻辑读取,不执行代码;也不要放在 app/controller/ 下,控制器类加载是按需触发的,函数可能还没定义就被调用了。
-
require_once必须写在start.php的最前面,早于Worker::runAll() - 函数定义不能包裹在
if或其他条件块里,否则可能跳过执行 - 用
function_exists()包一层,避免多进程 reload 时重复定义报错
函数命名和调用时的常见错误
Webman 是常驻进程,函数一旦加载就长期存在。但命名冲突或作用域问题会导致 Call to undefined function 或静默失败。
- 函数名必须全局唯一,别和 Laravel、ThinkPHP 的
str_slug()或array_only()同名 - 不要在函数内部用
$this,它不是类方法,没有上下文对象 - 模板中直接调用时(如
<?php echo format_time($time); ?>),要确认该函数已在当前请求生命周期内被载入——也就是start.php已执行过require_once - 如果用 Composer autoload.files 加载(类似 Laravel 做法),需确保
composer dump-autoload已运行,且 Webman 进程已restart(不是reload)
在控制器、中间件、视图中都能用,但要注意时机
只要函数定义完成,就能在任何地方调用。但几个关键点容易被忽略:
- 中间件里调用没问题,但注意中间件执行顺序——如果你的 helper 依赖某个服务容器实例,而该服务注册在中间件之后,就会出错
- 视图中调用时,
htmlspecialchars()这类原生函数可用,但你自己写的format_money()必须确保已加载,否则模板会直接报错中断渲染 - 自定义进程(如
app/process/Timer.php)里也能用,但该进程启动时不会自动重跑start.php,所以必须在进程类构造函数或handle()开头再次require_once一次,或统一改用 Composer autoload
别把 helper 当配置,也别让它变“脏”
helper 函数本质是工具,不是状态容器。最容易踩的坑是:在函数里偷偷修改全局变量、缓存、或直接操作 $_SESSION / $_COOKIE。
- 避免在
get_user_info()里调用file_put_contents()记日志——日志应该走Log::info()或标准输出,否则并发时容易锁死或覆盖 - 别让 helper 依赖
$request对象——它没传参进来,函数就不该隐式依赖当前请求上下文;需要请求数据的逻辑,应由调用方显式传入$request->get('id') - 如果函数返回值依赖环境(比如开发/生产返回不同格式),请通过
env('APP_ENV')判断,而不是硬编码或读取未声明的常量
真正麻烦的从来不是写几个函数,而是某天发现 str_limit() 在定时任务里返回空,在 HTTP 请求里却正常——大概率是加载路径没对上,或者进程没重启。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











