1
0
mirror of https://github.com/php/php-src.git synced 2026-03-27 17:52:16 +01:00

Adding more tests for serialize() and unserialize().

This commit is contained in:
Robin Fernandes
2008-03-18 15:12:42 +00:00
parent d390956ccb
commit da591e8eca
26 changed files with 7365 additions and 2 deletions

View File

@@ -179,7 +179,7 @@ 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) {
object(__PHP_Incomplete_Class)#%d (1) {
["__PHP_Incomplete_Class_Name"]=>
string(22) "autoload_not_available"
}
@@ -231,7 +231,7 @@ 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) {
object(__PHP_Incomplete_Class)#%d (1) {
[u"__PHP_Incomplete_Class_Name"]=>
unicode(22) "autoload_not_available"
}

View File

@@ -0,0 +1,177 @@
--TEST--
Test serialize() & unserialize() functions: arrays (circular references)
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
echo "\n--- Testing Circular reference of an array ---\n";
echo "-- Normal array --\n";
$arr_circ = array(0, 1, -2, 3.333333, "a", array(), &$arr_circ);
$serialize_data = serialize($arr_circ);
var_dump( $serialize_data );
$arr_circ = unserialize($serialize_data);
var_dump( $arr_circ );
echo "\n-- Associative array --\n";
$arr_asso = array("a" => "test");
$arr_asso[ "b" ] = &$arr_asso[ "a" ];
var_dump($arr_asso);
$serialize_data = serialize($arr_asso);
var_dump($serialize_data);
$arr_asso = unserialize($serialize_data);
var_dump($arr_asso);
echo "\nDone";
?>
--EXPECTF--
--- Testing Circular reference of an array ---
-- Normal array --
string(238) "a:7:{i:0;i:0;i:1;i:1;i:2;i:-2;i:3;d:3.333333000000000101437080957111902534961700439453125;i:4;S:1:"a";i:5;a:0:{}i:6;a:7:{i:0;i:0;i:1;i:1;i:2;i:-2;i:3;d:3.333333000000000101437080957111902534961700439453125;i:4;S:1:"a";i:5;a:0:{}i:6;R:8;}}"
array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(-2)
[3]=>
float(3.333333)
[4]=>
string(1) "a"
[5]=>
array(0) {
}
[6]=>
&array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(-2)
[3]=>
float(3.333333)
[4]=>
string(1) "a"
[5]=>
array(0) {
}
[6]=>
&array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(-2)
[3]=>
float(3.333333)
[4]=>
string(1) "a"
[5]=>
array(0) {
}
[6]=>
*RECURSION*
}
}
}
-- Associative array --
array(2) {
["a"]=>
&string(4) "test"
["b"]=>
&string(4) "test"
}
string(37) "a:2:{S:1:"a";S:4:"test";S:1:"b";R:2;}"
array(2) {
["a"]=>
&string(4) "test"
["b"]=>
&string(4) "test"
}
Done
--UEXPECTF--
--- Testing Circular reference of an array ---
-- Normal array --
unicode(238) "a:7:{i:0;i:0;i:1;i:1;i:2;i:-2;i:3;d:3.333333000000000101437080957111902534961700439453125;i:4;U:1:"a";i:5;a:0:{}i:6;a:7:{i:0;i:0;i:1;i:1;i:2;i:-2;i:3;d:3.333333000000000101437080957111902534961700439453125;i:4;U:1:"a";i:5;a:0:{}i:6;R:8;}}"
array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(-2)
[3]=>
float(3.333333)
[4]=>
unicode(1) "a"
[5]=>
array(0) {
}
[6]=>
&array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(-2)
[3]=>
float(3.333333)
[4]=>
unicode(1) "a"
[5]=>
array(0) {
}
[6]=>
&array(7) {
[0]=>
int(0)
[1]=>
int(1)
[2]=>
int(-2)
[3]=>
float(3.333333)
[4]=>
unicode(1) "a"
[5]=>
array(0) {
}
[6]=>
*RECURSION*
}
}
}
-- Associative array --
array(2) {
[u"a"]=>
&unicode(4) "test"
[u"b"]=>
&unicode(4) "test"
}
unicode(37) "a:2:{U:1:"a";U:4:"test";U:1:"b";R:2;}"
array(2) {
[u"a"]=>
&unicode(4) "test"
[u"b"]=>
&unicode(4) "test"
}
Done

View File

