类常量必须用::访问,普通常量(define或全局const定义)不可用::,否则报错;::左侧须为类/接口/trait名称或可变类名,支持self、static、parent及命名空间限定名。
:: 访问,普通常量不能用PHP 中只有 class 定义的常量(即类常量)才支持用作用域操作符 :: 访问;而通过 define() 或 const 在全局作用域定义的常量,**不能**用 ::,否则会报 Fatal error: Uncaught Error: Undefined class constant。
常见错误写法:
define('API_TIMEOUT', 30);
echo API_TIMEOUT::class; // ❌ 错误:不是类,没有 :: 操作符
echo API_TIMEOUT::API_TIMEOUT; // ❌ 同样报错
正确做法是直接使用常量名:
echo API_TIMEOUT; // ✅ 输出 30
:: 只能用于类、接口、trait 的常量和静态成员作用域操作符 :: 的左侧必须是一个有效的「命名空间限定名称」或「类/接口/trait 名称」,不能是变量、表达式或字符串(除非用 ClassName::CONST_NAME 这种字面量形式)。
MyClass::MY_CONST ✅ 正确,类名字面量 + 常量名$class = 'MyClass'; $class::MY_CONST ✅ PHP 5.3+ 支持“可变类名”语法self::MY_CONST ✅ 在类内部访问自身常量static::MY_CONST ✅ 支持后期静态绑定(LSP),子类重写时指向实际调用类parent::MY_CONST ✅ 访问父类定义的常量(即使子类未重写)注意:self 和 static 行为不同 —— self 是编译时绑定,static 是运行时绑定。若子类覆盖了同名常量,self:: 仍返回父类值,static:: 返回子类值。
类常量从 PHP 5.6 开始支持表达式(如 1 ),但依然不支持函数调用或变量;PHP 7.1+ 引入 private/protected 类常量(此前所有类常量默认 public)。
定义示例:
class Config {
const MODE = 'prod';
public const VERSION = '2.1.0';
protected const DEBUG = false;
private const SECRET_SALT = 'abc123';
public function show() {
echo self::MODE; // ✅ OK
echo static::VERSION; // ✅ OK(public 可被继承访问)
echo self::DEBUG; // ✅ OK(protected 允许类内访问)
// echo self::SECRET_SALT; // ❌ Fatal error:private 常量不可在类外访问,包括本类方法中?等等——实际上可以!✅ 正确:private 类常量可在定义它的类内部任意位置访问,包括方法中。
}
}
外部访问限制:
Config::MODE ✅ public,允许Config::DEBUG ❌ protected,报 Cannot access protected const
Config::SECRET_SALT ❌ private,报 Cannot access private const
带命名空间的类,必须用完全限定名或 use 导入后使用别名,否则 :: 无法解析。
错误写法(未导入且未写全路径):
use My\Package\Foo; // ... echo Foo::BAR; // ✅ OK(已 use) echo \My\Package\Foo::BAR; // ✅ OK(全限定名) echo Package\Foo::BAR; // ❌ 缺少根命名空间 \,会被当成相对命名空间
特别注意:如果当前文件有命名空间声明(如 namespace App;),而你写了 Foo::BAR 且没 use,PHP 会尝试在 App\Foo 下找类,而不是全局 Foo。
建议统一用全限定名或显式 use,避免歧义。
类常量本身不参与命名空间解析 —— 它们属于类,而类名才是命名空间作用的对象。
# php
# ai
# 作用域
# lsp
# Static
# 常量
# define
# 命名空间
# 父类
# 子类
# Error
# const
# 字符串
# 接口
# class
# undefined
# 绑定
# 可在
# 重写
# 报错
# 会报
# 是一个
# 才是
# 本类
# 写了
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
php485能和物联网模块通信吗_php485对接NB-IoT模块实例【说明】
Win11蓝牙开关不见了怎么办_Win11蓝牙驱动丢失修复教程【方法】
Windows10电脑怎么设置虚拟内存_Win10高级系统设置性能
Win11时间怎么同步到原子钟 Win11高精度时间同步设置【指南】
php485在php5.6下能用吗_php485旧版本兼容性问题说明【详解】
Win11怎么更改系统语言_Win11中文语言包下载与安装【指南】
Win11怎么关闭定位服务_保护Win11位置隐私设置指南【详解】
Python随机数生成_random模块说明【指导】
如何提升Golang JSON序列化性能_Golang JSON编码效率优化方法
Win11怎么开启游戏工具栏_Windows11 Xbox Game Bar快捷键
Win11怎么关闭定位服务 Win11禁止应用获取位置信息【隐私】
Windows10怎么查看系统激活状态_Windows10激活状态查看方法【教程】
Win11此电脑不在桌面上_Windows 11桌面图标设置找回【步骤】
Windows怎样关闭锁屏广告_Windows关闭锁屏广告方法【教程】
Python大文件处理策略_内存优化说明【指导】
如何在Golang中实现WebSocket广播_使用Channel和协程分发消息
VSC怎么快速定位PHP错误行_错误追踪设置法【方法】
windows 10应用商店区域怎么改_windows 10微软商店切换地区方法
Win11怎么开启远程桌面_Win11系统远程桌面启用开关
如何高效删除 NumPy 二维数组中所有元素相同的列
如何使用Golang实现微服务状态监控_Golang服务运行状态采集方法
Python数据抓取合法性_合规说明【指导】
如何在 Go 中正确反序列化 XML 多节点数组(解决仅解析首个元素的问题)
如何在Golang中使用container/heap实现堆_Golang container/heap最小堆方法
Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】
php下载安装后swoole扩展怎么安装_异步框架支持【汇总】
Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】
Win11怎么查看wifi信号强度_检测Windows 11无线网络质量方法【详解】
Windows7如何安装系统镜像_Windows7系统安装教程【步骤】
c++输入输出流 c++ cin与cout格式化输出【方法】
如何在 Django 中安全修改用户密码而不使会话失效
Win11截图快捷键是什么_Win11自带截图工具使用技巧【汇总】
mac本地php环境如何开启curl_curl扩展启用与测试步骤详解【汇总】
PHP 中如何在函数内持久化修改引用变量的指向
Windows10如何删除恢复分区_Win10 Diskpart命令强制删除分区
如何正确访问 Laravel 模型或对象的属性而非调用不存在的方法
XAMPP 启动失败(Apache 突然停止)的终极排查与修复指南
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
Win11怎么恢复出厂设置_Win11重置此电脑保留文件方法【详解】
如何在Golang中处理数据库事务错误_回滚和日志记录
如何用正则表达式精确匹配“start”到“end”之间最多含一个换行符的文本段
Windows10电脑怎么设置电源按钮_Win10按电源键关机或休眠
Python并发安全问题_资源竞争说明【指导】
Python字符串操作教程_切片拼接与格式化详解
Win11怎么更改文件夹图标_自定义Win11文件夹外观样式【详解】
Win11怎样安装企业微信_Win11安装企业微信教程【步骤】
Windows怎样拦截WPS弹窗广告_Windows拦截WPS弹窗广告设置【步骤】
Python音视频处理高级项目教程_FFmpegPydub剪辑与特效
MAC如何启用访达侧边栏显示_MAC Finder偏好设置与常用目录添加【教程】
PythonGIL机制理解_多线程限制解析【教程】
2026-01-01
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。