jgswift/kenum

PHP 5.5+ 枚举模式实现

0.1.1 2014-09-11 02:48 UTC

This package is not auto-updated.

Last update: 2024-09-28 15:39:22 UTC


README

PHP 5.5+ 枚举模式实现

Build Status Scrutinizer Code Quality Latest Stable Version License Coverage Status

描述

Kenum 是一个简单的组件,用于使用常量提供枚举行为。
本包包括传统的枚举和位操作枚举。

安装

使用 composer 通过命令行安装

php composer.phar require jgswift/kenum:0.1.*

使用 composer 通过 composer.json 安装

{
    "require": {
        "jgswift/kenum": "0.1.*"
    }
}

依赖

  • php 5.5+

使用

默认基类

以下是一个基于 Kenum 的最小示例

<?php
class MyEnum extends kenum\Enum\Base {
    const Option1 = 'Option1';
    const Option2 = 'Option2';
}

$enum = new MyEnum(MyEnum::Option2);

// get current enum value with the value method or through string conversion
$value = $enum->value()  // Returns 'Option1'
$string = (string)$enum; // Returns 'Option1'

// check for equality
$equals = $enum->equals(MyEnum::Option2); // returns true
$equals = $enum->equals(new MyEnum(MyEnum::Option1)); // returns false

位操作

使用位标志作为值的位操作实现。位标志可以组合,允许一次设置多个标志。常量 必须 是2的倍数。一个示例集合可以是 1, 2, 4, 8, 16, 32 等。

<?php
class MyEnum extends kenum\Enum\Bitwise {
    const Option1 = 1;
    const Option2 = 2;
    const Option3 = 4;

    /* etc... */
}

$enum = new MyEnum(MyEnum::Option2 | MyEnum::Option3);

// get current enum value with the value method or through string conversion
var_dump($enum->value());  // Returns '6'
var_dump((string)$enum); // Returns 'Option2 Option3'

// check for equality
var_dump($enum->equals(MyEnum::Option2)); // returns false
var_dump($enum->equals(MyEnum::Option2 | MyEnum::Option3)); // returns true

// check for flag
var_dump($enum->hasFlag(MyEnum::Option2)); // returns true
var_dump($enum->hasFlag(MyEnum::Option1)); // returns false

常量标量表达式

从 PHP 5.6 开始,可以使用表达式来定义常量,这在概念上简化了它们,并且消除了手动硬编码每个值的需要。

class MyEnum extends kenum\Enum\Bitwise {
    const Option1 = 1;
    const Option2 = self::Option1 * 2; // 2
    const Option3 = self::Option2 * 2; // 4
    const Option4 = self::Option4 * 2; // 8
    /* etc... */
}

自定义枚举

使用枚举特性实现自定义枚举相对简单

class MyEnum {
    use kenum\Enum;

    function __construct($value) {
        /* store value(s) */
    }

    // custom equality check
    function equals($value) {
        /* check for equality */
    }

    function __toString() {
        /* transform enum value(s) into human-readable text */
    }
}