@@ -0,0 +1,986 @@
--TEST--
serialization: arrays with references amonst elements
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
function check(&$a) {
var_dump($a);
$ser = serialize($a);
var_dump($ser);
$b = unserialize($ser);
var_dump($b);
$b[0] = "b0.changed";
var_dump($b);
$b[1] = "b1.changed";
var_dump($b);
$b[2] = "b2.changed";
var_dump($b);
}
echo "\n\n--- No references:\n";
$a = array();
$a[0] = 1;
$a[1] = 1;
$a[2] = 1;
check($a);
echo "\n\n--- 0 refs 1:\n";
$a = array();
$a[0] = &$a[1];
$a[1] = 1;
$a[2] = 1;
check($a);
echo "\n\n--- 0 refs 2:\n";
$a = array();
$a[0] = &$a[2];
$a[1] = 1;
$a[2] = 1;
check($a);
echo "\n\n--- 1 refs 0:\n";
$a = array();
$a[0] = 1;
$a[1] = &$a[0];
$a[2] = 1;
check($a);
echo "\n\n--- 1 refs 2:\n";
$a = array();
$a[0] = 1;
$a[1] = &$a[2];
$a[2] = 1;
check($a);
echo "\n\n--- 2 refs 0:\n";
$a = array();
$a[0] = 1;
$a[1] = 1;
$a[2] = &$a[0];
check($a);
echo "\n\n--- 2 refs 1:\n";
$a = array();
$a[0] = 1;
$a[1] = 1;
$a[2] = &$a[1];
check($a);
echo "\n\n--- 0,1 ref 2:\n";
$a = array();
$a[0] = &$a[2];
$a[1] = &$a[2];
$a[2] = 1;
check($a);
echo "\n\n--- 0,2 ref 1:\n";
$a = array();
$a[0] = &$a[1];
$a[1] = 1;
$a[2] = &$a[1];
check($a);
echo "\n\n--- 1,2 ref 0:\n";
$a = array();
$a[0] = 1;
$a[1] = &$a[0];
$a[2] = &$a[0];
check($a);
echo "Done";
?>
--EXPECTF--
--- No references:
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
string(30) "a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 0 refs 1:
array(3) {
[1]=>
&int(1)
[0]=>
&int(1)
[2]=>
int(1)
}
string(30) "a:3:{i:1;i:1;i:0;R:2;i:2;i:1;}"
array(3) {
[1]=>
&int(1)
[0]=>
&int(1)
[2]=>
int(1)
}
array(3) {
[1]=>
&string(10) "b0.changed"
[0]=>
&string(10) "b0.changed"
[2]=>
int(1)
}
array(3) {
[1]=>
&string(10) "b1.changed"
[0]=>
&string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[1]=>
&string(10) "b1.changed"
[0]=>
&string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 0 refs 2:
array(3) {
[2]=>
&int(1)
[0]=>
&int(1)
[1]=>
int(1)
}
string(30) "a:3:{i:2;i:1;i:0;R:2;i:1;i:1;}"
array(3) {
[2]=>
&int(1)
[0]=>
&int(1)
[1]=>
int(1)
}
array(3) {
[2]=>
&string(10) "b0.changed"
[0]=>
&string(10) "b0.changed"
[1]=>
int(1)
}
array(3) {
[2]=>
&string(10) "b0.changed"
[0]=>
&string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
}
array(3) {
[2]=>
&string(10) "b2.changed"
[0]=>
&string(10) "b2.changed"
[1]=>
string(10) "b1.changed"
}
--- 1 refs 0:
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
string(30) "a:3:{i:0;i:1;i:1;R:2;i:2;i:1;}"
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b0.changed"
[1]=>
&string(10) "b0.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 1 refs 2:
array(3) {
[0]=>
int(1)
[2]=>
&int(1)
[1]=>
&int(1)
}
string(30) "a:3:{i:0;i:1;i:2;i:1;i:1;R:3;}"
array(3) {
[0]=>
int(1)
[2]=>
&int(1)
[1]=>
&int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[2]=>
&int(1)
[1]=>
&int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[2]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
}
array(3) {
[0]=>
string(10) "b0.changed"
[2]=>
&string(10) "b2.changed"
[1]=>
&string(10) "b2.changed"
}
--- 2 refs 0:
array(3) {
[0]=>
&int(1)
[1]=>
int(1)
[2]=>
&int(1)
}
string(30) "a:3:{i:0;i:1;i:1;i:1;i:2;R:2;}"
array(3) {
[0]=>
&int(1)
[1]=>
int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
&string(10) "b0.changed"
[1]=>
int(1)
[2]=>
&string(10) "b0.changed"
}
array(3) {
[0]=>
&string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
&string(10) "b0.changed"
}
array(3) {
[0]=>
&string(10) "b2.changed"
[1]=>
string(10) "b1.changed"
[2]=>
&string(10) "b2.changed"
}
--- 2 refs 1:
array(3) {
[0]=>
int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
string(30) "a:3:{i:0;i:1;i:1;i:1;i:2;R:3;}"
array(3) {
[0]=>
int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
&string(10) "b1.changed"
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
&string(10) "b2.changed"
[2]=>
&string(10) "b2.changed"
}
--- 0,1 ref 2:
array(3) {
[2]=>
&int(1)
[0]=>
&int(1)
[1]=>
&int(1)
}
string(30) "a:3:{i:2;i:1;i:0;R:2;i:1;R:2;}"
array(3) {
[2]=>
&int(1)
[0]=>
&int(1)
[1]=>
&int(1)
}
array(3) {
[2]=>
&string(10) "b0.changed"
[0]=>
&string(10) "b0.changed"
[1]=>
&string(10) "b0.changed"
}
array(3) {
[2]=>
&string(10) "b1.changed"
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
}
array(3) {
[2]=>
&string(10) "b2.changed"
[0]=>
&string(10) "b2.changed"
[1]=>
&string(10) "b2.changed"
}
--- 0,2 ref 1:
array(3) {
[1]=>
&int(1)
[0]=>
&int(1)
[2]=>
&int(1)
}
string(30) "a:3:{i:1;i:1;i:0;R:2;i:2;R:2;}"
array(3) {
[1]=>
&int(1)
[0]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[1]=>
&string(10) "b0.changed"
[0]=>
&string(10) "b0.changed"
[2]=>
&string(10) "b0.changed"
}
array(3) {
[1]=>
&string(10) "b1.changed"
[0]=>
&string(10) "b1.changed"
[2]=>
&string(10) "b1.changed"
}
array(3) {
[1]=>
&string(10) "b2.changed"
[0]=>
&string(10) "b2.changed"
[2]=>
&string(10) "b2.changed"
}
--- 1,2 ref 0:
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
string(30) "a:3:{i:0;i:1;i:1;R:2;i:2;R:2;}"
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
&string(10) "b0.changed"
[1]=>
&string(10) "b0.changed"
[2]=>
&string(10) "b0.changed"
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
&string(10) "b1.changed"
}
array(3) {
[0]=>
&string(10) "b2.changed"
[1]=>
&string(10) "b2.changed"
[2]=>
&string(10) "b2.changed"
}
Done
--UEXPECTF--
--- No references:
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 0 refs 1:
array(3) {
[1]=>
&int(1)
[0]=>
&int(1)
[2]=>
int(1)
}
unicode(30) "a:3:{i:1;i:1;i:0;R:2;i:2;i:1;}"
array(3) {
[1]=>
&int(1)
[0]=>
&int(1)
[2]=>
int(1)
}
array(3) {
[1]=>
&unicode(10) "b0.changed"
[0]=>
&unicode(10) "b0.changed"
[2]=>
int(1)
}
array(3) {
[1]=>
&unicode(10) "b1.changed"
[0]=>
&unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[1]=>
&unicode(10) "b1.changed"
[0]=>
&unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 0 refs 2:
array(3) {
[2]=>
&int(1)
[0]=>
&int(1)
[1]=>
int(1)
}
unicode(30) "a:3:{i:2;i:1;i:0;R:2;i:1;i:1;}"
array(3) {
[2]=>
&int(1)
[0]=>
&int(1)
[1]=>
int(1)
}
array(3) {
[2]=>
&unicode(10) "b0.changed"
[0]=>
&unicode(10) "b0.changed"
[1]=>
int(1)
}
array(3) {
[2]=>
&unicode(10) "b0.changed"
[0]=>
&unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
}
array(3) {
[2]=>
&unicode(10) "b2.changed"
[0]=>
&unicode(10) "b2.changed"
[1]=>
unicode(10) "b1.changed"
}
--- 1 refs 0:
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;R:2;i:2;i:1;}"
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b0.changed"
[1]=>
&unicode(10) "b0.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 1 refs 2:
array(3) {
[0]=>
int(1)
[2]=>
&int(1)
[1]=>
&int(1)
}
unicode(30) "a:3:{i:0;i:1;i:2;i:1;i:1;R:3;}"
array(3) {
[0]=>
int(1)
[2]=>
&int(1)
[1]=>
&int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[2]=>
&int(1)
[1]=>
&int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[2]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[2]=>
&unicode(10) "b2.changed"
[1]=>
&unicode(10) "b2.changed"
}
--- 2 refs 0:
array(3) {
[0]=>
&int(1)
[1]=>
int(1)
[2]=>
&int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;i:1;i:2;R:2;}"
array(3) {
[0]=>
&int(1)
[1]=>
int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
&unicode(10) "b0.changed"
[1]=>
int(1)
[2]=>
&unicode(10) "b0.changed"
}
array(3) {
[0]=>
&unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
&unicode(10) "b0.changed"
}
array(3) {
[0]=>
&unicode(10) "b2.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
&unicode(10) "b2.changed"
}
--- 2 refs 1:
array(3) {
[0]=>
int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;i:1;i:2;R:3;}"
array(3) {
[0]=>
int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
&unicode(10) "b1.changed"
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
&unicode(10) "b2.changed"
[2]=>
&unicode(10) "b2.changed"
}
--- 0,1 ref 2:
array(3) {
[2]=>
&int(1)
[0]=>
&int(1)
[1]=>
&int(1)
}
unicode(30) "a:3:{i:2;i:1;i:0;R:2;i:1;R:2;}"
array(3) {
[2]=>
&int(1)
[0]=>
&int(1)
[1]=>
&int(1)
}
array(3) {
[2]=>
&unicode(10) "b0.changed"
[0]=>
&unicode(10) "b0.changed"
[1]=>
&unicode(10) "b0.changed"
}
array(3) {
[2]=>
&unicode(10) "b1.changed"
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
}
array(3) {
[2]=>
&unicode(10) "b2.changed"
[0]=>
&unicode(10) "b2.changed"
[1]=>
&unicode(10) "b2.changed"
}
--- 0,2 ref 1:
array(3) {
[1]=>
&int(1)
[0]=>
&int(1)
[2]=>
&int(1)
}
unicode(30) "a:3:{i:1;i:1;i:0;R:2;i:2;R:2;}"
array(3) {
[1]=>
&int(1)
[0]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[1]=>
&unicode(10) "b0.changed"
[0]=>
&unicode(10) "b0.changed"
[2]=>
&unicode(10) "b0.changed"
}
array(3) {
[1]=>
&unicode(10) "b1.changed"
[0]=>
&unicode(10) "b1.changed"
[2]=>
&unicode(10) "b1.changed"
}
array(3) {
[1]=>
&unicode(10) "b2.changed"
[0]=>
&unicode(10) "b2.changed"
[2]=>
&unicode(10) "b2.changed"
}
--- 1,2 ref 0:
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;R:2;i:2;R:2;}"
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
&unicode(10) "b0.changed"
[1]=>
&unicode(10) "b0.changed"
[2]=>
&unicode(10) "b0.changed"
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
&unicode(10) "b1.changed"
}
array(3) {
[0]=>
&unicode(10) "b2.changed"
[1]=>
&unicode(10) "b2.changed"
[2]=>
&unicode(10) "b2.changed"
}
Done

View File

