返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP 中的枚举
  • 308
分享到

PHP 中的枚举

2024-02-27 20:02:49 308人浏览 独家记忆
摘要

本教程将教你如何在 PHP 8.1 之前和之后使用 php 中的枚举。 原因是在 PHP 8.1 之前,你只能使用抽象类来模拟枚举。但是,从 PHP 8.1 开始,PHP 提供了对枚举的原生支持。

教程将教你如何在 PHP 8.1 之前和之后使用 php 中的枚举。

原因是在 PHP 8.1 之前,你只能使用抽象类来模拟枚举。但是,从 PHP 8.1 开始,PHP 提供了对枚举的原生支持。


在 PHP 中使用抽象类模拟枚举

在 PHP 8.1 之前,你可以使用抽象类来模拟枚举。由于枚举是将名称分配给整数常量,因此你可以创建一个包含常量值的抽象类。

你可以通过范围解析协议 :: 获取类外的每个常量值。

我们的下一个示例代码有一个包含类常量的抽象类。之后,我们通过范围解析协议调用其中一个常量。

这种方法有其局限性;我们将在下一节讨论它。


<?php
    abstract class CalenderMonths {
        const January 	= 1;
        const February 	= 2;
        const March 	= 3;
        const April 	= 4;
        const May 		= 5;
        const June 		= 6;
        const July		= 7;
        const August 	= 8;
        const September = 9;
        const October 	= 10;
        const November 	= 11;
        const December 	= 12;
    }

    $january = CalenderMonths::January;

    echo $january;
?>

输出:


1

在 PHP 中使用具有验证和更多常量值的抽象类来模拟枚举

这个例子建立在我们之前的例子之上。但是在这里,我们提出了一个改进的版本。

这个版本有验证,可以保存更多的常数值。此外,它还可以防止当你扩展类时,第一个扩展创建一个缓存,而另一个扩展仍然使用相同的缓存。

该代码块使用抽象类模拟枚举,并且它具有防止无效参数的验证。首先,我们定义抽象类。


<?php
    abstract class EmulatePHPEnum {
        private static $cache_array = NULL;

        private static function get_constants() {
            if (self::$cache_array == NULL) {
                self::$cache_array = [];
            }
            $called_class = get_called_class();
            if (!array_key_exists($called_class, self::$cache_array)) {
                $reflection_object = new ReflectionClass($called_class);
                self::$cache_array[$called_class] = $reflection_object->getConstants();
            }
            return self::$cache_array[$called_class];
        }

        public static function check_valid_name($name, $is_strict = false) {
            $constants = self::get_constants();

            if ($is_strict) {
                return array_key_exists($name, $constants);
            }

            $keys = array_map('strtolower', array_keys($constants));
            return in_array(strtolower($name), $keys);
        }

        public static function check_valid_value($value, $is_strict = true) {
            $values = array_values(self::get_constants());
            return in_array($value, $values, $is_strict);
        }
    }
?>

然后,我们扩展它并进行比较。


abstract class CalenderMonths extends EmulatePHPEnum {
	const January 	= 1;
	const February 	= 2;
	const March 	= 3;
	const April 	= 4;
	const May 		= 5;
	const June 		= 6;
	const July		= 7;
	const August 	= 8;
	const September = 9;
	const October 	= 10;
	const November 	= 11;
	const December 	= 12;
}

echo "<b>First check: </b> ";
if (CalenderMonths::check_valid_name("Nothing")) {
	echo "True";
} else {
	echo "False";
}

echo "<br />";

echo "<b>Second check: </b>";
if (CalenderMonths::check_valid_name("September")) {
	echo "True";
} else {
	echo "False";
}

echo "<br />";

echo "<b>Third check: </b>";
if (CalenderMonths::check_valid_name("september")) {
	echo "True";
} else {
	echo "False";
}

echo "<br />";

echo "<b>Fourth check: </b>";
if (CalenderMonths::check_valid_name("september", $is_strict = true)) {
	echo "True";
} else {
	echo "False";
}

echo "<br />";

echo "<b>Fifth check: </b>";
if (CalenderMonths::check_valid_name(23)) {
	echo "True";
} else {
	echo "False";
}

echo "<br />";

输出:


<b>First check</b>: False
<b>Second check</b>: True
<b>Third check</b>: True
<b>Fourth check</b>: False
<b>Fifth check</b>: False

使用 PHP enum 进行枚举

PHP 中枚举的定义是使用 enum 关键字后跟枚举名称和一组花括号。在这些大括号中,你可以定义案例。

我们在下一个代码块中提供一个示例。此外,我们在案例之间进行了一些比较检查。

请注意,你不能将枚举与小于或大于运算符进行比较。


<?php
    enum ProgrammingLanguages {
        case javascript;
        case PHP;
        case Ruby;
        case Erlang;
        case Elixir;
    }

    $javascript = ProgrammingLanguages::JavaScript;
    $js 		= ProgrammingLanguages::JavaScript;
    $erlang     = ProgrammingLanguages::Erlang;

    echo $javascript === $js;

    echo "<br/>";

    if ($javascript === $erlang) {
        echo "True";
    } else {
        echo "False";
    }

    echo "<br/>";

    if ($javascript instanceof ProgrammingLanguages) {
        echo "True";
    } else {
        echo "False";
    }

    echo "<br />";
    if ($javascript > $js || $javascript < $js) {
        echo "True";
    } else {
        echo "False";
    }
