PHPã§Enum(åæåï¼ã£ã½ãä½ããå®è£
PHP çããæ¸ãã¦ã¾ããï¼å æ°ã§ããï¼
Javaã£ã½ãæ§æã ããªãã ãçãã¨ããã«æãå±ããªãæãæããããã¾ããããåã¯æãã¾ãã
Javaæ¸ãã¦ãã¨ã㯠enum ã¯ã©ã¹ã¨ããã®ãå¤ç¨ããã®ã§ãã PHP ã«ã¯ãªãã1å¹´ãããåã«å®è£ ãã¾ããã
ã³ã¼ã㯠github ã«ããã¦ããã®ã§ããã£ãã¡ãªäººã¯ã³ã¼ãã ãè¦ãã°ããã
git://github.com/yamashiro/php_enum.git
ã¾ãã¯ä½¿ãæ¹ããã¹ããè¦ã¦ã¿ã¾ããã
<?php require __DIR__ . '/CarrierEnum.php'; class CarrierEnumTest extends PHPUnit_Framework_TestCase { /** @test */ public function valueOfã®ãã¹ã() { //DBãcacheããã¡ã¤ã«ããã¨ã£ã¦ããå¤ã valueOf ããã¤ã¡ã¼ã¸ $this->assertSame(CarrierEnum::$au, CarrierEnum::valueOf('au')); } /** @test */ public function getNameã®ãã¹ã() { //DBãcacheããã¡ã¤ã«ã«æ¸ãè¾¼ãã¨ã㯠getName $this->assertSame('softbank', CarrierEnum::$softbank->getName()); } /** @test */ public function toStringãå®ç¾©ãã¦ããããæåé£çµãããããã¨èªåã§() { $this->assertSame('hogedocomo', 'hoge'.CarrierEnum::$docomo); } /** @test */ public function values() { //enum ã ããåæã§ãããï¼ $values = CarrierEnum::values(); $this->assertSame(4, count($values)); $this->assertSame(CarrierEnum::$docomo, $values[0]); } }
ã³ã¼ãã®ä¸ã§ã¯æååã¯çµ¶å¯¾ã«ä½¿ããã«ãEnumã®ãªãã¸ã§ã¯ãã使ãã¾ããããã«ãããã¸ãã¯ãã³ãã¼ããªããªãã¾ããDBãªã©ããå¤ãã¨ã£ã¦ããããvalueOfã使ã£ã¦PHPã®ãªãã¸ã§ã¯ãã«ãã¾ããéã«æ¸ãè¾¼ãã¨ãã¯ãgetNameãtoStringã使ãã¾ãã
ã©ã®ããã«å®ç¾©ãããã以ä¸ã«ç¤ºãã¾ãã
<?php require_once __DIR__ . '/EnumBase.php'; class CarrierEnum extends EnumBase { static $docomo; static $au; static $softbank; static $willcom; private $otherOption1; protected function __construct($displayName, $otherOption1) { parent::__construct($displayName); $this->otherOption1 = $otherOption1; } public static function ___init() { self::$docomo = new CarrierEnum('DoCoMo', 100); self::$au = new CarrierEnum('au', 50); self::$softbank = new CarrierEnum('softbank', 30); self::$willcom = new CarrierEnum('Willcom', 30); } public function getOtherOption1() { return $this->otherOption1; } } CarrierEnum::___init();
èªå㧠new ããªãã¨ãããªãã®ã¨ã___init() å¼ã°ãªãã¨ãããªãã®ãæ²ãã¿ã§ãããPHPã§ç¡çãã Enum ãå®è£ ããã®ã§ãããææ ¢ãã¾ãããã
æ®éã®ã¯ã©ã¹ã§ãã®ã§ãä¾ãã°ãã®ä¾ã ã¨æºå¸¯ãã£ãªã¢ãã¨ã®å®è£ ãªã©ã¯ãã®ã¯ã©ã¹ã«çããã¦ãã¾ã£ã¦æ§ãã¾ããã
ããããã£ã¦ãã¨ãã®ã¯ã©ã¹ãè¥å¤§åãã¦â¦ã¨ãªã£ãã Enum ãã㯠Strategy ãè¿ãã¨ãã§ãããã§ããã
ãã¦æå¾ã«ããããå®ç¾ãã¦ãã EnumBase
<?php abstract class EnumBase { private $displayName; protected function __construct($displayName = '') { $this->displayName = $displayName; self::$enumValues[] = $this; } private static $enumValues = array(); public static function values() { $values = array(); $clazz = get_called_class(); foreach (self::$enumValues as $enumValue) { if ($clazz == get_class($enumValue)) { $values[] = $enumValue; } } return $values; } public function getDisplayName() { if( $this->displayName === ''){ return $this->getName(); } return $this->displayName; } public function getName() { $reflection = new ReflectionClass(get_class($this)); $staticProperties = $reflection->getStaticProperties(); foreach ($staticProperties as $name => $value) { if ($value === $this) { return $name; } } } public static function valueOf($name) { $clazz = get_called_class(); $reflection = new ReflectionClass($clazz); $staticProperties = $reflection->getStaticProperties(); foreach ($staticProperties as $propName => $value) { if ($name === $propName) { return $value; } } throw new Exception('ãã®ãããªååã® enum ã¯åå¨ãã¾ãã. name['.$name.'] $clazz['.$clazz.']'); } public function __toString() { return $this->getName(); } }
PHP5.3 以éã§åãã¾ãã5.2ã§ã get_called_class ã debug_backtrace ã解æãã¦å®è£ ããã°åããªããã¨ããªãã§ããâ¦
|