@@ -0,0 +1,516 @@
--TEST--
serialization: arrays with references to an external variable
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
function check(&$a) {
var_dump($a);
$ser = serialize($a);
var_dump($ser);
$b = unserialize($ser);
var_dump($b);
$b[0] = "b0.changed";
var_dump($b);
$b[1] = "b1.changed";
var_dump($b);
$b[2] = "b2.changed";
var_dump($b);
}
echo "\n\n--- 0 refs external:\n";
$ext = 1;
$a = array();
$a[0] = &$ext;
$a[1] = 1;
$a[2] = 1;
check($a);
echo "\n\n--- 1 refs external:\n";
$ext = 1;
$a = array();
$a[0] = 1;
$a[1] = &$ext;
$a[2] = 1;
check($a);
echo "\n\n--- 2 refs external:\n";
$ext = 1;
$a = array();
$a[0] = 1;
$a[1] = 1;
$a[2] = &$ext;
check($a);
echo "\n\n--- 1,2 ref external:\n";
$ext = 1;
$a = array();
$a[0] = &$ext;
$a[1] = &$ext;
$a[2] = 1;
check($a);
echo "\n\n--- 1,2,3 ref external:\n";
$ext = 1;
$a = array();
$a[0] = &$ext;
$a[1] = &$ext;
$a[2] = &$ext;
check($a);
echo "Done";
?>
--EXPECTF--
--- 0 refs external:
array(3) {
[0]=>
&int(1)
[1]=>
int(1)
[2]=>
int(1)
}
string(30) "a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 1 refs external:
array(3) {
[0]=>
int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
string(30) "a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 2 refs external:
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
&int(1)
}
string(30) "a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 1,2 ref external:
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
string(30) "a:3:{i:0;i:1;i:1;R:2;i:2;i:1;}"
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b0.changed"
[1]=>
&string(10) "b0.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 1,2,3 ref external:
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
string(30) "a:3:{i:0;i:1;i:1;R:2;i:2;R:2;}"
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
&string(10) "b0.changed"
[1]=>
&string(10) "b0.changed"
[2]=>
&string(10) "b0.changed"
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
&string(10) "b1.changed"
}
array(3) {
[0]=>
&string(10) "b2.changed"
[1]=>
&string(10) "b2.changed"
[2]=>
&string(10) "b2.changed"
}
Done
--UEXPECTF--
--- 0 refs external:
array(3) {
[0]=>
&int(1)
[1]=>
int(1)
[2]=>
int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 1 refs external:
array(3) {
[0]=>
int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 2 refs external:
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
&int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
int(1)
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 1,2 ref external:
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;R:2;i:2;i:1;}"
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b0.changed"
[1]=>
&unicode(10) "b0.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 1,2,3 ref external:
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
unicode(30) "a:3:{i:0;i:1;i:1;R:2;i:2;R:2;}"
array(3) {
[0]=>
&int(1)
[1]=>
&int(1)
[2]=>
&int(1)
}
array(3) {
[0]=>
&unicode(10) "b0.changed"
[1]=>
&unicode(10) "b0.changed"
[2]=>
&unicode(10) "b0.changed"
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
&unicode(10) "b1.changed"
}
array(3) {
[0]=>
&unicode(10) "b2.changed"
[1]=>
&unicode(10) "b2.changed"
[2]=>
&unicode(10) "b2.changed"
}
Done

View File

@@ -0,0 +1,881 @@
--TEST--
serialization: arrays with references to the containing array
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
function check(&$a) {
var_dump($a);
$ser = serialize($a);
var_dump($ser);
$b = unserialize($ser);
var_dump($b);
$b[0] = "b0.changed";
var_dump($b);
$b[1] = "b1.changed";
var_dump($b);
$b[2] = "b2.changed";
var_dump($b);
}
echo "\n\n--- 1 refs container:\n";
$a = array();
$a[0] = &$a;
$a[1] = 1;
$a[2] = 1;
check($a);
echo "\n\n--- 1,2 ref container:\n";
$a = array();
$a[0] = &$a;
$a[1] = &$a;
$a[2] = 1;
check($a);
echo "\n\n--- 1,2,3 ref container:\n";
$a = array();
$a[0] = &$a;
$a[1] = &$a;
$a[2] = &$a;
check($a);
echo "Done";
?>
--EXPECTF--
--- 1 refs container:
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
int(1)
[2]=>
int(1)
}
[1]=>
int(1)
[2]=>
int(1)
}
[1]=>
int(1)
[2]=>
int(1)
}
string(56) "a:3:{i:0;a:3:{i:0;R:2;i:1;i:1;i:2;i:1;}i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
int(1)
[2]=>
int(1)
}
[1]=>
int(1)
[2]=>
int(1)
}
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
%string(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
%string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
%string(10) "b0.changed"
[1]=>
string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 1,2 ref container:
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[2]=>
int(1)
}
[2]=>
int(1)
}
string(56) "a:3:{i:0;a:3:{i:0;R:2;i:1;R:2;i:2;i:1;}i:1;R:2;i:2;i:1;}"
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[2]=>
int(1)
}
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b0.changed"
[1]=>
&string(10) "b0.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
string(10) "b2.changed"
}
--- 1,2,3 ref container:
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
[1]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
[2]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
}
string(56) "a:3:{i:0;a:3:{i:0;R:2;i:1;R:2;i:2;R:2;}i:1;R:2;i:2;R:2;}"
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
[1]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
[2]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
}
array(3) {
[0]=>
&string(10) "b0.changed"
[1]=>
&string(10) "b0.changed"
[2]=>
&string(10) "b0.changed"
}
array(3) {
[0]=>
&string(10) "b1.changed"
[1]=>
&string(10) "b1.changed"
[2]=>
&string(10) "b1.changed"
}
array(3) {
[0]=>
&string(10) "b2.changed"
[1]=>
&string(10) "b2.changed"
[2]=>
&string(10) "b2.changed"
}
Done
--UEXPECTF--
--- 1 refs container:
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
int(1)
[2]=>
int(1)
}
[1]=>
int(1)
[2]=>
int(1)
}
[1]=>
int(1)
[2]=>
int(1)
}
unicode(56) "a:3:{i:0;a:3:{i:0;R:2;i:1;i:1;i:2;i:1;}i:1;i:1;i:2;i:1;}"
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
int(1)
[2]=>
int(1)
}
[1]=>
int(1)
[2]=>
int(1)
}
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
int(1)
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
unicode(10) "b0.changed"
[1]=>
unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 1,2 ref container:
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[2]=>
int(1)
}
[2]=>
int(1)
}
unicode(56) "a:3:{i:0;a:3:{i:0;R:2;i:1;R:2;i:2;i:1;}i:1;R:2;i:2;i:1;}"
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
int(1)
}
[2]=>
int(1)
}
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b0.changed"
[1]=>
&unicode(10) "b0.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
int(1)
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
unicode(10) "b2.changed"
}
--- 1,2,3 ref container:
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
[1]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
[2]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
}
unicode(56) "a:3:{i:0;a:3:{i:0;R:2;i:1;R:2;i:2;R:2;}i:1;R:2;i:2;R:2;}"
array(3) {
[0]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
[1]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
[2]=>
&array(3) {
[0]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[1]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
[2]=>
&array(3) {
[0]=>
*RECURSION*
[1]=>
*RECURSION*
[2]=>
*RECURSION*
}
}
}
array(3) {
[0]=>
&unicode(10) "b0.changed"
[1]=>
&unicode(10) "b0.changed"
[2]=>
&unicode(10) "b0.changed"
}
array(3) {
[0]=>
&unicode(10) "b1.changed"
[1]=>
&unicode(10) "b1.changed"
[2]=>
&unicode(10) "b1.changed"
}
array(3) {
[0]=>
&unicode(10) "b2.changed"
[1]=>
&unicode(10) "b2.changed"
[2]=>
&unicode(10) "b2.changed"
}
Done

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,42 @@
--TEST--
Test serialize() & unserialize() functions: error conditions - wrong number of args.
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
echo "*** Testing serialize()/unserialize() : error conditions ***\n";
// Zero arguments
var_dump( serialize() );
var_dump( unserialize() );
//Test serialize with one more than the expected number of arguments
var_dump( serialize(1,2) );
var_dump( unserialize(1,2) );
echo "Done";
?>
--EXPECTF--
*** Testing serialize()/unserialize() : error conditions ***
Warning: Wrong parameter count for serialize() in %s on line 16
NULL
Warning: unserialize() expects exactly 1 parameter, 0 given in %s on line 17
bool(false)
Warning: Wrong parameter count for serialize() in %s on line 20
NULL
Warning: unserialize() expects exactly 1 parameter, 2 given in %s on line 21
bool(false)
Done

View File

@@ -0,0 +1,82 @@
--TEST--
Test serialize() & unserialize() functions: objects (abstract classes)
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
echo "\n--- Testing Abstract Class ---\n";
// abstract class
abstract class Name
{
public function Name() {
$this->a = 10;
$this->b = 12.222;
$this->c = "string";
}
abstract protected function getClassName();
public function printClassName () {
return $this->getClassName();
}
}
// implement abstract class
class extendName extends Name
{
var $a, $b, $c;
protected function getClassName() {
return "extendName";
}
}
$obj_extendName = new extendName();
$serialize_data = serialize($obj_extendName);
var_dump( $serialize_data );
$unserialize_data = unserialize($serialize_data);
var_dump( $unserialize_data );
$serialize_data = serialize($obj_extendName->printClassName());
var_dump( $serialize_data );
$unserialize_data = unserialize($serialize_data);
var_dump( $unserialize_data );
echo "\nDone";
?>
--EXPECTF--
--- Testing Abstract Class ---
string(119) "O:10:"extendName":3:{S:1:"a";i:10;S:1:"b";d:12.2219999999999995310417943983338773250579833984375;S:1:"c";S:6:"string";}"
object(extendName)#%d (3) {
["a"]=>
int(10)
["b"]=>
float(12.222)
["c"]=>
string(6) "string"
}
string(18) "S:10:"extendName";"
string(10) "extendName"
Done
--UEXPECTF--
--- Testing Abstract Class ---
unicode(119) "O:10:"extendName":3:{U:1:"a";i:10;U:1:"b";d:12.2219999999999995310417943983338773250579833984375;U:1:"c";U:6:"string";}"
object(extendName)#%d (3) {
[u"a"]=>
int(10)
[u"b"]=>
float(12.222)
[u"c"]=>
unicode(6) "string"
}
unicode(18) "U:10:"extendName";"
unicode(10) "extendName"
Done

View File