?>

输出:


1 <br />
False <br />
True <br />
False <br />

支持的 PHP 枚举

支持的枚举是枚举声明,后跟枚举中每种情况的数据类型。

在我们查看代码示例之前,请注意以下关于 PHP 中支持的枚举的以下内容。

  1. 为支持值定义值时,确保所有值都有支持值。
  2. 你应该在枚举名称之后声明支持值的类型。
  3. 枚举中的支持值是只读的。
  4. 如果你的枚举包含标量值,它们应该是唯一的。
  5. 支持的值应该是文字表达式或文字。
  6. 你可以使用语法 enum_name::backed_value 访问支持的值。其中 enum_name 是枚举名称,backed_value 是你要访问的值。
  7. 支持的枚举有一个称为 BackedEnum 的内部接口。这个接口有两个方法,fromtryFrom
  8. from 方法将抛出不存在值的异常。而 tryFrom 返回 null

以下代码显示了如何在 PHP 中使用支持的枚举。


<?php
    enum Age : int {
        case John 		= 23;
        case Martinez 	= 30;
        case Mary 		= 43;
        case Velasquez 	= 25;
    }

    $first_age = Age::tryFrom(23);

    if ($first_age) {
        echo "True";
    } else {
        echo "False";
    }

    echo "<br />";

    $second_age = Age::tryFrom(98);

    if ($second_age) {
        echo "True";
    } else {
        echo "False";
    }

    echo "<br />";

    $third_age = Age::from(42);
?>

输出:


True
False

<b>Fatal error</b>: Uncaught ValueError: 42 is not a valid backing value for enum "Age"

使用 PHP 中的方法支持枚举

支持的枚举可以有方法。结果,他们可以实现一个接口。

你将在下一个示例代码中找到一个示例。


<?php

    interface isTravel {
        public function calculate_travel_cost (int $distance_covered): int;
        public function isRequireFuel(): bool;
    }

    enum CarTypes: int implements isTravel {
        case Bughatti 		= 300;
        case Lamborghini 	= 500;
        case Ferrari 		= 450;
        case Audi 			= 350;

        public function calculate_travel_cost(int $distance_covered): int {
            return $this->value * $distance_covered;
        }

        public function isRequireFuel(): bool {
            return match($this) {
                CarTypes::Bughatti, CarTypes::Lamborghini, CarTypes::Ferrari => true,
            };
        }
    }

    $car = CarTypes::Bughatti;

    $does_it_require_fuel = $car->isRequireFuel();

    if ($does_it_require_fuel) {
        echo "True";
    } else {
        echo "False";
    }

    echo "<br />";

    $car_travel_cost = $car ->calculate_travel_cost(250);

    echo $car_travel_cost;
?>

输出:


True
75000

列出 PHP 中支持枚举的案例

如果你希望列出支持枚举的情况,可以通过名为 UnitEnum 的内部接口来完成。这个接口有一个定义为 UnitEnum::cases 的静态方法。

使用此接口,你可以检索枚举中的案例。你将在下面找到示例代码。


<?php
    interface isTravel {
        public function calculate_travel_cost (int $distance_covered): int;
        public function isRequireFuel(): bool;
    }

    enum CarTypes: int implements isTravel {
        case Bughatti 		= 300;
        case Lamborghini 	= 500;
        case Ferrari 		= 450;
        case Audi 			= 350;

        public function calculate_travel_cost(int $distance_covered): int {
            return $this->value * $distance_covered;
        }

        public function isRequireFuel(): bool {
            return match($this) {
                CarTypes::Bughatti, CarTypes::Lamborghini, CarTypes::Ferrari => true,
            };
        }
    }

    $car_names = CarTypes::cases();
    echo "<pre>";
    var_dump($car_names);
    echo "</pre>";
?>

输出:


<pre>
array(4) {
  [0]=>
  enum(CarTypes::Bughatti)
  [1]=>
  enum(CarTypes::Lamborghini)
  [2]=>
  enum(CarTypes::Ferrari)
  [3]=>
  enum(CarTypes::Audi)
}
</pre>

--结束END--

本文标题: PHP 中的枚举

