gpslab/enum

枚举实现的简单快捷方法

dev-master 2019-12-19 07:53 UTC

This package is auto-updated.

Last update: 2024-09-19 18:45:52 UTC


README

Latest Stable Version Total Downloads Build Status Coverage Status Scrutinizer Code Quality SensioLabs Insight StyleCI License

PHP 枚举

枚举实现的简单快捷方法

简介

定义

在计算机编程中,枚举类型(也称为 枚举enum)是一种数据类型,它由一组称为 元素、成员或枚举器的命名值组成。 —— 维基百科

SplEnum

SplEnum 没有集成到 PHP 中,您需要单独安装它

$ sudo pecl install SPL_Types.

此外,它并非万能良药

class Month extends SplEnum {
    const JANUARY  = 1;
    const FEBRUARY = 2;
}

class Fruit extends SplEnum {
    const APPLE  = 1;
    const ORANGE = 2;
}

// you must create new instance before each use:
$jan   = new Month(Month::JANUARY);
$jan2  = new Month(Month::JANUARY);
$apple = new Fruit(Fruit::APPLE);

var_dump($jan === $jan2);          // false
var_dump($jan === Month::JANUARY); // false
var_dump($jan ==  Fruit::APPLE);   // true

基准测试

PHP 7 上的枚举基准测试

$ tests/benchmark/enum.php 100000

 ------------------------------- ------------ --------------
  Test                            Memory Avg   Duration All
 ------------------------------- ------------ --------------
  Reflection enum                 1.52 KiB     1820 ms
  Reflection enum (no magic)      1.52 KiB     1718 ms
  Explicit enum                   0.71 KiB     959 ms
  myclabs/php-enum                0.68 KiB     1971 ms
  marc-mabe/php-enum              1.59 KiB     2219 ms
  marc-mabe/php-enum (no magic)   1.59 KiB     1969 ms
  happy-types/enumerable-type     1.81 KiB     2322 ms
 ------------------------------- ------------ --------------

PHP 7 上的集合基准测试

$ tests/benchmark/set.php 100000

 -------------------- ------------ --------------
  Test                 Memory Avg   Duration All
 -------------------- ------------ --------------
  Reflection set       1.36 KiB     1238 ms
  marc-mabe/php-enum   1.59 KiB     2861 ms
 -------------------- ------------ --------------

如何获取具有默认值的枚举?

final class Color extends ReflectionEnum implements EnumDefault
{
    const RED = 1;
    const GREEN = 2;
    const BLUE = 3;

    /**
     * @return Color
     */
    public static function byDefault()
    {
        return self::byValue(self::RED);
    }
}