当前位置: 首页 > 后端技术 > PHP

如何在PHP中实现枚举?

时间:2023-03-29 18:49:49 PHP

鑷粠PHP8.1鍙戝竷鍚庯紝PHP鍘熺敓鎻愪緵浜嗘灇涓炬敮鎸併€傜幇鍦ㄤ笉鍐嶆帹鑽愪笅闈㈢殑鏂规硶銆傚缓璁弬鑰冨畼鏂规灇涓炬柟妗堛€傛灇涓惧湪鏁板鍜岃绠楁満绉戝鐞嗚涓紝闆嗗悎鐨勬灇涓炬槸鍒楀嚭鏌愪釜鏈夐檺搴忓垪闆嗙殑鎵€鏈夋垚鍛樻垨鐗瑰畾绫诲瀷瀵硅薄鐨勮鏁扮殑杩囩▼銆傝繖涓ょ绫诲瀷缁忓父锛堜絾涓嶆€绘槸锛夐噸鍙犮€傛灇涓炬槸鍛藉悕鏁存暟甯搁噺鐨勯泦鍚堛€傛灇涓惧湪鏃ュ父鐢熸椿涓緢甯歌銆傛瘮濡備唬琛ㄦ槦鏈熺殑SUNDAY銆丮ONDAY銆乀UESDAY銆乄EDNESDAY銆乀HURSDAY銆丗RIDAY銆丼ATURDAY灏辨槸涓€涓灇涓俱€?Wikipedia涓婁竴绡囨枃绔犺浜哖HP涓殑绫诲瀷绾︽潫锛岃繖娆℃垜浠瀹為檯搴旂敤銆傚湪涓氬姟鍦烘櫙鐨勫疄闄呭紑鍙戣繃绋嬩腑锛屾垜浠緢瀹规槗鎺ヨЕ鍒版灇涓剧被鍨嬶紝浣嗘槸鐢变簬PHP鍘熺敓瀵规灇涓剧殑鏀寔涓嶆槸寰堝ソ锛屾墍浠ュ紑鍙戣€呭線寰€涓嶅叧娉ㄦ灇涓剧殑浣跨敤锛岃€屾槸浣跨敤鍏ㄥ眬甯搁噺鎴栬€卌lasses鏀逛负甯搁噺锛岃€屼笖杩欎袱涓暟鎹師鍒欎笂杩樻槸瀛楃涓诧紝涓嶈兘鐢ㄤ簬绫诲瀷鍒ゆ柇銆備笟鍔○煂拌鍗曠姸鎬乸endingpayment/pendingdelivery/pendingdelivery/pendingevaluation浼氬憳鐘舵€佹縺娲?鍋滅敤...绛夌瓑锛屽緢澶氭椂鍊欐垜浠細鐢ㄧ畝鍗曠殑1/2/3/4鎴栬€?/1鐨勬柟寮忔潵琛ㄧず锛岀劧鍚庢寚瀹氳繖浜涗笢瑗垮湪鏂囨。鎴栬瘎璁轰腑銆傛洿楂樼骇鐨勬槸瀹氫箟涓哄父閲忥紝鐒跺悗鏂逛究缁熶竴璁块棶锛屼絾鏄父閲忕殑鍊间粛鐒舵槸瀛楃涓诧紝鏃犳硶杩涜绫诲瀷鍒ゆ柇銆傝繖閲岄渶瑕佺湅涓€涓婸HP瀵规灇涓剧殑鏀寔銆傝櫧鐒禤HP瀵规灇涓剧殑鏀寔杩樹笉瀹屽杽锛屼絾鏄湪SPL涓繕鏄湁涓€涓熀鏈殑鏋氫妇绫汇€係PL鏋氫妇SplEnumextendsSplType{/Constants/constNULL__default=NULL;/method/publicgetConstList([bool$include_default=FALSE]):array/inheritedmethod/SplType::__construct([mixed$initial_value[,bool$strict]])}浣嗘槸锛佽繖闇€瑕侀澶栧畨瑁匬ECL鏉ュ畨瑁呭甫鏈塒ECL鐨凷pl_Types锛屾棤鎰忎腑澧炲姞浜嗕娇鐢ㄦ垚鏈€傝繕鏈夊叾浠栬В鍐冲姙娉曞悧锛熺瓟妗堟槸鑲畾鐨勩€傜洿鎺ュ啓涓€涓€傚紑濮嬪噯澶囷紝棣栧厛璁剧疆涓€涓灇涓剧被Enum{//榛樿鍊糲onst__default=self::WAIT_PAYMENT;//绛夊緟浠樻constWAIT_PAYMENT=0;//绛夊緟浜や粯constWAIT_SHIP=1;//寰呮敹鎹甤onstWAIT_RECEIPT=2;//TobeevaluatedconstWAIT_COMMENT=3;}杩欐牱濂藉儚灏卞畬鎴愪簡锛屾垜浠彲浠ョ洿鎺ヤ娇鐢‥num::WAIT_PAYMENT鏉ヨ幏鍙栭噷闈㈢殑鍊硷紝浣嗘槸鍦ㄤ紶鍙傜殑鍦版柟鏃犳硶楠岃瘉銆俧unctionsetStatus(Enum$status){//TODO}setStatus(Enum::WAIT_PAYMENT);//Error鏄剧劧杩欐槸涓嶅彲鎺ュ彈鐨勶紝鍥犱负涓婇潰甯搁噺鐨勫€兼槸涓€涓猧nt锛屼笉鏄疎num绫诲瀷銆傝繖閲岄渶瑕佺敤鍒癙HP闈㈠悜瀵硅薄涓殑涓€涓濂囨柟娉昣_toString()public__toString(void)锛歴tring__toString()鏂规硶鐢ㄤ簬褰撶被琚綋浣滃瓧绗︿覆鏃跺浣曞搷搴斻€備緥濡俥cho$obj;搴旇鏄剧ず涓€浜涗笢瑗裤€傛鏂规硶蹇呴』杩斿洖涓€涓瓧绗︿覆锛屽惁鍒欏皢鍙戝嚭E_RECOVERABLE_ERROR绾у埆鐨勮嚧鍛介敊璇€傜幇鍦ㄨ鎴戜滑鏀硅繘杩欎釜鏂规硶銆俢lassOrderStatusextendsEnum{//榛樿鍊糲onst__default=self::WAIT_PAYMENT;//绛夊緟浠樻constWAIT_PAYMENT=0;//绛夊緟浜や粯constWAIT_SHIP=1;//寰呮敹鎹甤onstWAIT_RECEIPT=2;//绛夊緟璇勪及constWAIT_COMMENT=3;鍏叡鍔熻兘__toString(){杩斿洖'233';}}//objectechogettype($orderStatus).PHP_EOL;//booleantruevar_dump($orderStatusinstanceofEnum);//233echo$orderStatus;濂藉儚瀹炵幇浜嗕竴閮ㄥ垎锛岄偅涔堝簲璇ユ€庝箞璁╀粬鍋氬緱鏇村ソ鍛紵璁╂垜浠噸鏂板埗浣滃畠銆俢lassOrderStatusextendsEnum{//榛樿鍊糲onst__default=self::WAIT_PAYMENT;//寰呬粯娆綾onstWAIT_PAYMENT=0;//寰呭彂璐onstWAIT_SHIP=1;//绛夊緟鏀惰揣constWAIT_RECEIPT=2;//绛夊緟璇勪环constWAIT_COMMENT=3;/***@varstring*/protected$value;鍏叡鍑芥暟__construct($value=null){$this->value=is_null($value)?鑷垜锛氾細__榛樿鍊硷細$鍊硷紱}publicfunction__toString(){return(string)$this->value;}}//1锔忊儯$orderStatus=newOrderStatus(OrderStatus::WAIT_SHIP);//objectechogettype($orderStatus).PHP_EOL;//booleantruevar_dump($orderStatusinstanceofEnum);//1echo$orderStatus.PHP_EOL;//2锔忊儯$orderStatus=newOrderStatus();//objectechogettype($orderStatus).PHP_EOL;//booleantruevar_dump($orderStatusinstanceofEnum);//0echo$orderStatus;//3锔忊儯$orderStatus=newOrderStatus('鎰忓鐨勫弬鏁?);//objectechogettype($orderStatus).PHP_EOL;//甯冨皵鍊紅ruevar_dump($orderStatusinstanceofEnum);//鎰忓鍙傛暟echo$orderStatus;杩欐鎴戜滑娣诲姞浜嗕竴涓瀯閫犲嚱鏁帮紝璁╀粬浼犲叆涓€涓彲閫夊€硷紝鐒跺悗浣滀负__toString鏂规硶鐨勮緭鍑哄€硷紝杩欐鐪嬭捣鏉ヤ笉閿欙紝鍔熻兘宸茬粡瀹炵幇浜嗐€傚鏋滀紶鍏ョ殑鍙傛暟绗﹀悎鎴戜滑鐨勯鏈燂紝濡傛灉涓嶇鍚堟€庝箞鍔烇紵鐪嬶紝3锔忊儯澶勫凡缁忓彉鎴愭剰澶栦簡銆傛湁浠€涔堝姙娉曞彲浠ヨˉ鏁戝悧锛熺瓟妗堝綋鐒舵槸鑲畾鐨勩€傝繖閲屾垜浠鐢ㄥ埌PHP鐨勫彟涓€涓ソ涓滆タ锛屽弽灏勭被銆傚綋鐒讹紝杩欎笉鏄疨HP鐙湁鐨勶紝鍏朵粬璇█涔熸湁銆傚綋鐒讹紝闄や簡鍙嶅皠锛屾垜浠繕浼氬湪鍙︿竴涓笢瑗夸腑浣跨敤__callStatic鏂规硶锛屾柟娉曢噸杞姐€傝繘涓€姝ublicstatic__callStatic(string$name,array$arguments):mixed鍦ㄩ潤鎬佷笂涓嬫枃涓皟鐢ㄤ笉鍙闂殑鏂规硶鏃讹紝灏嗚皟鐢╛_callStatic()銆?name鍙傛暟鏄璋冪敤鐨勬柟娉曠殑鍚嶇О銆?arguments鍙傛暟鏄竴涓灇涓炬暟缁勶紝鍖呭惈瑕佷紶閫掔粰鏂规硶$name鐨勫弬鏁般€傜户缁敼閫犮€傜被鏋氫妇{const__default=null;/***@varstring*/protectedstatic$value;//娉ㄦ剰鏋勯€犲嚱鏁扮殑淇グ绗︽敼涓簆rotected锛屽嵆澶栭儴涓嶈兘鐩存帴newprotectedfunction__construct($value=null){//婕備寒濂楄矾self::$value=is_null($value)?闈欐€?:__榛樿鍊硷細$鍊硷紱}/***@param$name*@param$arguments*@returnmixed*@throwsReflectionException*/publicstaticfunction__callStatic($name,$arguments){//瀹炰緥鍖栦竴涓弽灏勭被static::class鏉ユ寚鏄庤皟鐢ㄨ€?reflectionClass=newReflectionClass(static::class);//杩欓噷蹇呴』鏈変釜绾﹀畾锛屽氨鏄被Constant鐨勬垚鍛樺悕蹇呴』澶у啓銆?/杩欓噷鏄彇鍒板苟璋冪敤鐨勯潤鎬佹柟娉曞悕瀵瑰簲鐨勫父閲忓€笺€傝繖閲岃櫧鐒舵湁getValue鏂规硶//浣嗘槸鍥犱负瀹冪殑杩斿洖鍊间笉鍙潬锛屾垜浠緷璧栧畠鍘熸潵闅愬惈鐨刜_toString鏂规硶鏉ュ府鎴戜滑杈撳嚭瀛楃涓层€傝兘銆?constant=$reflectionClass->getConstant(strtoupper($name));//鑾峰彇璋冪敤鑰呯殑鏋勯€犲嚱鏁?construct=$reflectionClass->getConstructor();//Makeitaccessible鍥犱负鎴戜滑璁剧疆淇グ绗︿负杩欓噷鐨刾rotected闇€瑕佽闂紝鎵€浠ラ渶瑕佽缃负鍙闂€?construct->setAccessible(true);//鍥犱负绫荤幇鍦ㄦ槸鍙闂殑锛屾墍浠ユ垜浠彲浠ョ洿鎺ュ疄渚嬪寲瀹冦€傚疄渚嬪寲鍚庯紝PHP浼氳嚜鍔ㄨ皟鐢╛_toString鏂规硶杩斿洖鏈熸湜鍊笺€?static=newstatic($constant);杩斿洖$闈欐€侊紱}publicfunction__toString(){return(string)self::$value;}}classOrderStatusextendsEnum{//榛樿鍊糲onst__default=self::WAIT_PAYMENT;//绛夊緟浠樻constWAIT_PAYMENT=0;//寰呭彂璐onstWAIT_SHIP=1;//寰呮敹鎹甤onstWAIT_RECEIPT=2;//绛夊緟璇勪及constWAIT_COMMENT=3;}$WAIT_SHIP=OrderStatus::WAIT_SHIP();var_dump($WAIT_SHIP.'');var_dump($WAIT_SHIPinstanceofEnum);鍒拌繖閲屼竴涓畝鍗曠殑鏋氫妇绫诲氨瀹屾垚浜嗐€傞偅涔堝鏋滄垜浠繕鏈夊叾浠栭渶姹傦紝姣斿鍒ゆ柇涓€涓€兼槸鍚﹀湪鏋氫妇鑼冨洿鍐呭憿锛熻幏鍙栨墍鏈夋灇涓惧€硷紵鑾峰彇鎵€鏈夋灇涓鹃敭骞跺垽鏂灇涓鹃敭鏄惁鏈夋晥锛熻嚜鍔ㄦ牸寮忓寲鈥滃洜涓篲_toString鏂规硶鍙厑璁歌繑鍥炲瓧绗︿覆锛屼絾鏈夋椂鎴戜滑寮哄埗闇€瑕乸lastic锛宐ool绛夌被鍨嬧€漜lassEnum{const__default=null;/***@varstring*/protectedstatic$value;/***@varReflectionClass*/protectedstatic$reflectionClass;//娉ㄦ剰鏋勯€犲嚱鏁扮殑淇グ绗︽敼涓簆rotected锛屽嵆澶栭儴涓嶈兘鐩存帴newprotectedfunction__construct($value=null){//寰堝父瑙勭殑self::$value=is_null($value)?闈欐€?:__榛樿鍊硷細$鍊硷紱}/***@param$name*@param$arguments*@returnmixed*/publicstaticfunction__callStatic($name,$arguments){//瀹炰緥鍖栦竴涓弽灏勭被static::class浠ユ寚绀鸿皟鐢ㄨ€?reflectionClass=self::鑾峰彇鍙嶅皠绫?);//杩欓噷瑕佹湁涓害瀹氾紝灏辨槸绫诲父閲忔垚鍛樼殑鍚嶅瓧蹇呴』澶у啓銆?/杩欓噷鏄彇鍒板苟璋冪敤鐨勯潤鎬佹柟娉曞悕瀵瑰簲鐨勫父閲忓€笺€傝繖閲岃櫧鐒舵湁getValue鏂规硶//浣嗘槸鍥犱负瀹冪殑杩斿洖鍊间笉鍙潬锛屾垜浠緷璧栧畠鍘熸潵闅愬惈鐨刜_toString鏂规硶鏉ュ府鎴戜滑杈撳嚭瀛楃涓层€傝兘銆?constant=$reflectionClass->getConstant(strtoupper($name));//鑾峰彇璋冪敤鑰呯殑鏋勯€犲嚱鏁?construct=$reflectionClass->getConstructor();//Makeitaccessible鍥犱负鎴戜滑璁剧疆淇グ绗︿负杩欓噷鐨刾rotected闇€瑕佽闂紝鎵€浠ラ渶瑕佽缃负鍙闂€?construct->setAccessible(true);//鍥犱负绫荤幇鍦ㄦ槸鍙闂殑锛屾墍浠ユ垜浠彲浠ョ洿鎺ュ疄渚嬪寲瀹冦€傚疄渚嬪寲鍚庯紝PHP浼氳嚜鍔ㄨ皟鐢╛_toString鏂规硶杩斿洖鏈熸湜鍊笺€?static=newstatic($constant);杩斿洖$闈欐€侊紱}/***瀹炰緥鍖栦竴涓弽灏勭被*@returnReflectionClass*@throwsReflectionException*/protectedstaticfunctiongetReflectionClass(){if(!self::$reflectionClassinstanceofReflectionClass){self::$reflectionClass=newReflectionClass(static::鐝骇锛?}returnself::$reflectionClass;}/***@returnstring*/publicfunction__toString(){return(string)self::$value;}/***鍒ゆ柇涓€涓€兼槸鍚︽湁鏁堬紝鍗虫槸鍚︿负鏋氫妇鎴愬憳鐨勫€?@param$val*@returnbool*@throwsReflectionException*/publicstaticfunctionisValid($val){returnin_array($val,self::toArray());}/***灏嗘灇涓炬垚鍛樿浆鎹负閿€煎杈撳嚭*@returnarray*@throwsReflectionException*/publicstaticfunctiontoArray(){returnself::getEnumMembers();}/***鑾峰彇鏋氫妇鐨勫父閲忔垚鍛樻暟缁?@returnarray*@throwsRereflectionException*/publicstaticfunctiongetEnumMembers(){returnself::getReflectionClass()->getConstants();}}/***鑾峰彇鏋氫妇鎴愬憳鍊兼暟缁?@returnarray*@throwsReflectionException*/publicstaticfunctionvalues(){returnarray_values(self::toArray());}/***鑾峰彇鏋氫妇鎴愬憳閿暟缁?@returnarray*@throwsReflectionException*/publicstaticfunctionkeys(){returnarray_keys(self::getEnumMembers());}/***鍒ゆ柇Key鏄惁鏈夋晥鎴栧瓨鍦?@param$key*@returnbool*@throwsReflectionException*/publicstaticfunctionisKey($key){returnin_array($key,array_keys(self::getEnumMembers())));}/***鏍规嵁Key鑾峰彇鏋氫妇鎴愬憳鍊?@param$key*@returnstatic*/publicstaticfunctiongetKey($key){returnself::$key();}/***鏍煎紡鍖栨灇涓剧粨鏋滅被鍨?@paramnull|bool|int$type褰撹繖閲岀殑鍊兼槸浠€涔堢被鍨嬫椂锛屽氨鏄繖绉嶇被鍨嬭鏍煎紡鍖栬緭鍑?@returnbool|int|string|null*/publicfunctionformat($type=null){switch(true){//褰撴槸绾暟瀛楁垨鑰呯被鍨嬫槸int鍊兼椂锛屼細杞负intcasectype_digit(鑷垜锛氾細$鍊硷級||is_int($type):return(int)self::$value;浼戞伅;//杩斿洖bool绫诲瀷case$type===true:return(bool)filter_var(self::$value,FILTER_VALIDATE_BOOLEAN);浼戞伅;榛樿鍊硷細杩斿洖self::$value锛涗紤鎭?}}}classOrderStatusextendsEnum{//榛樿鍊糲onst__default=self::WAIT_PAYMENT;//绛夊緟浠樻constWAIT_PAYMENT=0;//寰呭彂璐onstWAIT_SHIP=1;//寰呮帴鏀禼onstWAIT_RECEIPT=2;//寰呰瘎浼癱onstWAIT_COMMENT=3;}$WAIT_SHIP=OrderStatus::WAIT_SHIP();//鐩存帴杈撳嚭涓€涓瓧绗︿覆echo$WAIT_SHIP;//纭畾绫诲瀷鏄惁瀛樺湪var_dump($WAIT_SHIPinstanceofOrderStatus);//鏍煎紡鍖栬緭鍑轰互鏌ョ湅鏄惁闇€瑕佸瓧绗︿覆銆乥ool鎴杙lastic//鑷姩var_dump($WAIT_SHIP->format());//Plasticvar_dump($WAIT_SHIP->format(1));//boolvar_dump($WAIT_SHIP->format(true));//鏋氫妇鍊煎垽鏂繖涓€兼槸鍚︽湁鏁坴ar_dump(OrderStatus::isValid(2));//鍒ゆ柇杩欎釜鍊兼槸鍚︽湁鏁堢殑鏋氫妇鍊紇ar_dump(OrderStatus::isValid(8));//鑾峰彇鎵€鏈夋灇涓炬垚鍛樼殑Keyvar_dump(OrderStatus::keys());//鑾峰彇鎵€鏈夋灇涓炬垚鍛樼殑鍊紇ar_dump(OrderStatus::values());//鑾峰彇鏋氫妇鎴愬憳鐨勯敭鍊煎var_dump(OrderStatus::toArray());//鍒ゆ柇鏋氫妇Key鏄惁鏈夋晥var_dump(OrderStatus::isKey('WAIT_PAYMENT'));//鍒ゆ柇鏋氫妇Key鏄惁鏈夋晥var_dump(OrderStatus::isKey('WAIT_PAYMENT_TMP'));//鏍规嵁Key鍙栧€兼敞鎰忚繖閲屾病鏈夊彇鍑簍ype//鏇存帹鑽愮洿鎺ヤ娇鐢ㄥ彇绫诲父閲忚幏鍙栫殑鏂规硶鎴栬€呭湪楂樼増鏈腑鐩存帴浣跨敤绫诲父閲忎慨楗扮//鏈€濂借绫诲父閲忎笉鍙锛屼絾鏄渶瑕侀澶栫殑processingvar_dump(OrderStatus::getKey('WAIT_PAYMENT')->format(1));鑷虫涓€涓畬鏁寸殑鏋氫妇瀹屾垚~浠ヤ笅鍐呭锛岀紪杈戜簬2019-10-21锛屽彧鏄竴涓疄鐜版€濊矾銆傚鏋滈渶瑕佸湪鐢熶骇涓娇鐢紝寤鸿浣跨敤姣旇緝鎴愮啛鐨勬柟妗堛€備笅闈㈡帹鑽愮殑鏄痬arc-mabe/php-enum-Packagistmyclabs/php-enum-Packagist