@@ -0,0 +1,57 @@
--TEST--
Test serialize() & unserialize() functions: objects - ensure that COW references of objects are not serialized separately (unlike other types).
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
$x = new stdClass;
$ref = &$x;
var_dump(serialize(array($x, $x)));
$x = 1;
$ref = &$x;
var_dump(serialize(array($x, $x)));
$x = "a";
$ref = &$x;
var_dump(serialize(array($x, $x)));
$x = true;
$ref = &$x;
var_dump(serialize(array($x, $x)));
$x = null;
$ref = &$x;
var_dump(serialize(array($x, $x)));
$x = array();
$ref = &$x;
var_dump(serialize(array($x, $x)));
echo "Done";
?>
--EXPECTF--
string(37) "a:2:{i:0;O:8:"stdClass":0:{}i:1;r:2;}"
string(22) "a:2:{i:0;i:1;i:1;i:1;}"
string(30) "a:2:{i:0;S:1:"a";i:1;S:1:"a";}"
string(22) "a:2:{i:0;b:1;i:1;b:1;}"
string(18) "a:2:{i:0;N;i:1;N;}"
string(26) "a:2:{i:0;a:0:{}i:1;a:0:{}}"
Done
--UEXPECTF--
unicode(37) "a:2:{i:0;O:8:"stdClass":0:{}i:1;r:2;}"
unicode(22) "a:2:{i:0;i:1;i:1;i:1;}"
unicode(30) "a:2:{i:0;U:1:"a";i:1;U:1:"a";}"
unicode(22) "a:2:{i:0;b:1;i:1;b:1;}"
unicode(18) "a:2:{i:0;N;i:1;N;}"
unicode(26) "a:2:{i:0;a:0:{}i:1;a:0:{}}"
Done

View File

@@ -0,0 +1,175 @@
--TEST--
Check behaviour of incomplete class
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
$serialized = 'O:1:"C":1:{s:1:"p";i:1;}';
$incomplete = unserialize($serialized);
eval('Class C {}');
$complete = unserialize($serialized);
echo "\n\n---> Various types of access on complete class:\n" ;
var_dump($complete);
var_dump(is_object($complete));
var_dump($complete->p);
$ref1 = "ref1.original";
$complete->p = &$ref1;
var_dump($complete->p);
$ref1 = "ref1.changed";
var_dump($complete->p);
$complete->p = "p.changed";
var_dump($ref1);
var_dump(isset($complete->x));
$complete->x = "x.new";
var_dump(isset($complete->x));
unset($complete->x);
var_dump($complete->x);
echo "\n\n---> Same types of access on incomplete class:\n" ;
var_dump($incomplete);
var_dump(is_object($incomplete));
var_dump($incomplete->p);
$ref2 = "ref1.original";
$incomplete->p = &$ref2;
var_dump($incomplete->p);
$ref2 = "ref1.changed";
var_dump($incomplete->p);
$incomplete->p = "p.changed";
var_dump($ref1);
var_dump(isset($incomplete->x));
$incomplete->x = "x.new";
var_dump(isset($incomplete->x));
unset($incomplete->x);
var_dump($incomplete->x);
$incomplete->f();
echo "Done";
?>
--EXPECTF--
---> Various types of access on complete class:
object(C)#%d (1) {
["p"]=>
int(1)
}
bool(true)
int(1)
string(13) "ref1.original"
string(12) "ref1.changed"
string(9) "p.changed"
bool(false)
bool(true)
Notice: Undefined property: C::$x in %s on line 37
NULL
---> Same types of access on incomplete class:
object(__PHP_Incomplete_Class)#%d (2) {
["__PHP_Incomplete_Class_Name"]=>
string(1) "C"
["p"]=>
int(1)
}
bool(false)
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 43
NULL
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 46
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 47
NULL
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 49
NULL
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 50
string(9) "p.changed"
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 53
bool(false)
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 54
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 55
bool(false)
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 56
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 57
NULL
Fatal error: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 59
--UEXPECTF--
---> Various types of access on complete class:
object(C)#%d (1) {
[u"p"]=>
int(1)
}
bool(true)
int(1)
unicode(13) "ref1.original"
unicode(12) "ref1.changed"
unicode(9) "p.changed"
bool(false)
bool(true)
Notice: Undefined property: C::$x in %s on line 37
NULL
---> Same types of access on incomplete class:
object(__PHP_Incomplete_Class)#%d (2) {
[u"__PHP_Incomplete_Class_Name"]=>
unicode(1) "C"
[u"p"]=>
int(1)
}
bool(false)
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 43
NULL
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 46
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 47
NULL
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 49
NULL
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 50
unicode(9) "p.changed"
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 53
bool(false)
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 54
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 55
bool(false)
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 56
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 57
NULL
Fatal error: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "C" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 59

View File

@@ -0,0 +1,28 @@
--TEST--
Behaviour of incomplete class is preserved even when it was not created by unserialize().
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
$a = new __PHP_Incomplete_Class;
var_dump($a);
var_dump($a->p);
echo "Done";
?>
--EXPECTF--
object(__PHP_Incomplete_Class)#%d (0) {
}
Notice: main(): The script tried to execute a method or access a property of an incomplete object. Please ensure that the class definition "unknown" of the object you are trying to operate on was loaded _before_ unserialize() gets called or provide a __autoload() function to load the class definition in %s on line 15
NULL
Done

View File

@@ -0,0 +1,53 @@
--TEST--
Ensure __autoload is called twice if unserialize_callback_func is defined.
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
function __autoload($name) {
echo "in __autoload($name)\n";
}
ini_set('unserialize_callback_func','check');
function check($name) {
echo "in check($name)\n";
}
$o = unserialize('O:3:"FOO":0:{}');
var_dump($o);
echo "Done";
?>
--EXPECTF--
in __autoload(FOO)
in check(FOO)
in __autoload(FOO)
Warning: unserialize(): Function check() hasn't defined the class it was called for in %s on line 23
object(__PHP_Incomplete_Class)#%d (1) {
["__PHP_Incomplete_Class_Name"]=>
string(3) "FOO"
}
Done
--UEXPECTF--
in __autoload(FOO)
in check(FOO)
in __autoload(FOO)
Warning: unserialize(): Function check() hasn't defined the class it was called for in %s on line 23
object(__PHP_Incomplete_Class)#%d (1) {
[u"__PHP_Incomplete_Class_Name"]=>
unicode(3) "FOO"
}
Done

View File

@@ -0,0 +1,36 @@
--TEST--
Bad unserialize_callback_func
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
ini_set('unserialize_callback_func','Nonexistent');
$o = unserialize('O:3:"FOO":0:{}');
var_dump($o);
echo "Done";
?>
--EXPECTF--
Warning: unserialize(): defined (Nonexistent) but not found in %s on line 14
object(__PHP_Incomplete_Class)#%d (1) {
["__PHP_Incomplete_Class_Name"]=>
string(3) "FOO"
}
Done
--UEXPECTF--
Warning: unserialize(): defined (Nonexistent) but not found in %s on line 14
object(__PHP_Incomplete_Class)#%d (1) {
[u"__PHP_Incomplete_Class_Name"]=>
unicode(3) "FOO"
}
Done

View File

@@ -0,0 +1,36 @@
--TEST--
Custom unserialization of classes with no custom unserializer.
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
$ser = 'C:1:"C":6:{dasdas}';
$a = unserialize($ser);
eval('class C {}');
$b = unserialize($ser);
var_dump($a, $b);
echo "Done";
?>
--EXPECTF--
Warning: Class __PHP_Incomplete_Class has no unserializer in %s on line 14
Notice: unserialize(): Error at offset 6 of 18 bytes in %s on line 14
Warning: Class C has no unserializer in %s on line 16
Notice: unserialize(): Error at offset 6 of 18 bytes in %s on line 16
bool(false)
bool(false)
Done

View File

@@ -0,0 +1,37 @@
--TEST--
Serialize() must return a string or NULL
--SKIPIF--
<?php if (!interface_exists('Serializable')) die('skip Interface Serialzable not defined'); ?>
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
Class C implements Serializable {
public function serialize() {
return $this;
}
public function unserialize($blah) {
}
}
try {
var_dump(serialize(new C));
} catch (Exception $e) {
echo $e->getMessage(). "\n";
}
echo "Done";
?>
--EXPECTF--
C::serialize() must return a string or NULL
Done

View File

