PHPでC言語っぽいenumを作ってみた

PHPで連番の定数を扱うのが結構めんどくさいので、C言語の列挙型っぽいクラスを作ってみた。いまいち不便な追加機能付き。

早速実装を。練習もかねてgistを使ってみた

以下のように使う


<?php /*@charset "utf-8"*/

require('Enum.php');

// ANIMALがタグ
Enum::ANIMAL(array(
    'DOG',              // DOGを0として定義
    'CAT',              // CATは1
    'BIRD' => 10,       // BIRDを10として定義
    'PIG',              // PIGは11
    'NEKO' => 'CAT',    // 事前に定義済みなラベルは使える
//    'DOG',              // 再定義はエラー
    '_ANT',             // ラベルに使用可能な文字は /^[_a-zA-Z]{1}?\w*$/
//    '0_MONKEY',         // これはエラー
    'MOMKEY_0',         // これはOK
//    'MOMKEY-0',         // これはエラー
    'DRAGON' => -1,     // 負数も可能
    ));

// 宣言時に変数に代入可能
$PET = Enum::PET(array(
    'POCHI' => Enum::ANIMAL()->DOG, // ペットのポチは犬
    'TAMA' => Enum::ANIMAL()->CAT,
    ));

// 以下使用例
echo "DOG is " . Enum::ANIMAL()->DOG . "\n";

// Enum::ANIMAL()->DOG = 4; // 代入はエラー

// 配列のキーにも使える
$voice = array(
    Enum::ANIMAL()->DOG => 'ワンワン',
    Enum::ANIMAL()->CAT => 'ニャーニャー',
    Enum::ANIMAL()->BIRD => 'ピーチクパーチク',
    Enum::ANIMAL()->PIG => 'ブーブー',
    );

// 最小値と最大値を取得できる
for($i = $PET->getMin(); $i <= $PET->getMax(); ++$i){
    if(isset($voice[$i])){
        echo $voice[$i] . "\n";
    }
}

// Enum全体を取得してforeach
foreach($PET->getArray() as $key => $val){
    echo "{$key} => {$val}\n";
}

// 数値範囲指定つき取得
foreach(Enum::ANIMAL()->getArray(Enum::ANIMAL()->CAT, Enum::ANIMAL()->PIG) as $key => $val){
    echo "{$key} => {$val}\n"; // こちらは_ANTやNEKOも出力される
}

// ラベルで範囲指定
foreach(Enum::ANIMAL()->getArrayLabel('CAT', 'PIG') as $key => $val){
    echo "{$key} => {$val}\n"; // こちらは、CAT, BIRD, PIG のみ出力される
}

うん、まぁ、正直自分でも使うどうかは微妙。そしてgistからコード貼り付けるの楽チン。