--TEST-- Object Serializable interface throws exceptions --SKIPIF-- a = $a; $this->b = $b; } public function serialize() { $c = self::$count++; echo "call serialize, ", ($this->a ? "throw" : "no throw"), PHP_EOL; if ($this->a) { throw new Exception("exception in serialize $c"); } return pack('NN', $this->a, $this->b); } public function unserialize($serialized) { $tmp = unpack('N*', $serialized); $this->__construct($tmp[1], $tmp[2]); $c = self::$count++; echo "call unserialize, ", ($this->b ? "throw" : "no throw"), PHP_EOL; if ($this->b) { throw new Exception("exception in unserialize $c"); } } public function __serialize() { return [$this->serialize()]; } public function __unserialize($serialized) { return $this->unserialize($serialized[0]); } } $a = new Obj(1, 0); $a = new Obj(0, 0); $b = new Obj(0, 0); $c = new Obj(1, 0); $d = new Obj(0, 1); echo "a, a, c", PHP_EOL; try { test(array($a, $a, $c)); } catch (Exception $e) { if (version_compare(phpversion(), "5.3.0", ">=")) { if ($e->getPrevious()) { $e = $e->getPrevious(); } } echo $e->getMessage(), PHP_EOL; } echo "b, b, d", PHP_EOL; try { test(array($b, $b, $d)); } catch (Exception $e) { if (version_compare(phpversion(), "5.3.0", ">=")) { if ($e->getPrevious()) { $e = $e->getPrevious(); } } echo $e->getMessage(), PHP_EOL; } ?> --EXPECT-- a, a, c call serialize, no throw call serialize, throw exception in serialize 2 b, b, d call serialize, no throw call serialize, no throw call unserialize, no throw call unserialize, throw exception in unserialize 6