php中没有预定义常量static,{__static__}是thinkphp6模板层的字符串占位符,需在config/view.php中通过tpl_replace_string配置映射路径,仅在模板渲染时生效,不可在php代码中直接使用或定义。

PHP 里没有叫 STATIC 的预定义常量,直接写 STATIC 会报 Undefined constant 'STATIC' 错误。 这是 ThinkPHP 新手最常踩的坑——把模板中用于路径替换的占位符(如 {__STATIC__})误当成 PHP 常量去用,结果解析器根本找不到定义。
ThinkPHP 6 的 {__STATIC__} 是模板替换字符串,不是 PHP 常量
在 ThinkPHP 6 中,{__STATIC__} 只是一个视图层的字符串占位符,靠 tpl_replace_string 配置驱动。它不会被 PHP 解析为常量,也不能在 PHP 代码里直接调用或拼接。
- 配置位置:修改
config/view.php中的'tpl_replace_string' => ['{__STATIC__}' => '/static'] - 模板中必须写成
<link href="%7B__STATIC__%7D/css/app.css">,不能写<link href="<?=%20STATIC%20?>/css/app.css"> - 如果写错成
STATIC(无大括号、无下划线),PHP 就当你要访问一个叫STATIC的常量,立刻报错 - 这个替换只在模板渲染时生效,PHP 控制器或模型里写
{__STATIC__}不起作用
ThinkPHP 5 的 __STATIC__(双下划线)是内置常量,但仅限于模板中自动识别
ThinkPHP 5.0.4+ 确实内置了 __STATIC__、__JS__、__CSS__ 等常量,但它们只在模板文件中被框架自动识别并替换,**不是 PHP 全局常量**,也不能在 PHP 代码中 echo __STATIC__;。
- 这些常量由框架底层在视图编译阶段注入,你无法在控制器里
var_dump(__STATIC__)—— 会报错 - 它们默认指向
/static,但实际映射路径取决于你的 Web 服务器根目录是否设在public/ - 若你改过
view_replace_str配置(比如加了'__PUBLIC__'=>'/static/admin'),那__STATIC__的行为可能被覆盖或失效 - 别试图用
define('__STATIC__', ...)手动重定义——框架已有逻辑,硬改会导致think\facade\View初始化失败
真正该用 asset() 的地方,别依赖 __STATIC__
__STATIC__ 是静态字符串替换,不带版本控制、不支持 CDN 切换、不感知构建哈希。要让资源防缓存或走 CDN,必须用 asset() 函数。
- 开发时开启
app_debug => true,{:asset('static/js/app.js')}会自动附加?v=1715215680时间戳 - 生产环境需配合 Webpack 的
mix-manifest.json或自定义哈希映射,否则asset('js/app.js')找不到app.abc123.js -
asset()默认输出相对路径;要上 CDN,必须在config/app.php中配'asset_host' => 'https://cdn.example.com'(协议必须写全) - 千万别在模板里混用:
{__STATIC__}/js/app.js和{:asset('static/js/app.js')}指向同一文件,但前者永远不更新,后者才可控
最容易被忽略的是:Web 服务器是否真的能访问到 public/static/ 下的文件。Nginx 没配 location ^~ /static/,Apache 没开 AllowOverride All,或者 Windows 上写了 /Static/ 而实际目录是 /static/,都会导致 404——这时查 PHP 配置毫无意义,问题压根不在框架侧。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











