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