本文链接: https://lsjlt.com/news/569169.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP 中的枚举
    本教程将教你如何在 PHP 8.1 之前和之后使用 PHP 中的枚举。 原因是在 PHP 8.1 之前,你只能使用抽象类来模拟枚举。但是,从 PHP 8.1 开始,PHP 提供了对枚举的原生支持。 ...
    99+
    2024-02-27
  • 【javaSE】 枚举与枚举的使用
    文章目录 🎄枚举的背景及定义⚾枚举特性总结: 🌲枚举的使用🚩switch语句🚩常用方法📌示例一Ὄ...
    99+
    2023-09-20
    java 开发语言 枚举 源码 反射
  • JAVA中的枚举(一)
    在实际编程中,往往存在着这样的“数据集”,它们的数值在程序中是稳定的,而且“数据集”中的元素是有限的。例如星期一到星期日七个数据元素组成了一周的“数据集”,春夏秋冬四个数据元素组成了四季的“数据集”。在Ja...
    99+
    2024-04-02
  • C#的枚举与位枚举怎么定义
    这篇文章主要介绍了C#的枚举与位枚举怎么定义的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C#的枚举与位枚举怎么定义文章都会有所收获,下面我们一起来看看吧。一、枚举的概念C# 枚举(Enum), 枚举类型是用于...
    99+
    2023-06-27
  • java枚举
    目录 1.枚举的简介 2.枚举的形式和常用方法 3.枚举中的构造方法 4.练习实例 1.枚举的简介 枚举就是相当于一种来存放常量的特殊的类,是一种新的常量定义方式,提供了安全检查功能,简而言之就是把常量搞的有对象的特性了,类型也是和类...
    99+
    2023-09-02
    java 开发语言
  • python 【枚举】
    枚举,枚举可以看成“一组常量的集合”,就是向一个类中添加若干个变量。 from enum import Enum class Week(Enum): #Week类继承Enum类 Mon = 1 Tue = ...
    99+
    2023-01-30
    python
  • 枚举类
    当需要定义常量时,一个办法是用大写变量通过整数来定义 好处是简单,缺点是类型是int,并且仍然是变量 Enum可以把一组相关常量定义在一个class中,且class不可变,而且成员可以直接比较,这样这些相关常量就不会变化了     使用...
    99+
    2023-01-31
  • Python 枚举
    1. 枚举的定义 首先,定义枚举要导入enum模块。 枚举定义用class关键字,继承Enum类。 用于定义枚举的class和定义类的class是有区别。 示例代码: from enum import Enum class ...
    99+
    2023-01-31
    Python
  • C#枚举类型与位域枚举Enum
    一、概述 定义一个值类型,其中包含固定值集合。枚举类型变量可以是此集合中的任意一个或多个值。 枚举使用enum关键字来声明,与类同级。 枚举本身可以有修饰符,但枚举的成员始终是公共的...
    99+
    2024-04-02
  • java中枚举类型定义和重写枚举的示例分析
    这篇文章将为大家详细讲解有关java中枚举类型定义和重写枚举的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。什么是枚举类型枚举类型(Enumerated Type) 很早就出现在编程语言中,它被用...
    99+
    2023-05-30
    java
  • C#枚举和枚举成员怎么使用
    这篇文章主要讲解了“C#枚举和枚举成员怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“C#枚举和枚举成员怎么使用”吧!C#枚举类型是一种的值类型,它用于声明一组命名的常数。(1)C#枚...
    99+
    2023-06-17
  • php如何实现枚举类型
    这篇文章主要介绍“php如何实现枚举类型”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php如何实现枚举类型”文章能帮助大家解决问题。枚举类型优点枚举类型在编程中有很多优点,如下:可读性高:枚举类型...
    99+
    2023-07-05
  • Python中使用枚举类
    开发中我们经常定义常量, 其实有更好的方法:为这样的枚举类型定义一个class类型,然后,每个常量都是class的一个唯一实例。Python中提供了Enum类来实现这个功能: from enum import Enum Numbers...
    99+
    2023-01-31
    Python
  • 详解Python中的枚举类型
    目录什么是枚举类型为什么要使用枚举如何使用枚举从字典创建枚举最后的话你好,我是 征哥,今天分享一下 Python 中的枚举类型,为什么需要枚举类型,及如何使用。 什么是枚举类型 枚举...
    99+
    2024-04-02
  • 怎么用好Java中的枚举
    本篇内容主要讲解“怎么用好Java中的枚举”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么用好Java中的枚举”吧!1、概览enum关键字在 java5 中引入,表示一种特殊类型的类,其总是继...
    99+
    2023-06-16
  • C++中的枚举如何使用
    这篇文章主要介绍了C++中的枚举如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++中的枚举如何使用文章都会有所收获,下面我们一起来看看吧。一、枚举是什么枚举(enumeration)类型用于存放用户指...
    99+
    2023-07-05
  • Java中的枚举怎么使用
    本篇内容主要讲解“Java中的枚举怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的枚举怎么使用”吧!枚举(enum)枚举是一个被命名的整型常数的集合,用于声明一组带标识符的常数...
    99+
    2023-07-05
  • Python中的枚举怎么实现
    这篇文章主要介绍了Python中的枚举怎么实现的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python中的枚举怎么实现文章都会有所收获,下面我们一起来看看吧。使用普通类直接实现枚举在Python中,枚举和我们...
    99+
    2023-07-05
  • c++11 实现枚举值到枚举名的转换问题
    目录效果关键技术__VA_ARGS__#__VA_ARGS__在函数外执行代码的能力模板函数的静态变量关键代码效果 ENUM_DEFINE ( Color, Red, ...
    99+
    2024-04-02
  • Golang中如何实现枚举
    ...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作