Вариант 1 - Деструктуризация:
// Возврат нескольких значений:
function some() {
return [23, 42];
}
// Получение
[$a, $b] = some();
\var_dump($a, $b);
Вариант 2 - Деструктуризация с ключами:
// Возврат нескольких значений:
function some() {
return ['a' => 23, 'b' => 42];
}
// Получение
['a' => $a, 'b' => $b] = some();
\var_dump($a, $b);
Вариант 3 - Генераторы с ключами:
function some() {
yield 'a' => 23;
yield 'b' => 42;
}
foreach (some() as $key => $value) {
echo $key . ':' . $value; // a:23 b:42
}
Вариант 4 - Генераторы без ключей:
function some() {
yield 23;
yield 42;
}
foreach (some() as $value) {
echo $value; // 23 42
}
Вариант 5 - Генераторы с возвратом:
function some() {
yield 23;
return 42;
}
$value = some();
echo $value->current(); // 23
$value->next();
echo $value->getReturn(); // 42
Вариант 6 - DTO:
class DataTransferObject
{
private $a;
private $b;
public function __construct($a, $b)
{
$this->a = $a;
$this->b = $b;
}
public function getA()
{
return $this->a;
}
public function getB()
{
return $this->b;
}
}
function some() {
return new DataTransferObject(23, 42);
}
$value = some();
echo $value->getA(); // 23
echo $value->getB(); // 42
И ещё куча всяких вариантов, но мне влом придумывать уже)