@@ -0,0 +1,314 @@
--TEST--
Object serialization / unserialization with inherited and hidden properties.
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
Class A {
private $APriv = "A.APriv";
protected $AProt = "A.AProt";
public $APub = "A.APub";
function audit() {
return isset($this->APriv, $this->AProt, $this->APub);
}
}
Class B extends A {
private $BPriv = "B.BPriv";
protected $BProt = "B.BProt";
public $BPub = "B.BPub";
function audit() {
return parent::audit() && isset($this->AProt, $this->APub,
$this->BPriv, $this->BProt, $this->BPub);
}
}
Class C extends B {
private $APriv = "C.APriv";
protected $AProt = "C.AProt";
public $APub = "C.APub";
private $CPriv = "C.CPriv";
protected $CProt = "C.BProt";
public $CPub = "C.CPub";
function audit() {
return parent::audit() && isset($this->APriv, $this->AProt, $this->APub,
$this->BProt, $this->BPub,
$this->CPriv, $this->CProt, $this->CPub);
}
}
function prettyPrint($obj) {
echo "\n\nBefore serialization:\n";
var_dump($obj);
echo "Serialized form:\n";
$ser = serialize($obj);
$serPrintable = str_replace("\0", '\0', $ser);
var_dump($serPrintable);
echo "Unserialized:\n";
$uobj = unserialize($ser);
var_dump($uobj);
echo "Sanity check: ";
var_dump($uobj->audit());
}
echo "-- Test instance of A --\n";
prettyPrint(new A);
echo "\n\n-- Test instance of B --\n";
prettyPrint(new B);
echo "\n\n-- Test instance of C --\n";
prettyPrint(new C);
echo "Done";
?>
--EXPECTF--
-- Test instance of A --
Before serialization:
object(A)#%d (3) {
["APriv":"A":private]=>
string(7) "A.APriv"
["AProt":protected]=>
string(7) "A.AProt"
["APub"]=>
string(6) "A.APub"
}
Serialized form:
string(98) "O:1:"A":3:{S:8:"\0A\0APriv";S:7:"A.APriv";S:8:"\0*\0AProt";S:7:"A.AProt";S:4:"APub";S:6:"A.APub";}"
Unserialized:
object(A)#%d (3) {
["APriv":"A":private]=>
string(7) "A.APriv"
["AProt":protected]=>
string(7) "A.AProt"
["APub"]=>
string(6) "A.APub"
}
Sanity check: bool(true)
-- Test instance of B --
Before serialization:
object(B)#%d (6) {
["BPriv":"B":private]=>
string(7) "B.BPriv"
["BProt":protected]=>
string(7) "B.BProt"
["BPub"]=>
string(6) "B.BPub"
["APriv":"A":private]=>
string(7) "A.APriv"
["AProt":protected]=>
string(7) "A.AProt"
["APub"]=>
string(6) "A.APub"
}
Serialized form:
string(184) "O:1:"B":6:{S:8:"\0B\0BPriv";S:7:"B.BPriv";S:8:"\0*\0BProt";S:7:"B.BProt";S:4:"BPub";S:6:"B.BPub";S:8:"\0A\0APriv";S:7:"A.APriv";S:8:"\0*\0AProt";S:7:"A.AProt";S:4:"APub";S:6:"A.APub";}"
Unserialized:
object(B)#%d (6) {
["BPriv":"B":private]=>
string(7) "B.BPriv"
["BProt":protected]=>
string(7) "B.BProt"
["BPub"]=>
string(6) "B.BPub"
["APriv":"A":private]=>
string(7) "A.APriv"
["AProt":protected]=>
string(7) "A.AProt"
["APub"]=>
string(6) "A.APub"
}
Sanity check: bool(true)
-- Test instance of C --
Before serialization:
object(C)#%d (10) {
["APriv":"C":private]=>
string(7) "C.APriv"
["AProt":protected]=>
string(7) "C.AProt"
["APub"]=>
string(6) "C.APub"
["CPriv":"C":private]=>
string(7) "C.CPriv"
["CProt":protected]=>
string(7) "C.BProt"
["CPub"]=>
string(6) "C.CPub"
["BPriv":"B":private]=>
string(7) "B.BPriv"
["BProt":protected]=>
string(7) "B.BProt"
["BPub"]=>
string(6) "B.BPub"
["APriv":"A":private]=>
string(7) "A.APriv"
}
Serialized form:
string(302) "O:1:"C":10:{S:8:"\0C\0APriv";S:7:"C.APriv";S:8:"\0*\0AProt";S:7:"C.AProt";S:4:"APub";S:6:"C.APub";S:8:"\0C\0CPriv";S:7:"C.CPriv";S:8:"\0*\0CProt";S:7:"C.BProt";S:4:"CPub";S:6:"C.CPub";S:8:"\0B\0BPriv";S:7:"B.BPriv";S:8:"\0*\0BProt";S:7:"B.BProt";S:4:"BPub";S:6:"B.BPub";S:8:"\0A\0APriv";S:7:"A.APriv";}"
Unserialized:
object(C)#%d (10) {
["APriv":"C":private]=>
string(7) "C.APriv"
["AProt":protected]=>
string(7) "C.AProt"
["APub"]=>
string(6) "C.APub"
["CPriv":"C":private]=>
string(7) "C.CPriv"
["CProt":protected]=>
string(7) "C.BProt"
["CPub"]=>
string(6) "C.CPub"
["BPriv":"B":private]=>
string(7) "B.BPriv"
["BProt":protected]=>
string(7) "B.BProt"
["BPub"]=>
string(6) "B.BPub"
["APriv":"A":private]=>
string(7) "A.APriv"
}
Sanity check: bool(true)
Done
--UEXPECTF--
-- Test instance of A --
Before serialization:
object(A)#%d (3) {
[u"APriv":u"A":private]=>
unicode(7) "A.APriv"
[u"AProt":protected]=>
unicode(7) "A.AProt"
[u"APub"]=>
unicode(6) "A.APub"
}
Serialized form:
unicode(98) "O:1:"A":3:{U:8:"\0A\0APriv";U:7:"A.APriv";U:8:"\0*\0AProt";U:7:"A.AProt";U:4:"APub";U:6:"A.APub";}"
Unserialized:
object(A)#%d (3) {
[u"APriv":u"A":private]=>
unicode(7) "A.APriv"
[u"AProt":protected]=>
unicode(7) "A.AProt"
[u"APub"]=>
unicode(6) "A.APub"
}
Sanity check: bool(true)
-- Test instance of B --
Before serialization:
object(B)#%d (6) {
[u"BPriv":u"B":private]=>
unicode(7) "B.BPriv"
[u"BProt":protected]=>
unicode(7) "B.BProt"
[u"BPub"]=>
unicode(6) "B.BPub"
[u"APriv":u"A":private]=>
unicode(7) "A.APriv"
[u"AProt":protected]=>
unicode(7) "A.AProt"
[u"APub"]=>
unicode(6) "A.APub"
}
Serialized form:
unicode(184) "O:1:"B":6:{U:8:"\0B\0BPriv";U:7:"B.BPriv";U:8:"\0*\0BProt";U:7:"B.BProt";U:4:"BPub";U:6:"B.BPub";U:8:"\0A\0APriv";U:7:"A.APriv";U:8:"\0*\0AProt";U:7:"A.AProt";U:4:"APub";U:6:"A.APub";}"
Unserialized:
object(B)#%d (6) {
[u"BPriv":u"B":private]=>
unicode(7) "B.BPriv"
[u"BProt":protected]=>
unicode(7) "B.BProt"
[u"BPub"]=>
unicode(6) "B.BPub"
[u"APriv":u"A":private]=>
unicode(7) "A.APriv"
[u"AProt":protected]=>
unicode(7) "A.AProt"
[u"APub"]=>
unicode(6) "A.APub"
}
Sanity check: bool(true)
-- Test instance of C --
Before serialization:
object(C)#%d (10) {
[u"APriv":u"C":private]=>
unicode(7) "C.APriv"
[u"AProt":protected]=>
unicode(7) "C.AProt"
[u"APub"]=>
unicode(6) "C.APub"
[u"CPriv":u"C":private]=>
unicode(7) "C.CPriv"
[u"CProt":protected]=>
unicode(7) "C.BProt"
[u"CPub"]=>
unicode(6) "C.CPub"
[u"BPriv":u"B":private]=>
unicode(7) "B.BPriv"
[u"BProt":protected]=>
unicode(7) "B.BProt"
[u"BPub"]=>
unicode(6) "B.BPub"
[u"APriv":u"A":private]=>
unicode(7) "A.APriv"
}
Serialized form:
unicode(302) "O:1:"C":10:{U:8:"\0C\0APriv";U:7:"C.APriv";U:8:"\0*\0AProt";U:7:"C.AProt";U:4:"APub";U:6:"C.APub";U:8:"\0C\0CPriv";U:7:"C.CPriv";U:8:"\0*\0CProt";U:7:"C.BProt";U:4:"CPub";U:6:"C.CPub";U:8:"\0B\0BPriv";U:7:"B.BPriv";U:8:"\0*\0BProt";U:7:"B.BProt";U:4:"BPub";U:6:"B.BPub";U:8:"\0A\0APriv";U:7:"A.APriv";}"
Unserialized:
object(C)#%d (10) {
[u"APriv":u"C":private]=>
unicode(7) "C.APriv"
[u"AProt":protected]=>
unicode(7) "C.AProt"
[u"APub"]=>
unicode(6) "C.APub"
[u"CPriv":u"C":private]=>
unicode(7) "C.CPriv"
[u"CProt":protected]=>
unicode(7) "C.BProt"
[u"CPub"]=>
unicode(6) "C.CPub"
[u"BPriv":u"B":private]=>
unicode(7) "B.BPriv"
[u"BProt":protected]=>
unicode(7) "B.BProt"
[u"BPub"]=>
unicode(6) "B.BPub"
[u"APriv":u"A":private]=>
unicode(7) "A.APriv"
}
Sanity check: bool(true)
Done

View File

