Иногда из функции надо вернуть кортеж (иммутабельную группу значений), а в DTO смысла нет, потому что это разовая ситуация и непубличное апи.
В этом случае я всегда использую запечатанный list shape, потому что его очень удобно разбирать в переменные при помощи синтаксиса деструктуризации массива:
[$a, $b] = $tuple.Сейчас мне потребовалось в цикле раскидать возвращаемые методом значения по двум спискам. Приятно удивился, что при деструктуризации можно использовать не только
[$array['key']] = , но и [$array[]] =.Упрощённый пример:
interface Thing
{
/**
* @return list{int, string}
*/
public function resolve(): array;
}
/**
* @param iterable<Thing> $things
*/
function app(iterable $things): void
{
$ints = [];
$strings = [];
foreach ($things as $thing) {
[$ints[], $strings[]] = $thing->resolve();
}
var_dump($ints, $strings);
}
PHPStan | Psalm