必须用const写在start.php顶层定义全局常量;config/目录下php文件是返回数组的配置脚本,非顶层写const会报语法错误,define虽可执行但作用域受限且config()无法感知,故严禁在config/中定义常量。

Webman 项目里定义全局常量,必须用 const 写在顶层作用域;读取配置一律用 config() 函数,不能直接 require 或 file_get_contents 配置文件。
为什么不能在 config/ 文件里用 define() 或 const?
Webman 的 config/ 目录下所有 PHP 文件(如 config/app.php)本质是「返回数组的脚本」,不是用来定义常量的。它们被框架内部通过 require 加载并缓存,仅用于构建配置树。
- 在
config/app.php里写define('API_TIMEOUT', 5000)—— 这行代码会执行,但常量只在该文件作用域内有效,config()完全感知不到 - 在
config/app.php里写const DB_PORT = 3306—— 直接报Parse error: syntax error, unexpected 'const',因为 PHP 不允许在return前的非顶层位置声明const - 即使绕过语法错误把常量塞进去了,下次
config('app')返回的仍是数组,不会自动带上这些常量
全局常量该定义在哪?怎么用才安全?
常量必须定义在 Webman 项目启动前、且能被所有进程加载的位置。推荐唯一入口:项目根目录下的 start.php 文件顶部(<?php 之后第一行起)。
-
const APP_ENV = $_SERVER['APP_ENV'] ?? 'prod';—— 可以,但注意 CLI 环境下$_SERVER可能不全,建议加判空:const APP_ENV = $_ENV['APP_ENV'] ?? ($_SERVER['APP_ENV'] ?? 'prod'); -
const STORAGE_PATH = __DIR__ . '/storage';—— 推荐,路径类常量用__DIR__构造,避免硬编码和相对路径风险 - 不要在控制器或中间件里用
define()动态注册常量 —— 多进程下行为不可控,且重复定义在 PHP 7.4+ 会静默失败 - PHP 8.2+ 可加类型提示:
const int MAX_RETRY = 3;,但只是文档化,不校验运行时值
config() 函数的正确调用姿势和常见陷阱
config() 是 Webman 唯一推荐的配置访问方式,它背后有缓存、合并插件配置、支持点号嵌套等机制,比手动 require 安全得多。
-
config('database.connections.mysql.host')—— 正确,支持多层数组键访问 -
config('app.debug', false)—— 必须带默认值,否则配置缺失时返回null,可能引发未定义索引警告 -
config('route')—— 返回整个config/route.php数组,但注意这个文件通常由框架自动生成,不建议手动修改 - 不要
file_get_contents('config/app.php')再eval()或json_decode()—— 配置文件是 PHP 代码,不是 JSON,且eval()是严重安全隐患 - 不要
require 'config/app.php'手动加载 —— 绕过 Webman 配置合并逻辑,插件配置、环境覆盖都会失效
配置修改后不生效?先确认这三件事
Webman 是常驻进程框架,配置变更不会热加载。很多“不生效”问题其实卡在最基础的环节。
- 改的是
config/下的文件?不是runtime/或vendor/里的同名副本 - 改完是否执行了
php start.php restart?reload不管用,必须restart - CLI 启动时当前工作目录是否为项目根目录?
cd /path/to/webman && php start.php restart,否则__DIR__和路径解析会错乱
真正容易被忽略的是:常量一旦定义就无法重写,而 config() 的值在每次请求中都是从内存缓存读取的——所以改配置不重启,等于没改;在错误位置定义常量,等于白写。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











