PHP 类常量详解:从入门到精通
一、类常量基础概念
✅ 什么是类常量?
类常量是类中定义的固定值,一旦定义就不能修改。
ini
class Math {
const PI = 3.1415926; // 圆周率
const E = 2.71828; // 自然对数的底
}
为什么用类常量?
- 避免"魔法数字"(如直接写 3.1415926)
- 集中管理配置值
- 提高代码可读性
二、基础语法与规则
✅ 1. 定义位置
csharp
class Config {
// ✅ 正确:类内部,方法外部
public const DB_HOST = 'localhost';
public function test() {
// ❌ 错误:不能在方法内部定义
// const LOCAL = 10;
}
}
✅ 2. 访问方式
php
echo Math::PI; // 输出 3.1415926
echo Config::DB_HOST;
三、可见性控制(PHP 7.1+)
类常量可以设置访问权限:
php
class ParentClass {
public const PUBLIC_CONST = '公开';
protected const PROTECTED_CONST = '受保护';
private const PRIVATE_CONST = '私有';
}
class ChildClass extends ParentClass {
public function show() {
echo self::PUBLIC_CONST; // ✅ 可访问
echo self::PROTECTED_CONST; // ✅ 可访问
// echo self::PRIVATE_CONST; // ❌ 不可访问
}
}
四、高级特性演进
✅ 1. 表达式支持(PHP 5.6+)
ini
class Math {
const PI = 3.1415926;
const HALF_PI = self::PI / 2; // ✅ 允许表达式
const DOUBLE_PI = 2 * self::PI;
}
限制:只能使用字面量和常量,不能用变量:
ini
$x = 10;
const BAD = $x + 5; // ❌ 错误
✅ 2. 数组常量(PHP 7.0+)
dart
class Config {
const DATABASE = [
'host' => 'localhost',
'port' => 3306,
'charset' => 'utf8mb4'
];
}
echo Config::DATABASE['host']; // 输出 localhost
✅ 3. 对象常量(PHP 8.1+)
php
class Service {
// ✅ 允许:对象作为类常量
const LOGGER = new FileLogger('app.log');
public function __construct(
// ✅ 允许:对象作为属性默认值
private Logger $logger = new NullLogger
) {}
}
五、动态访问类常量(重点)
✅ PHP 8.3+ 新特性:C::{$name}
语法
ini
class Status {
const PENDING = 'pending';
const PAID = 'paid';
const SHIPPED = 'shipped';
}
// PHP 8.3+ 写法
$state = 'PAID';
echo Status::{$state}; // 输出 paid
// 可以用表达式
$prefix = 'SHIPP';
echo Status::{$prefix . 'ED'}; // 输出 shipped
✅ PHP 8.3 之前的兼容写法
php
// 方法1:使用 constant() 函数
$state = 'PAID';
echo constant('Status::' . $state);
// 方法2:使用类名+常量名
echo constant(Status::class . '::' . $state);
// 方法3:反射(复杂场景)
$ref = new ReflectionClass(Status::class);
echo $ref->getConstant($state);
六、const 与 define()
的对比
特性 | const (类常量) |
define() (全局常量) |
---|---|---|
作用域 | 属于类 | 全局 |
命名空间 | 支持 | 支持(PHP 5.3+) |
值类型 | PHP 8.1+ 支持对象 | 只支持标量 |
动态访问 | PHP 8.3+ 支持 C::{$name} |
支持 constant($name) |
php
// 类常量
class App {
public const NAME = 'MyApp';
}
echo App::NAME;
// 全局常量
define('APP_VERSION', '1.0');
echo APP_VERSION;
七、常见错误与陷阱
❌ 错误1:在方法内部定义
csharp
class Test {
public function bad() {
const LOCAL = 10; // ❌ 错误
}
}
❌ 错误2:修改常量
ini
Math::PI = 3.14; // ❌ 致命错误
❌ 错误3:使用变量作为值
ini
$host = 'localhost';
class Config {
const DB_HOST = $host; // ❌ 错误
}
八、终极总结
版本 | 关键特性 |
---|---|
PHP 5.6+ | 支持表达式 |
PHP 7.0+ | 支持数组常量 |
PHP 7.1+ | 支持可见性控制 |
PHP 8.1+ | 支持对象常量 |
PHP 8.3+ | 支持 C::{$name} 动态访问 |
✅ 核心要点:
- 用
const
定义,不能修改- PHP 8.3+ 用
C::{$name}
动态访问- 优先使用类常量而非
define()
- 适合存储配置、状态、数学常数等固定值