PHP 常量:不可改变的值
什么是常量
常量是一个固定值,在脚本执行过程中不可改变。与变量的区别是:变量可以随时重新赋值,常量一旦定义就不能改变。
一、定义常量
使用 define()
<?php\n// define(常量名, 常量值, 是否大小写不敏感)\ndefine(''SITE_NAME'', ''绍大技术网'');\ndefine(''VERSION'', ''1.0.0'');\ndefine(''MAX_COUNT'', 100);\n\n// 访问常量\necho SITE_NAME; // 绍大技术网\necho constant(''SITE_NAME''); // 绍大技术网(通过字符串获取)\n?>
使用 const(PHP 5.3+)
<?php\nconst SITE_NAME = ''绍大技术网'';\nconst VERSION = ''1.0.0'';\nconst MAX_COUNT = 100;\n\n// const 可用于类内部定义类常量\nclass Config {\n const DEBUG = true;\n const DB_HOST = ''localhost'';\n}\necho Config::DEBUG; // 1\n?>
define vs const
const在编译时求值,define在运行时求值const更快,适合定义确定的值define可以用于条件语句内定义常量const不能用于类属性常量定义之外的类内部(要用const)
<?php\n// const 必须在文件最顶层定义(不能用 if 包裹)\nconst APP_NAME = ''MyApp'';\n\n// define 可以在条件语句内\nif ($env === ''production'') {\n define(''DEBUG'', false);\n} else {\n define(''DEBUG'', true);\n}\n?>
二、常量是否大小写敏感
<?php\n// 第三个参数 false(默认):区分大小写\ndefine(''SITE_NAME'', ''绍大技术网'', false);\necho SITE_NAME; // 正常\necho site_name; // 报错\n\n// 第三个参数 true:不区分大小写\ndefine(''AUTHOR'', ''小明'', true);\necho AUTHOR; // 正常\necho author; // 也正常\n?>
三、判断常量是否已定义
<?php\ndefine(''SITE_NAME'', ''绍大技术网'');\n\n// 检查常量是否已定义\nif (defined(''SITE_NAME'')) {\n echo SITE_NAME;\n}\n\n// 检查常量是否存在(变量用 isset(),常量用 defined())\nif (defined(''NOT_EXIST'')) {\n echo NOT_EXIST;\n} else {\n echo "常量未定义";\n}\n?>
四、预定义常量
PHP 内置了大量预定义常量:
<?php\n// 常用预定义常量\nPHP_VERSION; // PHP 版本,如 "8.2.10"\nPHP_OS; // 操作系统,如 "Linux"\nPHP_SAPI; // 服务器 API,如 "apache2handler"\n\n// 路径常量\n__FILE__; // 当前文件的完整路径\n__DIR__; // 当前文件所在目录(dirname(__FILE__))\n__LINE__; // 当前行号\n__FUNCTION__; // 当前函数名\n__CLASS__; // 当前类名\n__METHOD__; // 当前类::方法名\n__NAMESPACE__; // 当前命名空间\n\n// 魔术常量(值随上下文变化)\necho __FILE__; // /var/www/html/config.php\necho __DIR__; // /var/www/html\necho __LINE__; // 10(当前行号)\n?>
五、类常量
<?php\nclass Config {\n // 类常量用 const 定义\n const DEBUG = true;\n const DB_HOST = ''localhost'';\n const DB_PORT = 3306;\n const DB_NAME = ''myapp'';\n const VERSION = ''1.0.0'';\n\n // 静态属性也可以定义配置\n public static string $env = ''development'';\n}\n\n// 访问类常量\necho Config::DEBUG; // 1\necho Config::DB_HOST; // localhost\n\n// 在类外部访问\necho MyClass::VERSION;\n\n// 通过类常量获取所有配置\n$reflection = new ReflectionClass(Config::class);\n$constants = $reflection->getConstants();\nprint_r($constants);\n?>
六、常量与配置
<?php\n// 最佳实践:用常量存储配置\nconst DB_HOST = ''localhost'';\nconst DB_USER = ''root'';\nconst DB_PASS = ''password'';\nconst DB_NAME = ''myapp'';\nconst DB_CHARSET = ''utf8mb4'';\n\n// 数据库连接\ntry {\n $pdo = new PDO(\n sprintf(''mysql:host=%s;dbname=%s;charset=%s'', DB_HOST, DB_NAME, DB_CHARSET),\n DB_USER,\n DB_PASS\n );\n $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);\n} catch (PDOException $e) {\n die(''数据库连接失败:'' . $e->getMessage());\n}\n?>
七、const 与表达式(PHP 8+)
<?php\n// PHP 8.3+ 支持在 const 中使用表达式\nconst SUM = 1 + 2 + 3;\nconst MAX_VAL = 100;\nconst ITEMS = [1, 2, 3, MAX_VAL]; // PHP 7+ 支持数组常量\n\n// 使用 define 定义数组常量(PHP 7+)\ndefine(''COLORS'', [''红'', ''绿'', ''蓝'']);\necho COLORS[0]; // 红\n?>
总结
- 常量定义后不可改变,用
define()或const
const更快,但必须在顶层;define可条件定义- 检查常量是否存在用
defined()(不是isset())
__FILE__/__DIR__/__LINE__/__FUNCTION__/__CLASS__是魔术常量- 类常量用
const定义,通过ClassName::CONST_NAME访问