PHP 列舉型別的管理與設計

2022-09-15 08:54:10 字數 1719 閱讀 5091

本文的實現主要是基於 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 enum

return static::$cache[$class];

}}

現在考慮更多的使用場景,比如用例項來代表特定列舉型別

$yes = new boolenum("是");

echo $yes; // "是"

實現如下

abstract enum

if(! $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 ...