====== PHPでEnumを使う ====== VBではおなじみのEnumをPHPで使えるように、クラスを作ってみる。 まずは定数としてEnumを定義できるクラス。 ===== 定数としてEnumを定義できるクラス ===== やはりEnumは定数っぽく使いたい。 ==== 動作確認 ==== // Enumを定義 Enum::define('ANIMAL', array('DOG', 'CAT')); Enum::define('FOOD', array('BANANA')); // 引数の種類を判定する function test($var) { if (Enum::typeof($var) === ANIMAL) { // このグループに含まれるか? if ($var === ANIMAL_DOG) { echo 'dog.'; } else { echo 'not dog.'; } } else { echo 'not animal.'; } } // 実行結果 test(ANIMAL_DOG); // => 'dog.' test(ANIMAL_CAT); // => 'not dog.' test(FOOD_BANANA); // => 'not animal.' test(ANIMAL_DAG); // 未定義の場合 => 'not animal.' Type Safeでないのが残念。 Enumなら引数で型チェックしたい。 ===== Type SafeなEnumを定義するクラス ===== ==== 動作確認 ==== // Enumを定義 Enum::define('Animal', array('Dog', 'Cat')); Enum::define('Food', array('Banana')); // 引数がDogか判定する function test(ANIMAL $var) { if ($var->is('Dog')) { // switchの場合はis()は使えないので get_class($var) で echo 'dog.'; } else { echo 'not dog.'; } } // 実行結果 test(new Dog()); // => 'dog.' test(new Cat()); // => 'not dog.' //test(new Banana()); // ANIMALでない(引数の型不一致エラー) => Catchable fatal error //test(new Dag()); // 未定義の場合(class不明エラー) => Fatal error // グループに属するか判定する $banana = new Banana(); if ($banana->is('Food')) { // グループに属していればtrueになる echo 'food.'; } else { echo 'not food.'; } 引数の型チェックができる。 でもEnumを定数として使えないのが残念。