我試圖找到一種方法來處理PHP中的枚舉。 我發現的方法都不能實際使用枚舉來限制函數/方法的參數,這是我想要枚舉的主要原因。使用PHP反射來建立枚舉
於是我開始嘗試創建自己的,但現在已經使用反射碰到一個問題:
<?php
class Enum {
private $_value;
protected function __construct($value) {
$this->_value = $value;
}
public function getValue() {
return $this->_value;
}
protected static function enumerate($class) {
$ref = new ReflectionClass($class);
$instances = array();
foreach ($ref->getStaticProperties() as $name => $value) {
$ref->setStaticPropertyValue($name, new $class($value));
}
}
}
class Book extends Enum {
public static $COMIC = 1;
public static $NOVEL = 2;
public static $EDUCATIONAL = 3;
public static function enumerate() {
parent::enumerate(__CLASS__);
}
}
Book::enumerate();
function read(Book $book) {
echo '<hr/>';
var_dump($book);
}
read(Book::$COMIC);
read(Book::$EDUCATIONAL);
?>
我預期的輸出顯示兩個預訂,它們各自的值對象,而不是我得到這個:
object(Book)#2 (1) { ["_value:private"]=> object(Book)#2 (1) { ["_value:private"]=> *RECURSION* } }
object(Book)#4 (1) { ["_value:private"]=> object(Book)#4 (1) { ["_value:private"]=> *RECURSION* } }
進入setStaticPropertyValue
的值(new $class
)是正確的,並且僅創建其中的三個。
getStaticProperties
只拾取靜態屬性(因爲它應該)並且private $_value
被分配的唯一位置在構造函數中。 爲了完整起見,構造函數只被調用了三次,並且在構造函數中,該值與預期的一樣,只有1,2或3次。總之,在調用setStaticPropertyValue
之前,一切似乎都很完美。
我無法弄清楚這裏發生了什麼。 private $_value
在哪裏以及爲什麼分配了這個錯誤的值?我是否以錯誤的方式使用反射?什麼是創建這些無限遞歸對象?
當與執行的var_dump你的原代碼,我也沒有** **收到遞歸消息。 – 2011-12-14 19:39:32