php 7.2 中用 define() 定义的全局常量默认跨脚本访问,但必须通过 include/require 显式引入定义文件;const 行为一致,均依赖文件加载机制,且不可 unset 或重定义。

PHP 7.2 中用 define() 定义的全局常量,**默认就能跨脚本访问**——前提是另一个脚本通过 include、require 或其变体(如 include_once)加载了定义它的文件。
为什么 require/include 是必须的
PHP 的常量作用域是“脚本生命周期内全局”,但不等于“所有文件自动共享”。常量不会像预定义常量(如 PHP_VERSION)那样被 PHP 引擎自动注入每个脚本。它只存在于被定义的那个脚本执行上下文中,以及所有被它直接或间接包含的脚本里。
-
define("DB_HOST", "localhost");写在config.php里 → 仅当其他脚本require "config.php";后,才能用DB_HOST - 如果只是把两个文件放在同一目录下,不显式引入,
DB_HOST在第二个脚本里会报Notice: Use of undefined constant DB_HOST - 命名空间不影响这种全局常量的可见性,但如果你用
define("App\Constants\LOG_LEVEL", "debug"),那调用时必须写全名App\Constants\LOG_LEVEL
define 和 const 跨脚本行为一致吗
一致。无论是 define("MODE", "prod") 还是 const MODE = "prod";,都依赖文件引入机制。区别在于:
-
const必须在顶层作用域(不能在函数/条件块里)声明,且不能动态生成常量名;define()支持define($name, $value)这种变量名方式 - PHP 7.2 不支持在类外部用
const定义数组常量(数组常量需 PHP 7.0+,但const FOO = [];在 7.2 是合法的;而define("FOO", [])也合法) - 两者定义后都不能被 unset 或重定义,重复调用
define("X", 1); define("X", 2);会触发Warning: Constant X already defined
常见错误:常量“明明定义了却用不了”
这类问题几乎都出在加载顺序或路径上:
- 拼错文件名:
require "configr.php";→ 找不到文件,常量自然没定义 - 相对路径失效:
require "inc/constants.php";在 CLI 下运行时,当前工作目录可能不是 Web 根目录,建议用__DIR__ . "/inc/constants.php" - 定义前就使用:在
config.php里先echo DB_HOST;再define("DB_HOST", ...)→ 报未定义 Notice - 用了
include但被前面的错误中断(比如语法错误),导致后续define()没执行
真正容易被忽略的是:常量一旦在某个请求周期里被 define() 成功,就不会再被重新定义——哪怕你多次 require 同一个配置文件。所以别指望靠反复引入来“刷新”常量值。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











