Heim  >  Artikel  >  Backend-Entwicklung  >  Verwaltung und Design von PHP-Aufzählungstypen

Verwaltung und Design von PHP-Aufzählungstypen

藏色散人
藏色散人nach vorne
2020-02-13 13:42:543466Durchsuche

Die Implementierung dieses Artikels basiert hauptsächlich auf dem Erweiterungspaket myclabs/php-enum.

Heute werde ich Ihnen zeigen, wie Sie PHP-Aufzählungstypen verwalten.

Eine übliche Methode ist die Verwendung von Konstanten zur Darstellung von Aufzählungstypen

const YES = '是';
const NO = '否';

Sie können auf dieser Basis noch einen Schritt weiter gehen und sie zur einfacheren Verwaltung in eine Klasse kapseln

class BoolEnum {
    const YES = '是';
    const NO = '否';
}

Jetzt Wir hoffen, den entsprechenden Aufzählungstyp

BoolEnum::YES(); // 是
BoolEnum::NO(); // 否

dynamisch über Methoden aufrufen zu können. Wir können Aufzählungstypen

BoolEnum::toArray(); // ['Yes' => '是', 'No' => '否']

auch stapelweise abrufen, um die oben aufgeführten Funktionen zu implementieren.

Definieren Sie eine grundlegende Aufzählungsbasisklasse, sodass alle Aufzählungsklassen diese abstrakte Basisklasse erben.

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 = '否';
}

Mithilfe von Reflektion können alle Aufzählungstypen erhalten werden. Gleichzeitig können mit der Magic-Methode Attribute dynamisch aufgerufen werden. Hierbei ist zu beachten, dass die Reflektion mehr Ressourcen verbraucht. Daher wird die toArray-Methode neu erstellt und eine Cache-Variable hinzugefügt, um den erhaltenen Aufzählungstyp zwischenzuspeichern, um eine wiederholte Verwendung der Reflektion zu vermeiden.

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];
    }
}

Betrachten Sie nun weitere Verwendungsszenarien, z. B. die Verwendung von Instanzen zur Darstellung bestimmter Aufzählungstypen.

$yes = new BoolEnum("是");
echo $yes; // "是"

Die Implementierung ist wie folgt.

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);
    }
}

Dadurch kann verhindert werden, dass Benutzer illegale Aufzählungswerte verwenden Vom Typ

$user->banned = '非法值';  // 可能不会报错
$yes = new BoolEnum("非法值"); // 将会抛出异常
$user->banned = $yes;

oder als Parametertypqualifikation

function setUserStatus(BoolEnum $boolEnum){
    $user->banned = $boolEnum;
}

PHP ist eine schwach typisierte Sprache. Durch die Verwendung von Aufzählungsklassen führen wir zu vielen unvorhersehbaren Fehlern Die Einschränkung wird weiter verstärkt und gleichzeitig ist die Verwaltung von Aufzählungstypen bequemer und einheitlicher.

Das obige ist der detaillierte Inhalt vonVerwaltung und Design von PHP-Aufzählungstypen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen