php怎样定义常量_php定义常量define与const【常量】

11次阅读

const 更适合定义常量——更简洁、支持命名空间与类内使用、编译期解析性能更优;define() 仅适用于运行时动态构造常量名,且存在命名、作用域和大小写等多重限制。

php怎样定义常量_php定义常量define与const【常量】

define() 和 const 哪个更适合定义常量?

绝大多数情况下,const 更推荐——它更简洁、支持命名空间、可被类内使用,且在编译期解析,性能略优。但 define() 是唯一能在运行时动态构造常量名的选项。

define() 的典型误用场景

常见错误是试图用 define() 定义带表达式的值,比如 define('MAX_RETRY', 3 + 2)——这本身合法,但容易让人误以为它能“延迟求值”。其实它和 const 一样,只执行一次赋值,不支持函数调用(如 define('NOW', time()) 在定义时就求值了,不是每次读取都刷新)。

  • 不能在类定义体外用 define() 创建类常量(必须用 const
  • 不能在命名空间声明后直接写 define('MyNSLOG_LEVEL', 'debug') —— php 会报错,因为 define() 不识别命名空间语法
  • 常量名若含非法字符(如空格、中划线),define() 允许字符串传入,但后续引用时无法用 My-CONST 这种写法,只能用 constant('My-CONST')

const 定义常量的三个层级差异

const 可用于全局、命名空间、类内部,但行为有关键区别

  • 全局作用域:直接写 const API_TIMEOUT = 5000;,等价于 define('API_TIMEOUT', 5000)
  • 命名空间内:必须加 Namespace 前缀,如
    namespace appConfig;
    const DB_HOST = 'localhost';

    ,此时完整名称是 AppConfigDB_HOST

  • 类内:写成
    class Config {
    const VERSION = '2.1';
    }

    ,访问需用 Config::VERSION,且支持 public/private 修饰(PHP 7.1+)

常量名大小写与访问陷阱

PHP 默认定义的是**区分大小写的常量**,但 define() 第三个参数设为 true 可创建大小写不敏感常量——这是极少见的用法,且有隐患:

立即学习PHP免费学习笔记(深入)”;

  • 不敏感常量无法用 const 语法定义
  • ide 和静态分析工具通常忽略这种模式,容易导致拼写错误不被发现
  • 调用 defined('DB_HOST')defined('db_host') 都返回 true,但 DB_HOST 直接使用时若拼错,仍会触发 notice(因为解析器按字面量找,不走不敏感逻辑)

真正该关注的是:所有常量一旦定义就不能修改或重定义,define() 重复定义会警告,const 重复定义直接 fatal Error。没有“重新定义”这回事。

text=ZqhQzanResources