是否可以序列化 SplEnum?我正在尝试使用 SplEnum,但用户化实例只有默认值。 例如:
class Test extends SplEnum
{
const __default = self::A;
const A = 1;
const B = 2;
}
...
$t = new Test( Test::B );
$s = serialize($t);
$t2 = unserialize($s);
变量 $t2 是 Test 的实例,但具有默认值。
最佳答案
反序列化后没有得到预期值的原因是 SplEnum 不仅仅是一个常规的 PHP 类。这是一种黑客行为。该值保存在其自己的结构中,而不是保存在 PHP 对象本身中,如您在此处看到的
https://github.com/davidcoallier/SPL_Types/blob/master/spl_type.c在方法 spl_type_object_new_ex
他们创建一个内部结构“对象”
object = emalloc(sizeof(spl_type_object));
保存值
ZVAL_ZVAL(object->value, *def, 1, 0);
unserialize
函数对这个内部对象一无所知,也无法更改其值。因此出现了这种奇怪的行为。
更新
您可能想要使用强制转换来保留对象的值。在你的情况下,它可能是:
$casted_value = (int) $t;
至少整数更容易处理。
更新2
具有工作序列化的工作示例。
class Test2 extends SplEnum implements Serializable
{
const __default = 1;
const A = 1;
const B = 27;
const C = 31;
public function serialize() {
return serialize ((int) $this);
}
public function unserialize($serialized) {
$this->__construct (unserialize($serialized));
}
}
关于php - 是否可以在 php 中序列化 SplEnum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25122792/