首页 >后端开发 >php教程 > 正文

PHP 枚举类型的管理与设计

转载2020-02-13 13:42:5401647
本文的实现主要是基于 myclabs/php-enum 扩展包。

今天来分享下如何管理 PHP 的枚举类型。

一种常见的方式是,使用常量来代表枚举类型

const YES = '是';
const NO = '否';

可以在这个基础上更进一步,将其封装成类,以便于管理

class BoolEnum {
    const YES = '是';
    const NO = '否';
}

现在,我们希望能通过方法来动态调用对应的枚举类型

BoolEnum::YES(); // 是
BoolEnum::NO(); // 否

也可以批量获取枚举类型

BoolEnum::toArray(); // ['Yes' => '是', 'No' => '否']

下面来实现上面列举的功能。

定义基本的枚举基类,让所有的枚举类都继承该抽象基类。

abstract class Enum
{   
    // 获取所有枚举类型
    public static function toArray(){
        // 通过反射获取常量
        $reflection = new \ReflectionClass(static::class);
        $contants = $reflection->getConstants();
        // 返回对应的常量
        return $contants;
    }
    //  动态调用属性
    public static function __callStatic($name, $arguments)
    {
        $arr = static::toArray();
        if(isset($arr[$name])){
            return $arr[$name];
        }
        throw new \BadMethodCallException("找不到对应的枚举值 {$name}");
    }
}
class BoolEnum extends Enum
{
    const YES = '是';
    const NO = '否';
}

利用反射,可以获取到所有的枚举类型。同时,利用魔术方法则可以实现对属性的动态调用。这里要注意的是,反射会消耗较多的资源,因此,对 toArray 方法进行重构,增加一个缓存变量来缓存获取到的枚举类型,避免重复使用反射。

abstract class Enum
{   
    protected static $cache = [];
    public static function toArray(){
        $class = static::class;
        // 第一次获取,就通过反射来获取
        if(! isset(static::$cache[$class])){
            $reflection = new \ReflectionClass(static::class);
            static::$cache[$class] = $reflection->getConstants();
        }
        return static::$cache[$class];
    }
}

现在考虑更多的使用场景,比如用实例来代表特定枚举类型

$yes = new BoolEnum("是");
echo $yes; // "是"

实现如下

abstract Enum 
{
    protected $value;
    public function __construct($value)
    {   
        if ($value instanceof static) {
            $value = $value->getValue();
        }
        if(! $this->isValid($value)){
            throw new \UnexpectedValueException("$value 不属于该枚举值" . static::class);
        }
        $this->value = $value;
    }
    // 获取实例对应的键
    public function getKey(){
        return array_search($this->value, static::toArray(), true);
    }
    // 获取实例对应的值
    public function getValue()
    {
        return $this->value;
    }
    // 允许字符串形式输出
    public function __toString()
    {
        return $this->value;
    }
    // 验证值是否合法
    public function isValid($value)
    {
      $arr = static::toArray();
      return in_array($value, $arr, true);
    }
    // 验证键是否合法
    public function isValidKey($key)
    {
      $arr = static::toArray();
      return array_key_exists($key, $arr);
    }
}

这样做可避免用户使用非法的枚举类型的值

$user->banned = '非法值';  // 可能不会报错
$yes = new BoolEnum("非法值"); // 将会抛出异常
$user->banned = $yes;

或者作为参数类型限定

function setUserStatus(BoolEnum $boolEnum){
    $user->banned = $boolEnum;
}

PHP 作为一门弱类型语言,参数限定的不足会导致很多不可预期的错误发生,通过使用枚举类,我们进一步加强了参数限定的功能,同时,管理枚举类型也更加的方便统一。

以上就是PHP 枚举类型的管理与设计的详细内容,更多请关注php中文网其它相关文章!

