我试图找到一种方法来处理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