PHP 8.1 之前的枚举类型 您所在的位置:网站首页 枚举类型可以是字符串吗 PHP 8.1 之前的枚举类型

PHP 8.1 之前的枚举类型

2023-05-30 01:59| 来源: 网络整理| 查看: 265

涉及到代码的更好阅读体验,可以到我原站阅读:https://www.pilishen.com/posts/enums-before-php-81

枚举类型,简称“枚举”,是一种对命名值进行分类的数据类型。可以使用枚举代替硬编码字符串来表示,例如,以结构化和类型化的方式表示博客文章的状态。

PHP 8.1之前没有自带枚举类型,在8.1之前,如果我们要使用枚举类型,一个最佳实践是使用myclabs/php-enum这个扩展包。

在php 8.1里,就有了默认的enum class支持了,但是呢,估计很多人的php版本还是在8.1以下,所有了解一下8.1之前枚举类型方面的实践和原理,也是很有必要的,后续的文章里,我们再专门介绍php 8.1的enum class。

举个栗子:

class Post { 

// Post::$status:draft,published或archived    

public function setStatus(PostStatus $status): void    

{        

$this->status = $status;   

 } 

}

假设我们想着在存Post数据的时候,设置post实例的状态,这是很经典、很常见的日常操作。如果用了myclabs/php-enum包,我们可以这样写:

class PostStatus extends Enum {    const DRAFT = 'draft';    const PUBLISHED = 'published';    const ARCHIVED = 'archived'; }

我们可以像这样直接使用常量值:

class Post {    public function setStatus(string $status): void    {        $this->status = $status;    } } // … $post->setStatus(PostStatus::DRAFT);

但这会阻止我们进行正确的类型检查,因为任何字符串都可以传递给Post::setStatus(),更好的方法是使用这个库提供的方法:

class PostStatus extends Enum {    private const DRAFT = 'draft';    private const PUBLISHED = 'published';    private const ARCHIVED = 'archived'; } $post->setStatus(PostStatus::DRAFT());

虽然表面上好像不存在这个DRAFT()方法,但是它背后通过__callStatic()这个魔术方法,构建了一个PostStatus类的对象,它对应的值就是'draft'。

这样我们可以检查PostStatus的传参类型,并确保其值是“枚举”定义的三种状态之一。

但是,由于它背后是通过__callStatic()来实现,我们的IDE就没法进行静态分析了,在IDE自动完成提示或重构时可能就麻烦一些:

如上所示,IDE 不知道该PostsStatus::DRAFT()方法,我们又不得不通过代码块注释来解决:

/** * @method static self DRAFT() * @method static self PUBLISHED() * @method static self ARCHIVED() */ class PostStatus extends Enum {    private const DRAFT = 'draft';    private const PUBLISHED = 'published';    private const ARCHIVED = 'archived'; } $post->setStatus(PostStatus::DRAFT());

稍微有些麻烦,对吧,但是也会比直接在class里写很多的const要好不少,我知道很多小伙伴都是这么做的。

当然了,如果你是用的php 8.1,那么现在枚举类型已经默认支持了,而且更简单、更优雅,这个我们后续来讲,了解一下之前版本的一般实践,对于后续理解是有益的。

我是霹雳神,欢迎到我的技术站点pilishen.com做客,也欢迎到我们的公开群来玩:109256050(公开课@pilishen.com)



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有