1--TEST-- 2Serialize object into session, full set 3--SKIPIF-- 4<?php 5if ((version_compare(PHP_VERSION, '5.2.13') <= 0) || 6 (version_compare(PHP_VERSION, '5.3.0') >= 0 && 7 version_compare(PHP_VERSION, '5.3.2') <= 0)) { 8 echo "skip tests in PHP 5.2.14/5.3.3 or newer"; 9} 10if (!extension_loaded("session")) { 11 echo "skip needs session enabled"; 12} 13--FILE-- 14<?php 15if(!extension_loaded('msgpack')) { 16 dl('msgpack.' . PHP_SHLIB_SUFFIX); 17} 18 19class Foo { 20 private static $s1 = array(); 21 protected static $s2 = array(); 22 public static $s3 = array(); 23 24 private $d1; 25 protected $d2; 26 public $d3; 27 28 public function __construct($foo) { 29 $this->d1 = $foo; 30 $this->d2 = $foo; 31 $this->d3 = $foo; 32 } 33} 34 35class Bar { 36 private static $s1 = array(); 37 protected static $s2 = array(); 38 public static $s3 = array(); 39 40 public $d1; 41 private $d2; 42 protected $d3; 43 44 public function __construct() { 45 } 46 47 public function set($foo) { 48 $this->d1 = $foo; 49 $this->d2 = $foo; 50 $this->d3 = $foo; 51 } 52} 53 54$output = ''; 55 56function open($path, $name) { 57 return true; 58} 59 60function close() { 61 return true; 62} 63 64function read($id) { 65 global $output; 66 $output .= "read" . PHP_EOL; 67 $a = new Bar(); 68 $b = new Foo($a); 69 $a->set($b); 70 $session = array('old' => $b); 71 return msgpack_serialize($session); 72} 73 74function write($id, $data) { 75 global $output; 76 $output .= "write: "; 77 $output .= bin2hex($data) . PHP_EOL; 78 return true; 79} 80 81function destroy($id) { 82 return true; 83} 84 85function gc($time) { 86 return true; 87} 88 89ini_set('session.serialize_handler', 'msgpack'); 90 91session_set_save_handler('open', 'close', 'read', 'write', 'destroy', 'gc'); 92 93session_start(); 94 95$_SESSION['test'] = "foobar"; 96$a = new Bar(); 97$b = new Foo($a); 98$a->set($b); 99$_SESSION['new'] = $a; 100 101session_write_close(); 102 103echo $output; 104var_dump($_SESSION); 105?> 106--EXPECTF-- 107read 108write: 84c001a36f6c6484c0a3466f6fa700466f6f00643184c0a3426172a2643182c0040002a70042617200643282c0040002a5002a00643382c0040002a5002a00643282c0040003a2643382c0040003a474657374a6666f6f626172a36e657784c0a3426172a2643184c0a3466f6fa700466f6f00643182c0040009a5002a00643282c0040009a2643382c0040009a70042617200643282c004000aa5002a00643382c004000a 109array(3) { 110 ["old"]=> 111 object(Foo)#3 (3) { 112 [%r"?d1"?:("Foo":)?private"?%r]=> 113 object(Bar)#4 (3) { 114 ["d1"]=> 115 *RECURSION* 116 [%r"?d2"?:("Bar":)?private"?%r]=> 117 *RECURSION* 118 [%r"?d3"?:protected"?%r]=> 119 *RECURSION* 120 } 121 [%r"?d2"?:protected"?%r]=> 122 object(Bar)#4 (3) { 123 ["d1"]=> 124 *RECURSION* 125 [%r"?d2"?:("Bar":)?private"?%r]=> 126 *RECURSION* 127 [%r"?d3"?:protected"?%r]=> 128 *RECURSION* 129 } 130 ["d3"]=> 131 object(Bar)#4 (3) { 132 ["d1"]=> 133 *RECURSION* 134 [%r"?d2"?:("Bar":)?private"?%r]=> 135 *RECURSION* 136 [%r"?d3"?:protected"?%r]=> 137 *RECURSION* 138 } 139 } 140 ["test"]=> 141 string(6) "foobar" 142 ["new"]=> 143 object(Bar)#5 (3) { 144 ["d1"]=> 145 object(Foo)#6 (3) { 146 [%r"?d1"?:("Foo":)?private"?%r]=> 147 *RECURSION* 148 [%r"?d2"?:protected"?%r]=> 149 *RECURSION* 150 ["d3"]=> 151 *RECURSION* 152 } 153 [%r"?d2"?:("Bar":)?private"?%r]=> 154 object(Foo)#6 (3) { 155 [%r"?d1"?:("Foo":)?private"?%r]=> 156 *RECURSION* 157 [%r"?d2"?:protected"?%r]=> 158 *RECURSION* 159 ["d3"]=> 160 *RECURSION* 161 } 162 [%r"?d3"?:protected"?%r]=> 163 object(Foo)#6 (3) { 164 [%r"?d1"?:("Foo":)?private"?%r]=> 165 *RECURSION* 166 [%r"?d2"?:protected"?%r]=> 167 *RECURSION* 168 ["d3"]=> 169 *RECURSION* 170 } 171 } 172} 173