mirror of
https://github.com/php/php-src.git
synced 2024-10-20 16:02:44 +00:00
187 lines
3.6 KiB
PHP
Executable File
187 lines
3.6 KiB
PHP
Executable File
--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)#1 (1) {
|
|
["__PHP_Incomplete_Class_Name"]=>
|
|
string(22) "autoload_not_available"
|
|
}
|
|
===DONE===
|