>  기사  >  백엔드 개발  >  PHP 열거 유형의 관리 및 설계

PHP 열거 유형의 관리 및 설계

藏色散人
藏色散人앞으로
2020-02-13 13:42:543462검색

이 글의 구현은 주로 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제