PHP枚举类常量如何通过变量调用?现有写法报错求解决方案
解决PHP通过变量调用类常量的问题
嘿,这个场景我太熟悉了!咱们来一步步搞定这个问题~
首先,你尝试的DaysOfWeek::{$day}写法其实在PHP 5.4及以上版本是有效的,但如果报错,大概率是这几个原因:要么PHP版本太低,要么$day的值有拼写错误(类常量可是大小写敏感的哦),或者还有更稳妥的替代方法。
下面给你几种可靠的解决方案:
1. 兼容所有PHP版本的constant()函数
这是最通用的方法,不管你用的是哪个PHP版本,都能稳定工作。它接受一个包含完整常量名的字符串参数,直接返回对应的值:
abstract class DaysOfWeek { const Sunday = 0; const Monday = 1; // 其他星期常量... } $day = 'Sunday'; // 拼接类名和常量名,传入constant() $today = constant("DaysOfWeek::$day"); echo $today; // 输出 0
2. 确认PHP版本后使用动态访问语法
如果你的PHP版本在5.4及以上,DaysOfWeek::{$day}本身是合法的,这时候你需要检查两个点:
$day的值是不是严格等于'Sunday'(大小写完全一致,常量名的大小写不能错)- 有没有其他语法错误,比如变量名拼写失误
示例代码:
$day = 'Sunday'; // 确保PHP版本≥5.4 $today = DaysOfWeek::{$day}; echo $today; // 输出 0
3. PHP 8.1+推荐使用原生枚举
如果你用的是PHP 8.1或更高版本,完全可以抛弃抽象类定义常量的方式,改用PHP原生的枚举类型,不仅语法更规范,还自带很多实用方法:
// 带数值映射的枚举 enum DaysOfWeek: int { case Sunday = 0; case Monday = 1; // 其他星期枚举值... } $day = 'Sunday'; // 使用from()方法通过字符串获取枚举实例 $todayEnum = DaysOfWeek::from($day); // 获取对应的数值 $today = $todayEnum->value; echo $today; // 输出 0
原生枚举还会自动处理非法值的情况,如果$day是不存在的枚举名,会直接抛出ValueError,帮你提前发现错误。
最后再提醒一句:一定要注意常量名的大小写,比如如果$day是'sunday'(全小写),那不管哪种方法都会报错,因为你定义的常量是Sunday(首字母大写)。
内容的提问来源于stack exchange,提问作者bro Berg
相关产品推荐
相关产品推荐

