--TEST-- serialize()/unserialize() objects --SKIPIF-- <?php if (!interface_exists('Serializable')) die('skip Interface Serialzable not defined'); ?> --FILE-- <?php // This test verifies that old and new style (un)serializing do not interfere. function do_autoload($class_name) { if ($class_name != 'autoload_not_available') { require_once(dirname(__FILE__) . '/' . strtolower($class_name) . '.p5c'); } echo __FUNCTION__ . "($class_name)\n"; } function unserializer($class_name) { echo __METHOD__ . "($class_name)\n"; switch($class_name) { case 'TestNAOld': eval("class TestNAOld extends TestOld {}"); break; case 'TestNANew': eval("class TestNANew extends TestNew {}"); break; case 'TestNANew2': eval("class TestNANew2 extends TestNew {}"); break; default: echo "Try __autoload()\n"; if (!function_exists('__autoload')) { eval('function __autoload($class_name) { do_autoload($class_name); }'); } __autoload($class_name); break; } } ini_set('unserialize_callback_func', 'unserializer'); class TestOld { function serialize() { echo __METHOD__ . "()\n"; } function unserialize($serialized) { echo __METHOD__ . "()\n"; } function __wakeup() { echo __METHOD__ . "()\n"; } function __sleep() { echo __METHOD__ . "()\n"; return array(); } } class TestNew implements Serializable { protected static $check = 0; function serialize() { echo __METHOD__ . "()\n"; switch(++self::$check) { case 1: return NULL; case 2: return "2"; } } function unserialize($serialized) { echo __METHOD__ . "()\n"; } function __wakeup() { echo __METHOD__ . "()\n"; } function __sleep() { echo __METHOD__ . "()\n"; } } echo "===O1===\n"; var_dump($ser = serialize(new TestOld)); var_dump(unserialize($ser)); echo "===N1===\n"; var_dump($ser = serialize(new TestNew)); var_dump(unserialize($ser)); echo "===N2===\n"; var_dump($ser = serialize(new TestNew)); var_dump(unserialize($ser)); echo "===NAOld===\n"; var_dump(unserialize('O:9:"TestNAOld":0:{}')); echo "===NANew===\n"; var_dump(unserialize('O:9:"TestNANew":0:{}')); echo "===NANew2===\n"; var_dump(unserialize('C:10:"TestNANew2":0:{}')); echo "===AutoOld===\n"; var_dump(unserialize('O:19:"autoload_implements":0:{}')); // Now we have __autoload(), that will be called before the old style header. // If the old style handler also fails to register the class then the object // becomes an incomplete class instance. echo "===AutoNA===\n"; var_dump(unserialize('O:22:"autoload_not_available":0:{}')); ?> ===DONE=== <?php exit(0); ?> --EXPECTF-- ===O1=== TestOld::__sleep() string(18) "O:7:"TestOld":0:{}" TestOld::__wakeup() object(TestOld)#%d (0) { } ===N1=== TestNew::serialize() string(2) "N;" NULL ===N2=== TestNew::serialize() string(19) "C:7:"TestNew":1:{2}" TestNew::unserialize() object(TestNew)#%d (0) { } ===NAOld=== unserializer(TestNAOld) TestOld::__wakeup() object(TestNAOld)#%d (0) { } ===NANew=== unserializer(TestNANew) TestNew::__wakeup() object(TestNANew)#%d (0) { } ===NANew2=== unserializer(TestNANew2) TestNew::unserialize() object(TestNANew2)#%d (0) { } ===AutoOld=== unserializer(autoload_implements) Try __autoload() do_autoload(autoload_interface) do_autoload(autoload_implements) object(autoload_implements)#%d (0) { } ===AutoNA=== do_autoload(autoload_not_available) unserializer(autoload_not_available) Try __autoload() do_autoload(autoload_not_available) do_autoload(autoload_not_available) Warning: unserialize(): Function unserializer() hasn't defined the class it was called for in %s005.php on line %d object(__PHP_Incomplete_Class)#%d (1) { ["__PHP_Incomplete_Class_Name"]=> string(22) "autoload_not_available" } ===DONE===