php - 是否可以在 php 中序列化 SplEnum

标签 php spl

是否可以序列化 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/

相关文章:

php - PHP 上的 Google Analytics API

php - Symfony2 : how to implement custom user login & registration - get rid of FOSUSerBundle

php - 当优先级不是整数时,SplPriorityQueue 如何工作?

php - 有没有办法让 PHP 的 SplHeap 重新计算? (又名 : add up-heap to SplHeap? )

php - 使用 count() 计算实现 ArrayAccess 的对象的元素?

php - 为什么 Web 分析应用程序从不使用 JSONP

php - 如何向 WordPress 主页添加可编辑文本 block ?

php - sql - 在没有额外查询的情况下更新时检查行是否存在?

php - SplObjectStorage - 分离行为

PHP 递归目录迭代器