--TEST-- Twig supports the "=" operator (assignment) --TEMPLATE-- {# stores #} {% do b = 1 + 3 %}{{ b }} {# stores and displays #} {{ b = 1 + 3 }}{{ b }} {# stores and returns #} {% do (c = 4) ? 0 : -1 %}{{ c }} {# = can be chained #} {% do c = d = "a" %}{{ c }}{{ d }} {% do a = (b = 4) + 5 %}{{ a }}{{ b }} # Array destructuring {% do [first, last] = ['Fabien', 'Potencier'] %}{{ first }} {{ last }} {% do [a, b] = [b, a] %}{{ a }}{{ b }} {% do [, second] = ['first', 'second'] %}{{ second }} {% do [x, y, z] = ['one', 'two'] %}{{ x }} {{ y }} {{ z is same as(null) ? 'null' : z }} # Object destructuring {% do {name, email} = user %}{{ name }} {{ email }} {% do {first_name, last_name} = user_map %}{{ first_name }} {{ last_name }} {% do {name} = user_obj %}{{ name }} # Array destructuring from a Traversable {% do destructured = ([p, q] = pair_traversable) %}{{ p }} {{ q }} {{ pair_traversable.yielded }} {{ destructured is same as(pair_traversable) ? 'same' : 'different' }} {% do [r, , t] = short_traversable %}{{ r }} {{ t is same as(null) ? 'null' : t }} # Object destructuring with renaming {% do {name: userName, email: userEmail} = user %}{{ userName }} {{ userEmail }} {% do {first_name: first, last_name: last} = user_map %}{{ first }} {{ last }} {% do {name: objName} = user_obj %}{{ objName }} {% do {name: n1} = user %}{% do {name: n2} = user_obj %}{{ n1 }} {{ n2 }} --DATA-- return [ 'user' => (object)['name' => 'Fabien', 'email' => 'fabien@example.com'], 'user_map' => ['first_name' => 'Fabien', 'last_name' => 'Potencier'], 'user_obj' => new class { public function getName() { return 'Fabien'; } }, 'null_obj' => null, 'pair_traversable' => new class implements IteratorAggregate { public int $yielded = 0; public function getIterator(): Traversable { foreach ([5 => 'Fabien', 8 => 'Potencier', 13 => 'Ignored'] as $key => $value) { ++$this->yielded; yield $key => $value; } } }, 'short_traversable' => new ArrayIterator(['one']), ] --EXPECT-- 4 44 4 aa 94 # Array destructuring Fabien Potencier 49 second one two null # Object destructuring Fabien fabien@example.com Fabien Potencier Fabien # Array destructuring from a Traversable Fabien Potencier 2 same one null # Object destructuring with renaming Fabien fabien@example.com Fabien Potencier Fabien Fabien Fabien