直接 php script.php 会报 call to a member function on null,因裸脚本跳过 webman 启动流程,support/bootstrap.php 未执行,di 容器、配置、数据库等全未初始化;必须用 ./webman make:command 创建命令类,在 execute() 中直接调用 config()、db::table() 等。

直接 php script.php 会报 config() 未定义?
因为 Webman 的配置、数据库连接、容器等全靠 support/bootstrap.php 初始化,而这个文件只在框架启动流程(如 start.php 或 ./webman)中被加载。裸跑 PHP 脚本跳过了整个初始化链,config()、Db::table()、Log::info() 全部失效,常见错误是 Call to a member function get() on null。
- 别手动 require
bootstrap.php—— 它依赖start.php注入的全局上下文,硬引大概率出错 - 别用
php script.php启动自定义逻辑 —— 这不是 Webman 的运行模式,框架能力根本不可用 - 哪怕加了
autoload.php,没走bootstrap就等于没进 Webman 的门
必须走 webman/console 插件机制
Webman 官方唯一支持的命令行脚本方式,是通过 webman/console 插件注册 Symfony Console 命令类。框架会在执行时自动完成容器、配置、数据库连接等全部初始化。
- 生成命令:运行
./webman make:command db:backup,生成app/command/DbBackupCommand.php - 类必须继承
Symfony\Component\Console\Command\Command,且static $defaultName是字符串字面量(如'db:backup'),不能拼接或动态生成 -
execute()方法内可直接调用config('database')、Db::table('users')->get()、Log::info()等,无需任何手动初始化 - 参数获取统一用
$input->getArgument('name')或$input->getOption('force'),不要碰$argv
PhpStorm 调试自定义命令怎么配?
想在 IDE 里打断点调试命令,不能直接运行 PHP 文件,得让 PhpStorm 启动的是 ./webman 这个入口,并传入命令名。
- 菜单栏 → 运行 → 编辑配置 → 点 + → 选 PHP Script
-
Script path填项目根目录下的webman(注意没后缀,是可执行脚本) -
Interpreter options栏填命令全名,比如db:backup --force(不是php webman db:backup) - 勾选
Use script path as working directory,否则app/、config/路径解析失败 - 如需 Xdebug,Environment variables 中加
XDEBUG_MODE=debug(Xdebug 3+)
临时脚本真要快速跑怎么办?
开发调试阶段偶尔需要快速验证一段逻辑,又不想走完整命令注册流程,可以复用框架已初始化的上下文,但仅限 CLI 环境下临时使用:
- 新建
tmp/test.php,开头加:require_once __DIR__.'/../vendor/autoload.php';,然后手动触发 bootstrap:(new \Webman\Bootstrap())->bootstrap(); - 之后就能用
config()、app()等,但注意:这不是长期方案,不保证与正式命令行为一致 - 务必只用于本地调试,禁止提交到 Git 或用于生产环境
- Windows 下若报
pcntl_fork错误,说明当前 PHP CLI 不支持该扩展,应改用windows.php启动主服务,临时脚本也需适配
真正可靠的命令脚本,永远只有一条路:注册为 webman/console 命令。绕开它,迟早掉坑里——尤其是 config 加载失败、DB 连接为空、日志写不进文件这些“看似没报错实则功能残缺”的问题,最耗时间。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











