当前位置: 首页 > news >正文

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

核心要点

  1. const 定义,不能修改
  2. PHP 8.3+ 用 C::{$name} 动态访问
  3. 优先使用类常量而非 define()
  4. 适合存储配置、状态、数学常数等固定值
http://www.dtcms.com/a/309620.html

相关文章:

  • RK3588实现wlan直连
  • Qt 开发 IDE 插件开发指南
  • 如何在UEFI SHELL下查看UEFI Driver
  • 洛谷P4479第K大斜率
  • OSPF笔记整理
  • Transformer架构全解析:搭建AI的“神经网络大厦“
  • 开箱即用的Next.js SSR企业级开发模板
  • 【性能测试】混合业务场景TPS+内存溢出定位分析+调优和分析(详情)
  • 猫眼浏览器:简约安全的 Chrome 内核增强版浏览器
  • 【JVM篇13】:兼顾吞吐量和低停顿的G1垃圾回收器
  • UniappDay06
  • wsl /lib/x86_64-linux-gnu/libc.so.6: version GLIBC_2.28‘ not found
  • 【Spring 】Spring Cloud Gateway 直连 Istio 服务网格深度集成方案
  • 使用uniapp开发小程序-【引入字体并全局使用】
  • 软件测试测评公司关于HTTP安全头配置与测试?
  • 07 连锁不平衡和群体结构分析原理
  • 理想I8对撞乘龙卡车,AI基于数学和物理的角度如何看?
  • 应急响应(windows工具版)
  • echarts一个图例控制多个图表
  • Git 进阶使用
  • ansible 在EE 容器镜像中运行
  • C primer plus (第六版)第十章 编程练习第7,8,9,10,11题
  • Linux基本服务——web服务解析
  • 如何管理数据足迹,实现SAP S/4HANA的无缝迁移
  • Solana: 逐行解读 solana-test-validator 输出, 本地节点日志完全指南
  • oracle备库主机断电重启后IO异常报错
  • 【C#学习Day16笔记】XML文件、 事件Event 、Json数据
  • Sqlserver备份恢复指南-完整备份恢复
  • 从零到英雄:掌握神经网络的完整指南
  • Qt Quick 自定义组件开发