基於註解的 PHP 列舉類實現

李銘昕發表於2018-07-09

首先,先放一下專案倉庫
Enum

之前在寫專案的時候,通常一個錯誤碼對應一條文案。這就導致我們寫出了這種程式碼

<?php
class ErrorCode{
    const ERROR=1000;
        const PARAM_ERROR = 1001;

        const MESSAGE=[
            self::ERROR=>'系統錯誤',
                self::PARAM_ERROR=>'引數錯誤',
        ];
}

隨著我們的errorCode越來越多,就導致當我們拿到錯誤碼時,我們很不容易找到他的錯誤資訊。。而且每次新新增一個code,都要拖到最底下,新增一個message。感覺很不爽。

於是我們的ErrorCode又進行了一次升級。

<?php
class ErrorCode{
    const ERROR=1000;
        const ERROR_SHOW='系統錯誤';
        const PARAM_ERROR = 1001;
        const PARAM_ERROR_SHOW='引數錯誤';

        public static function getMessage($code){
            // 通過反射取出對應的SHOW
        }
}

這種寫法剛出來,就被否決了。。沒有最醜,只有更醜的設計,另外,既然都用了反射,為什麼我們不把錯誤資訊放到他的註釋裡呢。

於是便有了這種新的設計,還是蠻有趣的。

<?php
use Xin\Phalcon\Enum\Enum;

class ErrorCode extends Enum
{
    /**
     * @Message('非法的TOKEN')
     */
    public static $ENUM_INVALID_TOKEN = 700;
}

$code = ErrorCode::$ENUM_INVALID_TOKEN;
$message = ErrorCode::getMessage($code); // 非法的TOKEN

是不是很有趣,哈哈哈

PHP7.1以後就能反射拿到const的註釋了,所以升級了一下常量元件

本作品採用《CC 協議》,轉載必須註明作者和本文連結

Any fool can write code that a computer can understand. Good programmers write code that humans can understand.

相關文章