@@ -0,0 +1,402 @@
--TEST--
Object serialization / unserialization: real references and COW references
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
echo "\n\nArray containing same object twice:\n";
$obj = new stdclass;
$a[0] = $obj;
$a[1] = $a[0];
var_dump($a);
$ser = serialize($a);
var_dump($ser);
$ua = unserialize($ser);
var_dump($ua);
$ua[0]->a = "newProp";
var_dump($ua);
$ua[0] = "a0.changed";
var_dump($ua);
echo "\n\nArray containing object and reference to that object:\n";
$obj = new stdclass;
$a[0] = $obj;
$a[1] = &$a[0];
var_dump($a);
$ser = serialize($a);
var_dump($ser);
$ua = unserialize($ser);
var_dump($ua);
$ua[0]->a = "newProp";
var_dump($ua);
$ua[0] = "a0.changed";
var_dump($ua);
echo "\n\nObject containing same object twice:";
$obj = new stdclass;
$contaner = new stdclass;
$contaner->a = $obj;
$contaner->b = $contaner->a;
var_dump($contaner);
$ser = serialize($contaner);
var_dump($ser);
$ucontainer = unserialize($ser);
var_dump($ucontainer);
$ucontainer->a->a = "newProp";
var_dump($ucontainer);
$ucontainer->a = "container->a.changed";
var_dump($ucontainer);
echo "\n\nObject containing object and reference to that object:\n";
$obj = new stdclass;
$contaner = new stdclass;
$contaner->a = $obj;
$contaner->b = &$contaner->a;
var_dump($contaner);
$ser = serialize($contaner);
var_dump($ser);
$ucontainer = unserialize($ser);
var_dump($ucontainer);
$ucontainer->a->a = "newProp";
var_dump($ucontainer);
$ucontainer->b = "container->a.changed";
var_dump($ucontainer);
echo "Done";
?>
--EXPECTF--
Array containing same object twice:
array(2) {
[0]=>
object(stdClass)#%d (0) {
}
[1]=>
object(stdClass)#%d (0) {
}
}
string(37) "a:2:{i:0;O:8:"stdClass":0:{}i:1;r:2;}"
array(2) {
[0]=>
object(stdClass)#%d (0) {
}
[1]=>
object(stdClass)#%d (0) {
}
}
array(2) {
[0]=>
object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
[1]=>
object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
}
array(2) {
[0]=>
string(10) "a0.changed"
[1]=>
object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
}
Array containing object and reference to that object:
array(2) {
[0]=>
&object(stdClass)#%d (0) {
}
[1]=>
&object(stdClass)#%d (0) {
}
}
string(37) "a:2:{i:0;O:8:"stdClass":0:{}i:1;R:2;}"
array(2) {
[0]=>
&object(stdClass)#%d (0) {
}
[1]=>
&object(stdClass)#%d (0) {
}
}
array(2) {
[0]=>
&object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
[1]=>
&object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
}
array(2) {
[0]=>
&string(10) "a0.changed"
[1]=>
&string(10) "a0.changed"
}
Object containing same object twice:object(stdClass)#%d (2) {
["a"]=>
object(stdClass)#%d (0) {
}
["b"]=>
object(stdClass)#%d (0) {
}
}
string(58) "O:8:"stdClass":2:{S:1:"a";O:8:"stdClass":0:{}S:1:"b";r:2;}"
object(stdClass)#%d (2) {
["a"]=>
object(stdClass)#%d (0) {
}
["b"]=>
object(stdClass)#%d (0) {
}
}
object(stdClass)#%d (2) {
["a"]=>
object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
["b"]=>
object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
}
object(stdClass)#%d (2) {
["a"]=>
string(20) "container->a.changed"
["b"]=>
object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
}
Object containing object and reference to that object:
object(stdClass)#%d (2) {
["a"]=>
&object(stdClass)#%d (0) {
}
["b"]=>
&object(stdClass)#%d (0) {
}
}
string(58) "O:8:"stdClass":2:{S:1:"a";O:8:"stdClass":0:{}S:1:"b";R:2;}"
object(stdClass)#%d (2) {
["a"]=>
&object(stdClass)#%d (0) {
}
["b"]=>
&object(stdClass)#%d (0) {
}
}
object(stdClass)#%d (2) {
["a"]=>
&object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
["b"]=>
&object(stdClass)#%d (1) {
["a"]=>
string(7) "newProp"
}
}
object(stdClass)#%d (2) {
["a"]=>
&string(20) "container->a.changed"
["b"]=>
&string(20) "container->a.changed"
}
Done
--UEXPECTF--
Array containing same object twice:
array(2) {
[0]=>
object(stdClass)#%d (0) {
}
[1]=>
object(stdClass)#%d (0) {
}
}
unicode(37) "a:2:{i:0;O:8:"stdClass":0:{}i:1;r:2;}"
array(2) {
[0]=>
object(stdClass)#%d (0) {
}
[1]=>
object(stdClass)#%d (0) {
}
}
array(2) {
[0]=>
object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
[1]=>
object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
}
array(2) {
[0]=>
unicode(10) "a0.changed"
[1]=>
object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
}
Array containing object and reference to that object:
array(2) {
[0]=>
&object(stdClass)#%d (0) {
}
[1]=>
&object(stdClass)#%d (0) {
}
}
unicode(37) "a:2:{i:0;O:8:"stdClass":0:{}i:1;R:2;}"
array(2) {
[0]=>
&object(stdClass)#%d (0) {
}
[1]=>
&object(stdClass)#%d (0) {
}
}
array(2) {
[0]=>
&object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
[1]=>
&object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
}
array(2) {
[0]=>
&unicode(10) "a0.changed"
[1]=>
&unicode(10) "a0.changed"
}
Object containing same object twice:object(stdClass)#%d (2) {
[u"a"]=>
object(stdClass)#%d (0) {
}
[u"b"]=>
object(stdClass)#%d (0) {
}
}
unicode(58) "O:8:"stdClass":2:{U:1:"a";O:8:"stdClass":0:{}U:1:"b";r:2;}"
object(stdClass)#%d (2) {
[u"a"]=>
object(stdClass)#%d (0) {
}
[u"b"]=>
object(stdClass)#%d (0) {
}
}
object(stdClass)#%d (2) {
[u"a"]=>
object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
[u"b"]=>
object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
}
object(stdClass)#%d (2) {
[u"a"]=>
unicode(20) "container->a.changed"
[u"b"]=>
object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
}
Object containing object and reference to that object:
object(stdClass)#%d (2) {
[u"a"]=>
&object(stdClass)#%d (0) {
}
[u"b"]=>
&object(stdClass)#%d (0) {
}
}
unicode(58) "O:8:"stdClass":2:{U:1:"a";O:8:"stdClass":0:{}U:1:"b";R:2;}"
object(stdClass)#%d (2) {
[u"a"]=>
&object(stdClass)#%d (0) {
}
[u"b"]=>
&object(stdClass)#%d (0) {
}
}
object(stdClass)#%d (2) {
[u"a"]=>
&object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
[u"b"]=>
&object(stdClass)#%d (1) {
[u"a"]=>
unicode(7) "newProp"
}
}
object(stdClass)#%d (2) {
[u"a"]=>
&unicode(20) "container->a.changed"
[u"b"]=>
&unicode(20) "container->a.changed"
}
Done

View File

