PHP Generator::__wakeup() 方法
PHP Generator::__wakeup
用于在反系列一个对象时调用。
( PHP 5 >= 5.5.0, PHP 7 )
其实,迭代器是不能被序列化和反序列化的。不知道为啥实现了这个方法有什么用。
方法原型
public void Generator::__wakeup ( void )
该方法会在反系列化时自动调用,也就是在调用 unserialize()
函数反序列化一个函数时自动调用。
有意思的是,Generator 类竟然实现了 __wakeup()
方法而没有实现 __sleep()
方法。
如果一个生成器不能被序列化,那么将抛出一个异常。
其实,迭代器是不能被序列化和反序列化的。不知道为啥实现了这个方法有什么用。
范例
我们写一个范例来演示下生成器的序列化于反序列化。会抛出一个异常。
<?php function gen_zero_to_ten() { for ($i = 1; $i <= 10; $i++) { yield $i; } } $generator = gen_zero_to_ten(); echo "current value is: ",$generator->current(); // 调用了 next() 方法,所以下一次调用 current() 应该输出 2 $generator->next(); // 序列化 $gen_s = serialize( $generator ); // 反序列化 $gen = unserialize( $gen_s ); echo "current value is: ",$generator->current();
运行结果如下
current value is: 1 Fatal error: Uncaught Exception: Serialization of 'Generator' is not allowed
从运行结果中可以看出,生成器是不能被序列化和反序列化的。