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からコード貼り付けるの楽チン。