PHP继承反射方法实现自定义枚举类正确获取子类常量的问题
问题原因
问题本质是PHP静态解析的优先级问题:self:: 关键字永远指向定义当前方法的类,也就是你编写getConstants方法的父类CustomEnum,因此反射拿到的永远是父类的常量,无法匹配子类的实际定义。
解决方法
使用PHP的**后期静态绑定(Late Static Binding)**特性,将代码中的self::替换为static::,static::会指向实际发起调用的类(也就是继承父类的子类)。同时你原有父类的getDisplayText方法写死了ModeOfTransport类,需要同步修改为动态调用。
后期静态绑定从PHP 5.3版本开始支持,符合适配旧版本PHP(低于8.1,无原生枚举)的需求。
修改后的完整父类代码
class CustomEnum { public static function getConstants() { // 用static::class替代self::class,获取实际调用的子类名 $oClass = new ReflectionClass(static::class); return $oClass->getConstants(); } public static function getValues(){ return static::getConstants(); } public static function getDisplayText(int $val){ // 替换为当前调用类的常量列表,不要写死固定类 $key = array_search($val, static::getConstants()); return $key; } }
子类代码无需修改
class DocumentMainType extends CustomEnum { const VehicleDocument = 0; const DriverDocument = 1; }
调用测试
$var = DocumentMainType::getConstants(); // 返回结果:{"VehicleDocument":0,"DriverDocument":1},符合预期
内容的提问来源于stack exchange,提问作者Skywarth
相关产品推荐
相关产品推荐

