php中常量能用::访问吗_类常量与作用域操作符使用场景【汇总】
技术百科
蓮花仙者
发布时间:2026-01-01
浏览: 次 类常量必须用::访问,普通常量(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,避免歧义。
类常量本身不参与命名空间解析 —— 它们属于类,而类名才是命名空间作用的对象。
# ai
# 是一个
# 才是
# 写了
# 重写
# 可在
# 绑定
# Error
# class
# 子类
# 字符串
# 接口
# 报错
# Static
# define
# lsp
# 作用域
# 命名空间
# php
# const
# 常量
# 父类
# undefined
# 会报
# 本类
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- Mac如何修复应用程序权限问题_Mac磁盘工具修复
- Win11怎么恢复出厂设置_Win11重置此电脑保
- mac怎么分屏_MAC双屏显示与分屏操作技巧【指南
- Win11怎么设置快速访问主页_Windows11
- Win11如何更新显卡驱动 Win11检查和安装设
- Win11怎么清理C盘下载文件夹_Win11清理下
- 如何使用Golang管理模块版本_Golanggo
- 如何使用Golang优化模块引入路径_Golang
- Windows10系统怎么查看设备管理器_Win1
- 如何使用Golang管理跨项目依赖_Golang多
- Win11文件扩展名怎么显示_Win11查看文件后
- 如何使用Golang操作指针变量_Golang解引
- Go 中 defer 语句在 goroutine
- 如何在Golang中指定模块版本_使用go.mod
- c# F# 的 MailboxProcessor
- 如何使用Golang实现基本类型比较_Golang
- Win11怎么查看显卡显存_查询Win11显卡详细
- Python网络异常模拟_测试说明【指导】
- Win11怎么关闭粘滞键_彻底禁用Windows
- Win11怎么设置系统还原_Windows11系统
- Drupal 中 HTML 链接被重复转义导致渲染
- 如何使用Golang实现微服务事件驱动_使用消息总
- Mac如何整理桌面文件_Mac使用堆栈功能一键整理
- 如何使用Golang sync.Map实现并发安全
- 新手学PHP架构总混淆概念咋办_重点梳理【教程】
- 如何使用Golang开发基础文件下载功能_Gola
- Win11玩游戏全屏闪退怎么办_Win11全屏优化
- Win10如何更改电脑休眠时间_Windows10
- Win10如何关闭安全中心所有通知 Win10禁用
- 本地php环境出现502错误_nginx或apac
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Go 语言标准库为何不提供泛型切片的 Contai
- MAC如何启用访达侧边栏显示_MAC Finder
- MAC怎么解压RAR格式文件_MAC第三方解压工具
- PHP 中如何在函数内持久化修改引用变量的指向
- 如何在 Go 后端安全获取并验证前端存储的 JWT
- 如何在Golang中实现CI/CD流水线自动化测试
- Win11系统占用空间大怎么办 Win11深度瘦身
- Win11怎么设置默认终端应用_Windows11
- Win10如何卸载预装Edge扩展_Win10卸载
- MySQL 中使用 IF 和 CASE 实现查询字
- Python lxml的etree和Element
- 如何在 Go 开发中正确处理本地包导入与远程模块路
- Win10 BitLocker加密教程 Win10
- Win11相机打不开提示错误怎么修_相机权限开启与
- Win10怎样卸载iTunes_Win10卸载iT
- Win11如何设置文件关联 Win11修改特定文件
- Windows家庭版如何开启组策略(gpedit.
- Mac怎么安装软件_Mac安装dmg与pkg文件的
- php转exe用什么工具打包快_高效打包软件推荐【

的常量(即使子类未重写)
QQ客服