You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 00:36:04