PHP 类常量详解:从入门到精通
PHP 类常量详解:从入门到精通
一、类常量基础概念
✅ 什么是类常量?
类常量是类中定义的固定值,一旦定义就不能修改。
class Math { const PI = 3.1415926; // 圆周率 const E = 2.71828; // 自然对数的底 }
为什么用类常量?
- 避免"魔法数字"(如直接写 3.1415926)
- 集中管理配置值
- 提高代码可读性
二、基础语法与规则
✅ 1. 定义位置
class Config { // ✅ 正确:类内部,方法外部 public const DB_HOST = 'localhost'; public function test() { // ❌ 错误:不能在方法内部定义 // const LOCAL = 10; } }
✅ 2. 访问方式
echo Math::PI; // 输出 3.1415926 echo Config::DB_HOST;
三、可见性控制(PHP 7.1+)
类常量可以设置访问权限:
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+)
class Math { const PI = 3.1415926; const HALF_PI = self::PI / 2; // ✅ 允许表达式 const DOUBLE_PI = 2 * self::PI; }
限制:只能使用字面量和常量,不能用变量:
$x = 10; const BAD = $x + 5; // ❌ 错误
✅ 2. 数组常量(PHP 7.0+)
class Config { const DATABASE = [ 'host' => 'localhost', 'port' => 3306, 'charset' => 'utf8mb4' ]; } echo Config::DATABASE['host']; // 输出 localhost
✅ 3. 对象常量(PHP 8.1+)
class Service { // ✅ 允许:对象作为类常量 const LOGGER = new FileLogger('app.log'); public function __construct( // ✅ 允许:对象作为属性默认值 private Logger $logger = new NullLogger ) {} }
五、动态访问类常量(重点)
✅ PHP 8.3+ 新特性:C::{$name} 语法
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 之前的兼容写法
// 方法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) |
// 类常量 class App { public const NAME = 'MyApp'; } echo App::NAME; // 全局常量 define('APP_VERSION', '1.0'); echo APP_VERSION;
七、常见错误与陷阱
❌ 错误1:在方法内部定义
class Test { public function bad() { const LOCAL = 10; // ❌ 错误 } }
❌ 错误2:修改常量
Math::PI = 3.14; // ❌ 致命错误
❌ 错误3:使用变量作为值
$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()- 适合存储配置、状态、数学常数等固定值
更多推荐

所有评论(0)