php中::能用于枚举类吗_php8枚举静态成员访问规则【操作】
技术百科
絕刀狂花
发布时间:2025-12-31
浏览: 次 支持,但仅限于显式声明为 static 的属性或方法;枚举 case 是类型实例,通过 EnumName::CASE_NAME 访问属常量式命名访问,非静态调用,不可加括号或直接访问未定义属性。
PHP 8 中枚举类支持 :: 访问静态成员吗?
支持,但仅限于 static 声明的属性或方法,不支持直接用 :: 访问枚举案例(case)本身——枚举 case 是常量,不是静态成员,不能用 :: 调用。
如何正确访问枚举的 case 和静态成员?
枚举的每个 case 是该枚举类型的实例,必须通过 self::CASE_NAME(在内部)或 EnumName::CASE_NAME(在外部)引用,这不是「静态调用」,而是「常量式命名访问」;而真正需要 :: 的是显式声明的 static 成员:
-
Color::RED✅ 合法:访问枚举 case(语法糖,非静态调用) -
Color::$nameMap❌ 错误:未声明为static就不能用$+:: -
Color::getNameMap()✅ 合法:若该方法声明为public static -
Color::NONEXISTENT_CASE❌ 致命错误:Fatal error: Uncaught Error: Undefined class constant
常见错误:把 case 当成 static 方法调用
例如写 Color::RED() 或 Color::RED->value(没定义 value 属性时),会报错。PHP 枚举 case 不是函数,不能加括号;且只有启用了标量枚举(enum Color: string)并显式赋值后,才存在 ->value 或 ->name 属性。
enum Status: string
{
case Active = 'active';
case Inactive = 'inactive';
public static function all(): array
{
return [self::Active, self::Inactive];
}
}
// 正确
$status = Status::Active; // 类型是 Status 实例
echo $status->value; // 'active'
// 错误示例(运行时报错)
// Status::Active() // Fatal error: Uncaught Error: Call to undefined method
// Status::Active->foo // Notice: Trying to get property 'foo' of non-object(如果没定义 foo)
静态属性和方法必须显式声明 static
枚举中不能隐式拥有静态成员。所有需通过 :: 访问的变量或函数,都必须带 static 关键字,否则即使名字看起来像「静态」,也无法用作用域解析操作符调用。
- 未声明
static的属性(如public string $label)只能在实例上访问($instance->label) -
private static array $cache = [];才能写Status::getCache()或Status::$cache - PHP 8.2+ 支持只读静态属性(
public static readonly array $mapping),但仍需static修饰才能用::
则是编译期生成的类型实例;真正走 :: 路径的,永远只认明确定义的 static 成员——这点和普通类一致,但初学者容易被 Status::Active 的写法误导。
# 的是
# 则是
# 就不
# app
# 如何正确
# 不支持
# public
# Error
# String
# class
# 报错
# Static
# red
# private
# 作用域
# php
# php8
# enum
# 这不是
# 不能用
# 常量
# undefined
# Array
# 仍需
# 枚举类型
# 在内部
相关栏目:
<?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; ?>
】
相关推荐
- 如何在Golang中指定模块版本_使用go.mod
- 短链接还原php提示内存不足_调整PHP内存限制设
- Win11如何卸载OneDrive_Win11卸载
- 如何使用Golang管理模块版本_Golanggo
- Win11怎么恢复出厂设置_Win11重置此电脑保
- Win11资源管理器卡顿怎么办 Win11文件资源
- Win11怎么设置快速访问主页_Windows11
- Win10怎么查看内存时序参数_Win10CPU-
- Linux怎么禁止Root用户远程登录_Linux
- Win11怎么关闭自动维护 Win11禁用系统自动
- Win11怎么设置ipv4地址_Windows 1
- c++怎么用jemalloc c++替换默认内存分
- Python技术债务管理_长期维护解析【教程】
- c++20的std::format怎么用 比pri
- 如何使用Golang encoding/json解
- 如何使用正则表达式精确匹配最多含一个换行符的 st
- 如何有效拦截拼接式恶意域名的垃圾信息
- mac怎么看硬盘大小_MAC查看磁盘存储空间与文件
- Python如何创建带属性的XML节点
- C++如何使用std::async进行异步编程?(
- 如何在Golang中实现微服务负载均衡_Golan
- c++中如何使用auto关键字_c++11类型推导
- 如何使用Golang反射将map转换为struct
- php订单日志怎么按状态筛选_php筛选不同状态订
- Win11怎么关闭系统声音_Win11系统提示音静
- 如何在Golang中编写异步函数测试_Golang
- Windows10系统怎么查看显卡型号_Win10
- Win11怎么设置默认邮件应用_Windows11
- Windows Defender扫描失败怎么办_安
- Win11怎么关闭开机声音_Win11系统启动提示
- Windows10怎么卸载预装软件_Windows
- windows系统找不到无线网络怎么办_windo
- Windows10如何更改鼠标图标_Win10鼠标
- php能控制zigbee模块吗_php通过串口与c
- Windows 11如何查看系统激活密钥_Wind
- Win10如何备份驱动程序_Win10驱动备份步骤
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- 网站内页做seo排名怎么做?
- php485能和物联网模块通信吗_php485对接
- php文件怎么变mp4保存_php输出视频流保存为
- Win10怎么限制单程序CPU占用上限_Win10
- Win11怎么关闭VBS安全性_Windows11
- Win11输入法切换快捷键怎么改_Windows
- Python函数缓存机制_lru_cache解析【
- 如何在Golang中实现自定义Benchmark_
- Win11怎么解压RAR文件 Win11自带解压功
- 如何在Golang中操作嵌套切片指针_Golang
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- c++如何用AFL++进行模糊测试 c++ Fuz
- 如何使用正则表达式批量替换重复的 *- 模式为固定

QQ客服