PHP 类常量详解:从入门到精通

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} 动态访问

核心要点

  1. const 定义,不能修改
  2. PHP 8.3+ 用 C::{$name} 动态访问
  3. 优先使用类常量而非 define()
  4. 适合存储配置、状态、数学常数等固定值
相关推荐
郑州光合科技余经理42 分钟前
基于PHP:海外版同城O2O系统多语言源码解决方案
java·开发语言·git·spring cloud·uni-app·php·uniapp
计算机毕设匠心工作室1 小时前
【python大数据毕设实战】全面皮肤病症状数据可视化分析系统、Hadoop、计算机毕业设计、包括数据爬取、数据分析、数据可视化、机器学习、实战教学
后端·python·mysql
摆烂工程师2 小时前
2025年12月最新的 Google AI One Pro 1年会员教育认证通关指南
前端·后端·ai编程
qq_12498707532 小时前
基于SpringBoot+vue的小黄蜂外卖平台(源码+论文+部署+安装)
java·开发语言·vue.js·spring boot·后端·mysql·毕业设计
代码与野兽2 小时前
AI交易,怎么让LLM自己挑选数据源?
前端·javascript·后端
天天摸鱼的java工程师2 小时前
JDK 25 到底更新了什么?这篇全景式解读带你全面掌握
java·后端
非鱼feiyu3 小时前
自关联数据表查询优化实践:以 Django + 递归 CTE 构建树结构为例
数据库·后端·django
零日失眠者3 小时前
这5个Python库一旦掌握就离不开
后端·python
幌才_loong3 小时前
.NET8 × Redis 实战宝典:从配置到落地,搞定高并发缓存就这篇!
后端·.net
用户8356290780513 小时前
如何使用 Python 从 Word 文档中批量提取表格数据
后端·python