在PHP编程中,常量用于存储不会改变的值,而const是定义常量的核心关键字之一,很多新手开发者刚接触时容易混淆它的使用规则,尤其是不清楚它和define的区别,也不了解在类中定义常量的特殊要求。下面将系统讲解const的相关用法,帮你彻底掌握这个常用特性。

const基础语法与简单使用
const定义常量的基本语法非常简洁,常量名通常遵循大写字母加下划线的命名规范,定义后值无法被修改,也无法被重新定义。和变量不同,常量不需要在前面加$符号,其作用域是全局的,只要定义后,在脚本的任何位置都可以访问。
下面是简单的使用示例:
<?php // 定义普通常量 const SITE_NAME = "技术博客"; const MAX_UPLOAD_SIZE = 2097152; // 2MB对应的字节数 // 访问常量 echo SITE_NAME; // 输出:技术博客 echo MAX_UPLOAD_SIZE; // 输出:2097152 // 尝试修改常量会报错 // SITE_NAME = "新博客"; // 这行代码会触发错误 ?>
const和define的区别
很多开发者会疑惑,既然已经有define函数可以定义常量,为什么还要用const?两者确实都能定义常量,但存在不少差异,实际开发中需要根据场景选择:
| 对比维度 | const | define |
|---|---|---|
| 定义时机 | 编译阶段定义 | 运行阶段定义 |
| 是否支持表达式 | PHP 5.6+支持标量表达式,更早版本仅支持标量值 | 支持任意合法的表达式 |
| 类常量定义 | 可以在类中定义成员常量 | 无法在类中定义常量 |
| 作用域 | 全局作用域,不能在函数、条件语句、循环内定义 | 可以通过第三个参数设置是否区分大小写,可在函数等结构内定义 |
适用场景建议
- 如果是定义全局通用、值固定的常量,比如配置项、错误码,优先用const,性能更好
- 如果需要在条件判断中动态定义常量,或者要定义不区分大小写的常量,用define更合适
- 如果是类相关的固定属性,必须用const定义类常量
类中const的用法(类常量)
const最常用的场景之一是在类中定义类常量,这类常量属于类本身,不属于某个实例,所有实例共享同一个值,定义后不能被修改,也不能通过对象实例访问,只能通过类来访问。
具体用法示例如下:
<?php
class User {
// 定义类常量,表示用户状态
const STATUS_NORMAL = 1;
const STATUS_FROZEN = 2;
const STATUS_DELETED = 3;
// 类内部访问常量
public function getDefaultStatus() {
return self::STATUS_NORMAL;
}
}
// 类外部访问常量
echo User::STATUS_NORMAL; // 输出:1
$user = new User();
echo $user->getDefaultStatus(); // 输出:1
// 尝试修改类常量会报错
// User::STATUS_NORMAL = 4; // 触发错误
?>const使用的注意事项
使用const时需要注意以下几点,避免写出有问题的代码:
- const定义的常量名区分大小写,访问时必须和定义时的大小写完全一致
- 在命名空间中定义const,常量的作用域会受命名空间影响,访问时需要带上对应的命名空间前缀,除非使用了use语句引入
- PHP 5.6之前,const只能接受静态标量值,比如数字、字符串、布尔值,不能接受变量、函数返回值作为初始值;PHP 5.6及之后支持标量表达式,比如
const TOTAL = 10 + 20;是合法的 - 和define不同,const不能在条件语句、函数内部、循环结构中使用,只能在全局作用域或者类的内部定义
实际开发中的使用示例
下面是一个简单的配置类示例,展示const在实际项目中的常见用法:
<?php
// 数据库配置类
class DbConfig {
const DB_HOST = "127.0.0.1";
const DB_PORT = 3306;
const DB_NAME = "test_db";
const DB_USER = "root";
const DB_PASS = "root123";
// 生成数据库连接字符串
public static function getDsn() {
return "mysql:host=" . self::DB_HOST . ";port=" . self::DB_PORT . ";dbname=" . self::DB_NAME;
}
}
// 使用配置
$dsn = DbConfig::getDsn();
echo $dsn; // 输出:mysql:host=127.0.0.1;port=3306;dbname=test_db
?>通过上面的内容,相信你已经掌握了const的核心用法,在实际开发中合理使用常量,可以让代码更易读、更易维护,也能减少硬编码带来的问题。