本文的實現主要是基於 myclabs/php-enum 擴充套件包。今天來分享下如何管理 php 的列舉型別。
一種常見的方式是,使用常量來代表列舉型別
const yes = '是';const no = '否';
可以在這個基礎上更進一步,將其封裝成類,以便於管理
class boolenum
現在,我們希望能通過方法來動態呼叫對應的列舉型別
boolenum::yes(); // 是boolenum::no(); // 否
也可以批量獲取列舉型別
boolenum::toarray(); // ['yes' => '是', 'no' => '否']
下面來實現上面列舉的功能。
定義基本的列舉基類,讓所有的列舉類都繼承該抽象基類。
abstract class enum// 動態呼叫屬性
public static function __callstatic($name, $arguments)
throw new \badmethodcallexception("找不到對應的列舉值 ");
}}class boolenum extends enum
利用反射,可以獲取到所有的列舉型別。同時,利用魔術方法則可以實現對屬性的動態呼叫。這裡要注意的是,反射會消耗較多的資源,因此,對 toarray 方法進行重構,增加乙個快取變數來快取獲取到的列舉型別,避免重複使用反射。
abstract class enumreturn static::$cache[$class];
}}
現在考慮更多的使用場景,比如用例項來代表特定列舉型別
$yes = new boolenum("是");echo $yes; // "是"
實現如下
abstract enumif(! $this->isvalid($value))
$this->value = $value;
}// 獲取例項對應的鍵
public function getkey()
// 獲取例項對應的值
public function getvalue()
// 允許字串形式輸出
public function __tostring()
// 驗證值是否合法
public function isvalid($value)
// 驗證鍵是否合法
public function isvalidkey($key)
}
這樣做可避免使用者使用非法的列舉型別的值
$user->banned = '非法值'; // 可能不會報錯$yes = new boolenum("非法值"); // 將會丟擲異常
$user->banned = $yes;
或者作為引數型別限定
function setuserstatus(boolenum $boolenum)
php 作為一門弱型別語言,引數限定的不足會導致很多不可預期的錯誤發生,通過使用列舉類,我們進一步加強了引數限定的功能,同時,管理列舉型別也更加的方便統一。
列舉數與可列舉型別
列舉數 可以理解為指向類成員的指標 可列舉型別 可以列舉的型別,必須具有getenumerator 方法 列舉數有三種型別 1.ienmverator ienumerable介面,非泛型介面形式 2.ienmverator ienumerable泛型介面 3.不使用介面形式 非泛型列舉介面 ienu...
常量與列舉型別
常量的使用需要注意以下幾點 1 常量需要在型別關鍵字之前加上 const 表示是關鍵字。const 本身就是常量的意思 2 常量中的所有的字母全部都是大寫,而且定義的名字必須要有一定的意義,做到 見名知意 如 pi 3 常量在定義時,就必須初始化 即,給出初始值 列舉型別的定義需要注意的幾點要求。1...
C 之列舉型別與列舉類
enumtype.cpp 定義控制台應用程式的入口點。include stdafx.h include using namespace std 定義乙個列舉型別,可以通過這個定義相應的列舉成員的識別符號 並用其中的乙個為他們賦值 定義在main函式體外屬於全域性變數 enum gameresult ...