1--TEST-- 2"Reference Unpacking - Class ArrayAccess With Reference" list() 3--FILE-- 4<?php 5 6class StorageRef implements ArrayAccess { 7 private $s = []; 8 function __construct(array $a) { $this->s = $a; } 9 function offsetSet ($k, $v): void { $this->s[$k] = $v; } 10 function &offsetGet ($k): mixed { return $this->s[$k]; } 11 function offsetExists ($k): bool { return isset($this->s[$k]); } 12 function offsetUnset ($k): void { unset($this->s[$k]); } 13} 14 15$a = new StorageRef([1, 2]); 16list(&$one, $two) = $a; 17var_dump($a); 18 19$a = new StorageRef([1, 2]); 20list(,,list($var)) = $a; 21var_dump($a); 22 23$a = new StorageRef([1, 2]); 24list(,,list(&$var)) = $a; 25var_dump($a); 26 27$a = new StorageRef(['one' => 1, 'two' => 2]); 28['one' => &$one, 'two' => $two] = $a; 29var_dump($a); 30 31?> 32--EXPECT-- 33object(StorageRef)#1 (1) { 34 ["s":"StorageRef":private]=> 35 array(2) { 36 [0]=> 37 &int(1) 38 [1]=> 39 int(2) 40 } 41} 42object(StorageRef)#2 (1) { 43 ["s":"StorageRef":private]=> 44 array(3) { 45 [0]=> 46 int(1) 47 [1]=> 48 int(2) 49 [2]=> 50 NULL 51 } 52} 53object(StorageRef)#1 (1) { 54 ["s":"StorageRef":private]=> 55 array(3) { 56 [0]=> 57 int(1) 58 [1]=> 59 int(2) 60 [2]=> 61 array(1) { 62 [0]=> 63 &NULL 64 } 65 } 66} 67object(StorageRef)#2 (1) { 68 ["s":"StorageRef":private]=> 69 array(2) { 70 ["one"]=> 71 &int(1) 72 ["two"]=> 73 int(2) 74 } 75} 76