PHP 매 거 진 ENUM 의 실현

9999 단어 phpenum매 거
개술
이 문 서 를 읽 을 때 매 거 진 기본 개념 을 알 고 있다 고 가정 하 십시오.그렇지 않 으 면 문서 의 일부 내용 에 대해 곤 혹 스 러 워 할 수도 있다.매 거 진 은 항목 마다 사 용 될 수 있 으 며,PHP 에 서 는 매 거 진 대신 상수 나 정적 변 수 를 사용 합 니 다.그러나 속성 간 에 조합 이나 관련 관계 가 존재 하 는 복잡 한 상황 에서 매 거 진 을 사용 하면 개발 과 유지 비용 을 크게 낮 출 수 있다.PHP 공식 적 으로 SPL 라 이브 러 리 를 통 해 매 거 진 클래스SplEnum를 제공 하 였 으 나,우선 확장 방식 으로 설치 해 야 하 며,그 다음 에 다시 포장 해 야 잘 사용 할 수 있 습 니 다.이 매 거 진 클래스 는 참고JAVA 매 거를 통 해 간단 하고 사용 하기 쉽 지만 기능 이 강 한 매 거 진 라 이브 러 리 를 실현 했다.
설치 하 다.
composer require phpenum/phpenum

문서.
매 거 진 을 정의 할 때 Public 또는 proctected 를 통 해 수 정 된 const 키워드 의 상수 만 매 거 진 클래스 로 인식 되 며,그 중에서 Public 는 생략 할 수 있 습 니 다.모든 매 거 진 유형 은 추상 적 인 유형 이 고 매 거 진 구조 방식 은 보 호 를 받 기 때문에 실례 화 할 수 없고 매 거 진 유형 이 제공 하 는 방법 으로 매 거 진 사례 를 얻 을 수 밖 에 없다.PHP 의 부동 소수점 형식 정밀도 에 영향 을 받 아 매 거 진 속성 이 부동 소수점 형식 값 을 포함 할 때 이 부동 소수점 형식 비 교 를 기반 으로 하거나 찾 은 결 과 를 신뢰 해 서 는 안 됩 니 다.자세 한 내용 은부동 소수점 정밀도 설명같은 매 거 진 대상 에 같은 매 거 진 상수 치 를 포함 할 때 정의 와 사용 과정 에서 접 두 사 를 사용 하여 그룹 을 나 누 어 사용 해 야 합 니 다.그렇지 않 으 면 같은 매 거 진 상수 치 를 비교 하거나 찾 은 결 과 를 신뢰 해 서 는 안 됩 니 다.
  • 기초 매 거 진소스 코드테스트 용례
  • 기본 매 거 진 은 단일 값 형식 매 거 진 입 니 다.매 거 진 종 류 는 매 거 진 상수 값 에 대해 강제 적 인 형식 으로 제약 하지 않 았 지만 각 조 의 매 거 진 상수 값 의 유형 을 항상 같 게 해 야 합 니 다.기본 매 거 진 에서 모든 getter 방법 은 get 을 생략 했 습 니 다.이것 은 하위 클래스 가 getter 를 실현 하기 위해 예약 한 것 입 니 다.
    기초 매 거 는 다음 과 같은 방법 을 제공 하 였 다.
    name                :        
    value               :       
    equals              :                 
    nameEquals          :                  
    valueEquals         :                
    names               : 【    】         ,        ,         ,            
    values              : 【    】        ,        ,         ,         ,            
    enums               : 【    】         ,        ,         ,         ,            
    hasName             : 【    】          ,         ,            
    hasValue            : 【    】           ,         ,            
    byName              : 【    】            ,         ,            
    byValue             : 【    】             ,         ,            
    count               : 【    】         ,         ,            

    다음은 사용자 매 거 진 을 정의 하 는 예 를 들 어 기본 매 거 진 용법 을 소개 합 니 다.다음 사용자 매 거 진 에는 사용자 의 성별 과 상태 두 그룹의 매 거 진 상수 값 이 포함 되 어 있 으 며 각각 SEX 와 STATUS 접 두 사 를 사용 합 니 다.
    /**
     * @method static self SEX_MAN
     * @method static self SEX_WOMAN
     * @method static self STATUS_NORMAL
     * @method static self STATUS_INVALID
     */
    class UserEnum extends \PhpEnum\Enum
    {
        const SEX_MAN = 1; // 1     
        const SEX_WOMAN = 2; // 2     
        const STATUS_NORMAL = 1; // 1      
        const STATUS_INVALID = 9; // 9      
    }
    

    아래 의 방법 을 통 해 매 거 진 대상 을 얻 을 수 있 습 니 다.매 거 진 대상 은 처음 만 든 후에 캐 시 됩 니 다.다시 임의의 방법 으로 매 거 진 대상 을 얻 을 수 있 습 니 다.첫 번 째 방식 은 효율 이 가장 높 고 추천 합 니 다.
    UserEnum::SEX_MAN(); //        ,                 ,    
    UserEnum::byName('SEX_MAN'); //          ,                 ,        
    UserEnum::byValue(1,'SEX'); //             ,                    ,        
    UserEnum::enums('SEX')['SEX_MAN']; //             ,                    ,        
    
  • 리스트 매 거 진소스 코드테스트 용례
  • 목록 매 거 진 은 기본 매 거 진 에 계승 되 어 있 으 며,다 중 값 은 배열 요 소 를 통 해 이 루어 집 니 다.따라서 매 거 진 상수 값 의 유형 은 배열 로 정의 되 어야 하 며,배열 의 길이 도 목록 매 거 진 종류의 length 방법 으로 지정 해 야 합 니 다.목록 매 거 진 은 매 거 진 상수 의 모든 배열 요소 에 하나의 개인 속성 을 캐리어 로 정의 한 다음 에 목록 매 거 진 클래스 를 다시 쓰 는 ListEnum 방법 으로 받 아들 인 데이터 요 소 를 고정 속성 으로 분배 합 니 다.보통list을 사용 하여 분 배 됩 니 다.목록 매 거 진 은 모든 캐리어 속성 에 getter 방법 을 제공 해 야 하지만,setter 방법 을 제공 하여 매 거 진 구조 가 파괴 되 는 것 을 방지 해 서 는 안 됩 니 다.목록 매 거 진 은 기본 매 거 진 모든 방법 을 계승 하 였 으 나,목록 매 거 진 상수 값 의 유형 이 배열 이기 때문에,value Equals values hasValue by Value 등 매 거 진 상수 값 을 사용 하 는 방법 은 큰 의미 가 없습니다.
    목록 매 거 는 다음 과 같은 방법 을 제공 합 니 다.
    ListEnum            :          ,         ,      
    length              :【    】              ,      

    다음은 도시 매 거 진 을 예 로 들 어 목록 매 거 진 용법 을 소개 합 니 다.다음 도시 매 거 진 상수 길 이 는 3 이 고 성 코드,도시 코드,도시 이름 을 포함 합 니 다.
    /**
     * @method static self PROVINCE_LIAONING
     * @method static self CITY_BEIJING
     * @method static self CITY_SHENYANG
     * @method static self CITY_DALIAN
     */
    class CityEnum extends \PhpEnum\ListEnum
    {
        const PROVINCE_LIAONING = ['0', '22000', 'Liaoning'];
        const CITY_BEIJING = ['110000', '110000', 'Beijing'];
        const CITY_SHENYANG = ['22000', '210100', 'Shengyang'];
        const CITY_DALIAN = ['22000', '210200', 'Dalian'];
        private $province;
        private $city;
        private $name;
        protected final function ListEnum($list)
        {
            list($this->province, $this->city, $this->name) = $list;
        }
        public final static function length()
        {
            return 3;
        }
        public function getProvince()
        {
            return $this->province;
        }
        public function getCity()
        {
            return $this->city;
        }
        public function getName()
        {
            return $this->name;
        }
    }
    

    도시 매 거 속성 값 가 져 오기
    CityEnum::PROVINCE_LIAONING()->getProvince(); // string(1) "0"
    CityEnum::PROVINCE_LIAONING()->getCity(); // string(5) "22000"
    CityEnum::PROVINCE_LIAONING()->getName(); // string(8) "Liaoning"
    

    도시 의 모든 성과 도 시 를 각각 획득 하 다.
    
    CityEnum::enums('PROVINCE'); //         
    CityEnum::enums('province', false); //         
    
    CityEnum::enums('CITY'); //         
    CityEnum::enums('city', false); //         
    
  • 배열 매 거 진소스 코드테스트 용례
  • 배열 매 거 진 은 목록 매 거 진 에 계승 되 고 두 번 째 값 유형 매 거 진 입 니 다.배열 매 거 진 상수 치 는 항상 두 개의 요소 가 있 습 니 다.첫 번 째 요 소 는 key 이 고 두 번 째 요 소 는 value 입 니 다.배열 매 거 진 에서 value 의 미 는 더 이상 매 거 진 상수 값 이 아니 라 상수 값 의 두 번 째 요소 입 니 다.value Equals hasValue by Value 이러한 계승 과 기본 매 거 진 방법 은 모두 재 작성 되 었 고 상수 값 의 두 번 째 요 소 를 value 로 사용 합 니 다.
    배열 은 다음 과 같은 방법 을 매 거 했다.
    getKey              :                
    getValue            :                
    keyEquals           :                         
    valueEquals         :                         
    getKeys             : 【    】                 ,        ,         ,            
    getValues           : 【    】                 ,        ,         ,            
    getEnums            : 【    】           ,        ,         ,            
    hasKey              : 【    】                  ,         ,            
    hasValue            : 【    】                  ,         ,            
    byKey               : 【    】                    ,         ,            
    byValue             : 【    】                    ,         ,            

    다음은 통 일 된 형식 오류 코드 를 예 로 들 어 배열 이 매 거 진 용법 을 소개 합 니 다.다음 오류 코드 매 거 진 에서 key 는 오류 코드 이 고 value 는 오류 설명 입 니 다.
    /**
     * @method static self OK
     * @method static self UNKNOWN_ERROR
     * @method static self ERROR_DATA_VALIDATION
     * @method static self ERROR_USER_INVALID
     * @method static self ERROR_CONFIG_ERROR
     */
    class ErrorCodeEnum extends \PhpEnum\ArrayEnum
    {
        const OK = ['0', 'ok'];
        const UNKNOWN_ERROR = ['99999', 'Unknown error'];
        const ERROR_DATA_VALIDATION = ['10000', 'The given data was invalid'];
        const ERROR_USER_INVALID = ['20000', 'User credentials was invalid'];
        const ERROR_CONFIG_ERROR = ['30000', 'Config info is error'];
    }
        

    아래 의 방식 을 통 해 오류 코드 와 오류 설명 정 보 를 얻 을 수 있 습 니 다.
    ErrorCodeEnum::OK()->getKey(); // string(1) "0"
    ErrorCodeEnum::OK()->getValue(); // string(2) "ok"
    

    통 일 된 형식 오류 코드 를 되 돌려 주 려 면 이상 클래스 를 사용자 정의 해 야 합 니 다.
    class ApiException extends Exception
    {
        private $data;
        public function __construct(ErrorCodeEnum $enum, $data = '')
        {
            parent::__construct($enum->getValue(), $enum->getKey());
            $this->data = $data;
        }
        public function toArray()
        {
            return [
                'code' => $this->getCode(),
                'msg' => $this->getMessage(),
                'data' => $this->data
            ];
        }
    }
    

    실패 결 과 를 되 돌 릴 때 사용자 정의 이상 을 던 지고 오류 코드 를 지정 합 니 다.
    throw new ApiException(ErrorCodeEnum::ERROR_DATA_VALIDATION());
    // {"code":10000,"msg":"The given data was invalid","data":""}
    
    throw new ApiException(ErrorCodeEnum::ERROR_USER_INVALID(),'This is data');
    // {"code":20000,"msg":"User credentials was invalid","data":"This is data"}
    

    성공 한 결 과 를 되 돌려 주 려 면 따로 정의 해 야 합 니 다.
    return [
        'code' => ErrorCodeEnum::OK()->getKey(),
        'msg' => ErrorCodeEnum::OK()->getValue(),
        'data' => '',
    ];
    // {"code":"0","msg":"ok","data":""}

    좋은 웹페이지 즐겨찾기