php中文网最新课程二维码
  • 相关标签:PHP
  • 本文转载于:learnku,如有侵犯,请联系a@php.cn删除
  • 相关文章

    相关视频


    网友评论

    文明上网理性发言,请遵守 新闻评论服务协议

    我要评论
  • win10重置后打不开解决方法是:1、首先将系统置为光盘启动,进行修复安装;2、然后打开【本地用户和组工具】,选择【用户器】,置服务启动为【自动】;3、最后打开算机窗口,重新启动用户器即可

    2020-01-03

    352

    phpcms是一个网站内容系统,同时也是一个开源PHP开发框架;phpcms采用模块化开发,支持自定义内容模和会员模,并且可以自定义字段;使用phpcms可方便实现个性化网站、开发维护

    2019-12-30

    1021

    phpcms是开源。PHPCMS是一款网站内容系统,同时也是一个开源PHP开发框架。该软件采用模块化开发,支持多种分方式,使用它可方便实现个性化网站、开发维护。
    windows电脑连接共享打印机提示无法访问解决方法是:1、首先右键点击【算机】,选择【】,打开算机;2、然后打开【服务和应用程序】,打开【windows firewall】服务属性面板;
    PHPCMS不是用TP框架,PHPCMS是一款网站软件,同时也是一个开源PHP开发框架,该软件采用模块化开发,支持多种分方式,使用它可方便实现个性化网站、开发维护。
    PHPCMSMVC区别:PHPCMS是一款网站软件,该软件采用模块化开发,支持多种分方式,实现了个性化网站、开发维护;MVC是一种软件典范,用一种业务逻辑、数据、界面显示分离方法组织代码
    PHPCMS是完全免费开源,PHPCMS是一款网站软件,也是一个开源PHP开发框架,该软件采用模块化开发,支持多种分方式,使用该软件可方便实现个性化网站、开发维护。
    删除文件慢解决办法:首先返回到win7电脑桌面;然后找到算机图标并右键点击,选择选项;接着在打开算机窗口中,依次点击菜单中“服务和应用程序-服务”;最后将启动默认置更改为“自动
    北桥芯片决定了主板支持CPU和内存
    spss安装后打不开解决办法是:首先电脑桌面右键【算机】,点击【】;接着进入服务日志界面;然后找到【Windows Modules Installer】,并双击;最后【启动置为重启即可。
    ​微算机软件系统通常分为系统软件和应用软件;系统软件是指由算机生产厂或“第三方”为算机系统硬件和支持应用软件运行而提供基本软件;应用软件是指除了系统软件以外,利用算机为解决某问题而程序集合
    phpcms siteid指是phpcms子站id;phpcms可以实现一个后台多个独立子站,是一款网站软件;该软件采用模块化开发,支持多种分方式,使用它可方便实现个性化网站、开发维护
    PHPCMS可以做网站,PHPCMS是一款网站软件,该软件采用模块化开发,支持多种分方式,使用它可方便实现个性化网站、开发维护,该软件一般用于搭建政府、企业、学校官网。
    PHPCMS不是前后端分离,PHPCMS是一款网站软件,该软件采用模块化开发,支持多种分方式,使用它可方便实现个性化网站、开发维护,并且可以广泛满足各种规模网站需求。
    PHPCMS支持PHP7,在官方升级更新日志中已经说明了最新版支持“PHP5.5”、“PHP5.6”和“PHP7”,PHPCMS是一款网站软件,该软件采用模块化开发,支持多种分方式,使用它可方便实现个性化网站
    Go语言被成一门应用于搭载Web服务器,存储集群或似用途中央服务器系统编程语言。本文为大家介绍了使用go语言实现日志收集系统方法,包含实现原具体实现代码。
    解决win7提示不支持硬件方法是:1、首先打开控制面板,在【系统和安全】中选择【从不检查更新】;2、然后打开算机,点击服务,点击【windows update】服务;3、最后置启动为【禁用
    yii框架主要用于开发各种用PHP构建Web应用。Yii框架是一个通用Web编程框架,因为基于组件框架结构和精巧缓存支持,它特别适合开发大应用,如门户网站、社区、内容系统等。

    2020-05-30

    311

    phpcms是一款网站软件,该软件采用模块化开发,支持多种分方式,使用它可方便实现个性化网站、开发维护;它支持众多程序组合,可轻松实现网站平台迁移,并可广泛满足各种规模网站需求。
    php高性能接口方法:1、数据查询时对SQL语句进行优化,查询数据时精确字段名进行查询;2、对数据库进行优化,字段使用合,尽量置成not null避免空间浪费;3、代码优化,循环中避免查询操作

    专题推荐

    推荐视频教程
  • PHP文件基础操作PHP文件基础操作
  • PHP开发免费公益直播课PHP开发免费公益直播课
  • Thinkphp6.0正式版视频教程Thinkphp6.0正式版视频教程
  • PHP快速操控Excel之PhpSpreadsheetPHP快速操控Excel之PhpSpreadsheet
  • 视频教程分类