Подведу итоги прений.



Однозначного ответа конечно же нет, есть ±, компромиссы и предпочтения 🤪



Вариант с передачей по ссылке:

немногословный;

менее затратный по ресурсам;

вызов $this->processByReference($value1, $value2) при чтении не выглядит как мутация переменных, это затрудняет ревью и поддержку;

передача по ссылке — побочный эффект для контекста вызывающей функции.



Вариант с возвращением кортежа:

более многословный (хотя выглядит все равно опрятно);

потребует дополнительную память на массив (но разговоры про это пахнут нанооптимизацией);

строка [$value1, $value2] = $this->processAndReturnTuplet($value1, $value2) говорит сама за себя — я преобразую значения этих переменных;

передача значений копированием оставляет нам шанс написать чистый (pure) метод.



Ещё было предложено возвращать объект, но это, по сути, частный случай второго варианта. Персональный тип для результата приватного метода избыточен, с @psam-return array{string, int} Psalm и без него отловит все ошибки.



Всем спасибо за обсуждение!

Я выбираю второй вариант с кортежем, так как поддерживаемость и прозрачный control flow перевешивают 😉