欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP 枚舉類型的管理與設(shè)計知識點總結(jié)

 更新時間:2020年02月13日 15:19:41   作者:藏色散人  
在本篇文章里小編給大家整理的是關(guān)于PHP 枚舉類型的管理與設(shè)計知識點總結(jié),需要的朋友們可以學(xué)習(xí)參考下。

今天來分享下如何管理 PHP 的枚舉類型。

一種常見的方式是,使用常量來代表枚舉類型

const YES = '是';

const NO = '否';

可以在這個基礎(chǔ)上更進一步,將其封裝成類,以便于管理

class BoolEnum {

  const YES = '是';

  const NO = '否';

}

現(xiàn)在,我們希望能通過方法來動態(tài)調(diào)用對應(yīng)的枚舉類型

BoolEnum::YES(); // 是

BoolEnum::NO(); // 否

也可以批量獲取枚舉類型

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

下面來實現(xiàn)上面列舉的功能。

定義基本的枚舉基類,讓所有的枚舉類都繼承該抽象基類。

abstract class Enum

{  

  // 獲取所有枚舉類型

  public static function toArray(){

    // 通過反射獲取常量

    $reflection = new \ReflectionClass(static::class);

    $contants = $reflection->getConstants();

    // 返回對應(yīng)的常量

    return $contants;

  }

  // 動態(tài)調(diào)用屬性

  public static function __callStatic($name, $arguments)

  {

    $arr = static::toArray();

    if(isset($arr[$name])){

      return $arr[$name];

    }

    throw new \BadMethodCallException("找不到對應(yīng)的枚舉值 {$name}");

  }

}

class BoolEnum extends Enum

{

  const YES = '是';

  const NO = '否';

}

利用反射,可以獲取到所有的枚舉類型。同時,利用魔術(shù)方法則可以實現(xiàn)對屬性的動態(tài)調(diào)用。這里要注意的是,反射會消耗較多的資源,因此,對 toArray 方法進行重構(gòu),增加一個緩存變量來緩存獲取到的枚舉類型,避免重復(fù)使用反射。

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

  }

}

現(xiàn)在考慮更多的使用場景,比如用實例來代表特定枚舉類型

$yes = new BoolEnum("是");

echo $yes; // "是"

實現(xiàn)如下

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;

  }

  // 獲取實例對應(yīng)的鍵

  public function getKey(){

    return array_search($this->value, static::toArray(), true);

  }

  // 獲取實例對應(yīng)的值

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

  }

}

這樣做可避免用戶使用非法的枚舉類型的值

$user->banned = '非法值'; // 可能不會報錯

$yes = new BoolEnum("非法值"); // 將會拋出異常

$user->banned = $yes;

或者作為參數(shù)類型限定

function setUserStatus(BoolEnum $boolEnum){

  $user->banned = $boolEnum;

}

PHP 作為一門弱類型語言,參數(shù)限定的不足會導(dǎo)致很多不可預(yù)期的錯誤發(fā)生,通過使用枚舉類,我們進一步加強了參數(shù)限定的功能,同時,管理枚舉類型也更加的方便統(tǒng)一。

以上就是本次介紹的全部相關(guān)知識點,感謝大家的學(xué)習(xí)和對腳本之家的支持。

您可能感興趣的文章:

相關(guān)文章

  • Yii2使用小技巧之通過 Composer 添加 FontAwesome 字體資源

    Yii2使用小技巧之通過 Composer 添加 FontAwesome 字體資源

    前天幫同事改個十年前的網(wǎng)站 bug,頁面上一堆 include require 不禁讓人抱頭痛哭??吹?V2EX 上的討論說,寫 PHP 不用框架等同于耍流氓。Yii Framework 是我使用了 2 年多的 PHP 框架,器大活好,皮實耐操。 Yii2 還在 Beta 中,不過不影響拿來預(yù)研。
    2014-06-06
  • 一個PHP實現(xiàn)的輕量級簡單爬蟲

    一個PHP實現(xiàn)的輕量級簡單爬蟲

    這篇文章主要介紹了一個PHP實現(xiàn)的輕量級簡單爬蟲,本文總結(jié)了爬蟲的一些知識如爬蟲的結(jié)構(gòu)、正則表達式、其他問題等,然后給出了爬蟲實現(xiàn)代碼,需要的朋友可以參考下
    2015-07-07
  • 深入理解PHP變量的值類型和引用類型

    深入理解PHP變量的值類型和引用類型

    在PHP中,大部分變量類型,如字符串,整型,浮點,數(shù)組等都是值類型的,而類和對象是引用類型,在使用的時候,需要注意這一點。
    2015-10-10
  • PHP變量的作用范圍實例講解

    PHP變量的作用范圍實例講解

    這篇文章主要介紹了PHP變量的作用范圍實例講解,介紹了變量的類型和具體的代碼實例,講解的非常清晰,有對這方面不懂的同學(xué)可以閱讀了解下
    2020-12-12
  • PHP中的常見魔術(shù)方法功能作用及用法實例

    PHP中的常見魔術(shù)方法功能作用及用法實例

    這篇文章主要介紹了PHP中的常見魔術(shù)方法功能作用及用法實例,本文講解了構(gòu)造函數(shù)和析構(gòu)函數(shù)__construct()和__desctruct()以及屬性重載(Property Overloading)__get()和、__set()、__isset()等等魔術(shù)方法,需要的朋友可以參考下
    2015-07-07
  • 老生常談PHP面向?qū)ο笾畼俗R映射

    老生常談PHP面向?qū)ο笾畼俗R映射

    下面小編就為大家?guī)硪黄仙U凱HP面向?qū)ο笾畼俗R映射。小編覺得挺不錯的。現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • PHP+Ajax異步通訊實現(xiàn)用戶名郵箱驗證是否已注冊( 2種方法實現(xiàn))

    PHP+Ajax異步通訊實現(xiàn)用戶名郵箱驗證是否已注冊( 2種方法實現(xiàn))

    在網(wǎng)站注冊用戶時使用,主要為了無刷新異步驗證用戶輸入的用戶名或者Email是否已注冊。
    2011-12-12
  • Yii 2.0自帶的驗證碼使用經(jīng)驗分享

    Yii 2.0自帶的驗證碼使用經(jīng)驗分享

    這篇文章主要給大家介紹了關(guān)于使用Yii 2.0自帶驗證碼的一些經(jīng)驗,方便新手們快速上手,對大家具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起看看吧。
    2017-06-06
  • php實現(xiàn)上傳圖片生成縮略圖示例

    php實現(xiàn)上傳圖片生成縮略圖示例

    這篇文章主要介紹了php實現(xiàn)上傳圖片生成縮略圖示例,代碼中有詳細注釋,需要的朋友可以參考下
    2014-04-04
  • laravel實現(xiàn)登錄時監(jiān)聽事件,添加登錄用戶的記錄方法

    laravel實現(xiàn)登錄時監(jiān)聽事件,添加登錄用戶的記錄方法

    今天小編就為大家分享一篇laravel實現(xiàn)登錄時監(jiān)聽事件,添加登錄用戶的記錄方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09

最新評論