1--TEST-- 2list() can be used to destructure to string offsets, __set and ArrayAccess::offsetSet 3--FILE-- 4<?php 5 6class Obj { 7 public $values = []; 8 public function __set($name, $value) { 9 $this->values[$name] = $value; 10 } 11} 12 13class Arr implements ArrayAccess { 14 public $values = []; 15 public function offsetSet($name, $value): void { 16 $this->values[$name] = $value; 17 } 18 public function offsetGet($name): mixed {} 19 public function offsetExists($name): bool {} 20 public function offsetUnset($name): void {} 21} 22 23$str = 'ab'; 24list($str[0], $str[1]) = ['x', 'y']; 25var_dump($str); 26 27$obj = new Obj; 28list($obj->foo, $obj->bar) = ['foo', 'bar']; 29var_dump($obj->values); 30 31$arr = new Arr; 32list($arr['foo'], $arr['bar']) = ['foo', 'bar']; 33var_dump($arr->values); 34 35?> 36--EXPECT-- 37string(2) "xy" 38array(2) { 39 ["foo"]=> 40 string(3) "foo" 41 ["bar"]=> 42 string(3) "bar" 43} 44array(2) { 45 ["foo"]=> 46 string(3) "foo" 47 ["bar"]=> 48 string(3) "bar" 49} 50