@@ -0,0 +1,890 @@
--TEST--
Object serialization / unserialization: references amongst properties
--INI--
error_reporting = E_ALL & ~E_STRICT
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
function check(&$obj) {
var_dump($obj);
$ser = serialize($obj);
var_dump($ser);
$uobj = unserialize($ser);
var_dump($uobj);
$uobj->a = "obj->a.changed";
var_dump($uobj);
$uobj->b = "obj->b.changed";
var_dump($uobj);
$uobj->c = "obj->c.changed";
var_dump($uobj);
}
echo "\n\n--- a refs b:\n";
$obj = new stdClass;
$obj->a = &$obj->b;
$obj->b = 1;
$obj->c = 1;
check($obj);
echo "\n\n--- a refs c:\n";
$obj = new stdClass;
$obj->a = &$obj->c;
$obj->b = 1;
$obj->c = 1;
check($obj);
echo "\n\n--- b refs a:\n";
$obj = new stdClass;
$obj->a = 1;
$obj->b = &$obj->a;
$obj->c = 1;
check($obj);
echo "\n\n--- b refs c:\n";
$obj = new stdClass;
$obj->a = 1;
$obj->b = &$obj->c;
$obj->c = 1;
check($obj);
echo "\n\n--- c refs a:\n";
$obj = new stdClass;
$obj->a = 1;
$obj->b = 1;
$obj->c = &$obj->a;
check($obj);
echo "\n\n--- c refs b:\n";
$obj = new stdClass;
$obj->a = 1;
$obj->b = 1;
$obj->c = &$obj->b;
check($obj);
echo "\n\n--- a,b refs c:\n";
$obj = new stdClass;
$obj->a = &$obj->c;
$obj->b = &$obj->c;
$obj->c = 1;
check($obj);
echo "\n\n--- a,c refs b:\n";
$obj = new stdClass;
$obj->a = &$obj->b;
$obj->b = 1;
$obj->c = &$obj->b;
check($obj);
echo "\n\n--- b,c refs a:\n";
$obj = new stdClass;
$obj->a = 1;
$obj->b = &$obj->a;
$obj->c = &$obj->a;
check($obj);
echo "Done";
?>
--EXPECTF--
--- a refs b:
object(stdClass)#%d (3) {
["b"]=>
&int(1)
["a"]=>
&int(1)
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"b";i:1;S:1:"a";R:2;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["b"]=>
&int(1)
["a"]=>
&int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["b"]=>
&string(14) "obj->a.changed"
["a"]=>
&string(14) "obj->a.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["b"]=>
&string(14) "obj->b.changed"
["a"]=>
&string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["b"]=>
&string(14) "obj->b.changed"
["a"]=>
&string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- a refs c:
object(stdClass)#%d (3) {
["c"]=>
&int(1)
["a"]=>
&int(1)
["b"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"c";i:1;S:1:"a";R:2;S:1:"b";i:1;}"
object(stdClass)#%d (3) {
["c"]=>
&int(1)
["a"]=>
&int(1)
["b"]=>
int(1)
}
object(stdClass)#%d (3) {
["c"]=>
&string(14) "obj->a.changed"
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
int(1)
}
object(stdClass)#%d (3) {
["c"]=>
&string(14) "obj->a.changed"
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
["c"]=>
&string(14) "obj->c.changed"
["a"]=>
&string(14) "obj->c.changed"
["b"]=>
string(14) "obj->b.changed"
}
--- b refs a:
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
&int(1)
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";R:2;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
&int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->a.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- b refs c:
object(stdClass)#%d (3) {
["a"]=>
int(1)
["c"]=>
&int(1)
["b"]=>
&int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"c";i:1;S:1:"b";R:3;}"
object(stdClass)#%d (3) {
["a"]=>
int(1)
["c"]=>
&int(1)
["b"]=>
&int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["c"]=>
&int(1)
["b"]=>
&int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["c"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["c"]=>
&string(14) "obj->c.changed"
["b"]=>
&string(14) "obj->c.changed"
}
--- c refs a:
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
int(1)
["c"]=>
&int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";i:1;S:1:"c";R:2;}"
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
int(1)
["c"]=>
&int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
int(1)
["c"]=>
&string(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
&string(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->c.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
&string(14) "obj->c.changed"
}
--- c refs b:
object(stdClass)#%d (3) {
["a"]=>
int(1)
["b"]=>
&int(1)
["c"]=>
&int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";i:1;S:1:"c";R:3;}"
object(stdClass)#%d (3) {
["a"]=>
int(1)
["b"]=>
&int(1)
["c"]=>
&int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
&int(1)
["c"]=>
&int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
&string(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->c.changed"
["c"]=>
&string(14) "obj->c.changed"
}
--- a,b refs c:
object(stdClass)#%d (3) {
["c"]=>
&int(1)
["a"]=>
&int(1)
["b"]=>
&int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"c";i:1;S:1:"a";R:2;S:1:"b";R:2;}"
object(stdClass)#%d (3) {
["c"]=>
&int(1)
["a"]=>
&int(1)
["b"]=>
&int(1)
}
object(stdClass)#%d (3) {
["c"]=>
&string(14) "obj->a.changed"
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
["c"]=>
&string(14) "obj->b.changed"
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
["c"]=>
&string(14) "obj->c.changed"
["a"]=>
&string(14) "obj->c.changed"
["b"]=>
&string(14) "obj->c.changed"
}
--- a,c refs b:
object(stdClass)#%d (3) {
["b"]=>
&int(1)
["a"]=>
&int(1)
["c"]=>
&int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"b";i:1;S:1:"a";R:2;S:1:"c";R:2;}"
object(stdClass)#%d (3) {
["b"]=>
&int(1)
["a"]=>
&int(1)
["c"]=>
&int(1)
}
object(stdClass)#%d (3) {
["b"]=>
&string(14) "obj->a.changed"
["a"]=>
&string(14) "obj->a.changed"
["c"]=>
&string(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
["b"]=>
&string(14) "obj->b.changed"
["a"]=>
&string(14) "obj->b.changed"
["c"]=>
&string(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
["b"]=>
&string(14) "obj->c.changed"
["a"]=>
&string(14) "obj->c.changed"
["c"]=>
&string(14) "obj->c.changed"
}
--- b,c refs a:
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
&int(1)
["c"]=>
&int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";R:2;S:1:"c";R:2;}"
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
&int(1)
["c"]=>
&int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->a.changed"
["c"]=>
&string(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
&string(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->c.changed"
["b"]=>
&string(14) "obj->c.changed"
["c"]=>
&string(14) "obj->c.changed"
}
Done
--UEXPECTF--
--- a refs b:
object(stdClass)#%d (3) {
[u"b"]=>
&int(1)
[u"a"]=>
&int(1)
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"b";i:1;U:1:"a";R:2;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"b"]=>
&int(1)
[u"a"]=>
&int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"b"]=>
&unicode(14) "obj->a.changed"
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- a refs c:
object(stdClass)#%d (3) {
[u"c"]=>
&int(1)
[u"a"]=>
&int(1)
[u"b"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"c";i:1;U:1:"a";R:2;U:1:"b";i:1;}"
object(stdClass)#%d (3) {
[u"c"]=>
&int(1)
[u"a"]=>
&int(1)
[u"b"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"c"]=>
&unicode(14) "obj->a.changed"
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"c"]=>
&unicode(14) "obj->a.changed"
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
[u"c"]=>
&unicode(14) "obj->c.changed"
[u"a"]=>
&unicode(14) "obj->c.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
}
--- b refs a:
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";R:2;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->a.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- b refs c:
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"c"]=>
&int(1)
[u"b"]=>
&int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"c";i:1;U:1:"b";R:3;}"
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"c"]=>
&int(1)
[u"b"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"c"]=>
&int(1)
[u"b"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"c"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"c"]=>
&unicode(14) "obj->c.changed"
[u"b"]=>
&unicode(14) "obj->c.changed"
}
--- c refs a:
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
int(1)
[u"c"]=>
&int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";i:1;U:1:"c";R:2;}"
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
int(1)
[u"c"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
int(1)
[u"c"]=>
&unicode(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
&unicode(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->c.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
&unicode(14) "obj->c.changed"
}
--- c refs b:
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"b"]=>
&int(1)
[u"c"]=>
&int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";i:1;U:1:"c";R:3;}"
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"b"]=>
&int(1)
[u"c"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
&int(1)
[u"c"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
&unicode(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->c.changed"
[u"c"]=>
&unicode(14) "obj->c.changed"
}
--- a,b refs c:
object(stdClass)#%d (3) {
[u"c"]=>
&int(1)
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"c";i:1;U:1:"a";R:2;U:1:"b";R:2;}"
object(stdClass)#%d (3) {
[u"c"]=>
&int(1)
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"c"]=>
&unicode(14) "obj->a.changed"
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
[u"c"]=>
&unicode(14) "obj->b.changed"
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
[u"c"]=>
&unicode(14) "obj->c.changed"
[u"a"]=>
&unicode(14) "obj->c.changed"
[u"b"]=>
&unicode(14) "obj->c.changed"
}
--- a,c refs b:
object(stdClass)#%d (3) {
[u"b"]=>
&int(1)
[u"a"]=>
&int(1)
[u"c"]=>
&int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"b";i:1;U:1:"a";R:2;U:1:"c";R:2;}"
object(stdClass)#%d (3) {
[u"b"]=>
&int(1)
[u"a"]=>
&int(1)
[u"c"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"b"]=>
&unicode(14) "obj->a.changed"
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"c"]=>
&unicode(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
&unicode(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
[u"b"]=>
&unicode(14) "obj->c.changed"
[u"a"]=>
&unicode(14) "obj->c.changed"
[u"c"]=>
&unicode(14) "obj->c.changed"
}
--- b,c refs a:
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
[u"c"]=>
&int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";R:2;U:1:"c";R:2;}"
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
[u"c"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->a.changed"
[u"c"]=>
&unicode(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
&unicode(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->c.changed"
[u"b"]=>
&unicode(14) "obj->c.changed"
[u"c"]=>
&unicode(14) "obj->c.changed"
}
Done

View File

@@ -0,0 +1,515 @@
--TEST--
Object serialization / unserialization: references to external values
--INI--
error_reporting = E_ALL & ~E_STRICT
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
function check(&$obj) {
var_dump($obj);
$ser = serialize($obj);
var_dump($ser);
$uobj = unserialize($ser);
var_dump($uobj);
$uobj->a = "obj->a.changed";
var_dump($uobj);
$uobj->b = "obj->b.changed";
var_dump($uobj);
$uobj->c = "obj->c.changed";
var_dump($uobj);
}
echo "\n\n--- a refs external:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = &$ext;
$obj->b = 1;
$obj->c = 1;
check($obj);
echo "\n\n--- b refs external:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = 1;
$obj->b = &$ext;
$obj->c = 1;
check($obj);
echo "\n\n--- c refs external:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = 1;
$obj->b = 1;
$obj->c = &$ext;
check($obj);
echo "\n\n--- a,b ref external:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = &$ext;
$obj->b = &$ext;
$obj->c = 1;
check($obj);
echo "\n\n--- a,b,c ref external:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = &$ext;
$obj->b = &$ext;
$obj->c = &$ext;
check($obj);
echo "Done";
?>
--EXPECTF--
--- a refs external:
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
int(1)
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";i:1;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
int(1)
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- b refs external:
object(stdClass)#%d (3) {
["a"]=>
int(1)
["b"]=>
&int(1)
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";i:1;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
int(1)
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- c refs external:
object(stdClass)#%d (3) {
["a"]=>
int(1)
["b"]=>
int(1)
["c"]=>
&int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";i:1;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
int(1)
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- a,b ref external:
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
&int(1)
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";R:2;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
&int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->a.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- a,b,c ref external:
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
&int(1)
["c"]=>
&int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";i:1;S:1:"b";R:2;S:1:"c";R:2;}"
object(stdClass)#%d (3) {
["a"]=>
&int(1)
["b"]=>
&int(1)
["c"]=>
&int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->a.changed"
["c"]=>
&string(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
&string(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->c.changed"
["b"]=>
&string(14) "obj->c.changed"
["c"]=>
&string(14) "obj->c.changed"
}
Done
--UEXPECTF--
--- a refs external:
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";i:1;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- b refs external:
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"b"]=>
&int(1)
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";i:1;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- c refs external:
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"b"]=>
int(1)
[u"c"]=>
&int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";i:1;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
int(1)
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- a,b ref external:
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";R:2;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->a.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- a,b,c ref external:
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
[u"c"]=>
&int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";i:1;U:1:"b";R:2;U:1:"c";R:2;}"
object(stdClass)#%d (3) {
[u"a"]=>
&int(1)
[u"b"]=>
&int(1)
[u"c"]=>
&int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->a.changed"
[u"c"]=>
&unicode(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
&unicode(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->c.changed"
[u"b"]=>
&unicode(14) "obj->c.changed"
[u"c"]=>
&unicode(14) "obj->c.changed"
}
Done

View File

@@ -0,0 +1,992 @@
--TEST--
Object serialization / unserialization: properties reference containing object
--INI--
error_reporting = E_ALL & ~E_STRICT
--FILE--
<?php
function check(&$obj) {
var_dump($obj);
$ser = serialize($obj);
var_dump($ser);
$uobj = unserialize($ser);
var_dump($uobj);
$uobj->a = "obj->a.changed";
var_dump($uobj);
$uobj->b = "obj->b.changed";
var_dump($uobj);
$uobj->c = "obj->c.changed";
var_dump($uobj);
}
echo "\n\n--- a refs container:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = &$obj;
$obj->b = 1;
$obj->c = 1;
check($obj);
echo "\n\n--- a eqs container:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = $obj;
$obj->b = 1;
$obj->c = 1;
check($obj);
echo "\n\n--- a,b ref container:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = &$obj;
$obj->b = &$obj;
$obj->c = 1;
check($obj);
echo "\n\n--- a,b eq container:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = $obj;
$obj->b = $obj;
$obj->c = 1;
check($obj);
echo "\n\n--- a,b,c ref container:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = &$obj;
$obj->b = &$obj;
$obj->c = &$obj;
check($obj);
echo "\n\n--- a,b,c eq container:\n";
$ext = 1;
$obj = new stdClass;
$obj->a = $obj;
$obj->b = $obj;
$obj->c = $obj;
check($obj);
echo "Done";
?>
--EXPECTF--
--- a refs container:
object(stdClass)#%d (3) {
["a"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
int(1)
["c"]=>
int(1)
}
["b"]=>
int(1)
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";R:1;S:1:"b";i:1;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
int(1)
["c"]=>
int(1)
}
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- a eqs container:
object(stdClass)#%d (3) {
["a"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
int(1)
["c"]=>
int(1)
}
["b"]=>
int(1)
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";r:1;S:1:"b";i:1;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
int(1)
["c"]=>
int(1)
}
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
int(1)
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- a,b ref container:
object(stdClass)#%d (3) {
["a"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["b"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";R:1;S:1:"b";R:1;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["b"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->a.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- a,b eq container:
object(stdClass)#%d (3) {
["a"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["b"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["c"]=>
int(1)
}
string(55) "O:8:"stdClass":3:{S:1:"a";r:1;S:1:"b";r:1;S:1:"c";i:1;}"
object(stdClass)#%d (3) {
["a"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["b"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
*RECURSION*
["c"]=>
int(1)
}
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
int(1)
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
--- a,b,c ref container:
object(stdClass)#%d (3) {
["a"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["b"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["c"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
}
string(55) "O:8:"stdClass":3:{S:1:"a";R:1;S:1:"b";R:1;S:1:"c";R:1;}"
object(stdClass)#%d (3) {
["a"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["b"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["c"]=>
&object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->a.changed"
["b"]=>
&string(14) "obj->a.changed"
["c"]=>
&string(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->b.changed"
["b"]=>
&string(14) "obj->b.changed"
["c"]=>
&string(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
["a"]=>
&string(14) "obj->c.changed"
["b"]=>
&string(14) "obj->c.changed"
["c"]=>
&string(14) "obj->c.changed"
}
--- a,b,c eq container:
object(stdClass)#%d (3) {
["a"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["b"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["c"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
}
string(55) "O:8:"stdClass":3:{S:1:"a";r:1;S:1:"b";r:1;S:1:"c";r:1;}"
object(stdClass)#%d (3) {
["a"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["b"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["c"]=>
object(stdClass)#%d (3) {
["a"]=>
*RECURSION*
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
["c"]=>
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
*RECURSION*
["c"]=>
*RECURSION*
}
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
*RECURSION*
}
}
object(stdClass)#%d (3) {
["a"]=>
string(14) "obj->a.changed"
["b"]=>
string(14) "obj->b.changed"
["c"]=>
string(14) "obj->c.changed"
}
Done
--UEXPECTF--
--- a refs container:
object(stdClass)#%d (3) {
[u"a"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";R:1;U:1:"b";i:1;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- a eqs container:
object(stdClass)#%d (3) {
[u"a"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";r:1;U:1:"b";i:1;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
int(1)
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- a,b ref container:
object(stdClass)#%d (3) {
[u"a"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"b"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";R:1;U:1:"b";R:1;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"b"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->a.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- a,b eq container:
object(stdClass)#%d (3) {
[u"a"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"b"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"c"]=>
int(1)
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";r:1;U:1:"b";r:1;U:1:"c";i:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"b"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
*RECURSION*
[u"c"]=>
int(1)
}
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
int(1)
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
--- a,b,c ref container:
object(stdClass)#%d (3) {
[u"a"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"b"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"c"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";R:1;U:1:"b";R:1;U:1:"c";R:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"b"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"c"]=>
&object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->a.changed"
[u"b"]=>
&unicode(14) "obj->a.changed"
[u"c"]=>
&unicode(14) "obj->a.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->b.changed"
[u"b"]=>
&unicode(14) "obj->b.changed"
[u"c"]=>
&unicode(14) "obj->b.changed"
}
object(stdClass)#%d (3) {
[u"a"]=>
&unicode(14) "obj->c.changed"
[u"b"]=>
&unicode(14) "obj->c.changed"
[u"c"]=>
&unicode(14) "obj->c.changed"
}
--- a,b,c eq container:
object(stdClass)#%d (3) {
[u"a"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"b"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"c"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
}
unicode(55) "O:8:"stdClass":3:{U:1:"a";r:1;U:1:"b";r:1;U:1:"c";r:1;}"
object(stdClass)#%d (3) {
[u"a"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"b"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"c"]=>
object(stdClass)#%d (3) {
[u"a"]=>
*RECURSION*
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
[u"c"]=>
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
*RECURSION*
[u"c"]=>
*RECURSION*
}
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
*RECURSION*
}
}
object(stdClass)#%d (3) {
[u"a"]=>
unicode(14) "obj->a.changed"
[u"b"]=>
unicode(14) "obj->b.changed"
[u"c"]=>
unicode(14) "obj->c.changed"
}
Done

View File

@@ -0,0 +1,23 @@
--TEST--
Test serialize_precision (part 1)
--INI--
serialize_precision=10
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
var_dump(serialize(0.1));
?>
--EXPECTF--
string(6) "d:0.1;"
--UEXPECTF--
unicode(6) "d:0.1;"

View File

@@ -0,0 +1,23 @@
--TEST--
Test serialize_precision (part 2)
--INI--
serialize_precision=75
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
var_dump(serialize(0.1));
?>
--EXPECTF--
string(60) "d:0.1000000000000000055511151231257827021181583404541015625;"
--UEXPECTF--
unicode(60) "d:0.1000000000000000055511151231257827021181583404541015625;"

View File

@@ -0,0 +1,36 @@
--TEST--
Test serialize() & unserialize() functions: resources
--FILE--
<?php
/* Prototype : proto string serialize(mixed variable)
* Description: Returns a string representation of variable (which can later be unserialized)
* Source code: ext/standard/var.c
* Alias to functions:
*/
/* Prototype : proto mixed unserialize(string variable_representation)
* Description: Takes a string representation of variable and recreates it
* Source code: ext/standard/var.c
* Alias to functions:
*/
echo "\n--- Testing Resource ---\n";
$file_handle = fopen( __FILE__, "r" );
$serialized_data = serialize( $file_handle );
fclose($file_handle);
var_dump($serialized_data);
var_dump(unserialize($serialized_data));
echo "\nDone";
?>
--EXPECTF--
--- Testing Resource ---
string(4) "i:%d;"
int(%d)
Done
--UEXPECTF--
--- Testing Resource ---
unicode(4) "i:%d;"
int(%d)
Done