1--TEST-- 2Check for reference serialization 3--SKIPIF-- 4<?php 5if (version_compare(PHP_VERSION, "8.0.0dev", "<")) { 6 die("skip PHP < 8.0\n"); 7} 8?> 9--FILE-- 10<?php 11if(!extension_loaded('msgpack')) { 12 dl('msgpack.' . PHP_SHLIB_SUFFIX); 13} 14 15function test($type, $variable, $test) { 16 $serialized = msgpack_serialize($variable); 17 $unserialized = msgpack_unserialize($serialized); 18 19 echo $type, PHP_EOL; 20 echo bin2hex($serialized), PHP_EOL; 21 var_dump($unserialized); 22 echo $test || $unserialized == $variable ? 'OK' : 'ERROR', PHP_EOL; 23} 24 25$a = array('foo'); 26 27test('array($a, $a)', array($a, $a), false); 28test('array(&$a, &$a)', array(&$a, &$a), false); 29 30$a = array(null); 31$b = array(&$a); 32$a[0] = &$b; 33 34test('cyclic', $a, true); 35 36var_dump($a); 37var_dump(msgpack_unserialize(msgpack_serialize($a))); 38 39--EXPECT-- 40array($a, $a) 419291a3666f6f91a3666f6f 42array(2) { 43 [0]=> 44 array(1) { 45 [0]=> 46 string(3) "foo" 47 } 48 [1]=> 49 array(1) { 50 [0]=> 51 string(3) "foo" 52 } 53} 54OK 55array(&$a, &$a) 569282c00100a3666f6f82c0020002 57array(2) { 58 [0]=> 59 &array(1) { 60 [0]=> 61 string(3) "foo" 62 } 63 [1]=> 64 &array(1) { 65 [0]=> 66 string(3) "foo" 67 } 68} 69OK 70cyclic 719182c0010082c0010082c0020002 72array(1) { 73 [0]=> 74 &array(1) { 75 [0]=> 76 array(1) { 77 [0]=> 78 *RECURSION* 79 } 80 } 81} 82OK 83array(1) { 84 [0]=> 85 &array(1) { 86 [0]=> 87 *RECURSION* 88 } 89} 90array(1) { 91 [0]=> 92 &array(1) { 93 [0]=> 94 array(1) { 95 [0]=> 96 *RECURSION* 97 } 98 } 99} 100