По ссылке передаются в метод данные, которые должны быть изменены внутри метода. Иногда это избавляет от лишнего кода. Плюс расход памяти в некоторых случаях ниже.
По поводу переменных переменных. Используются при написании обобщенного кода.
Вот пример. Это поведение Yii2 для хранения деревьев в БД. Поведение - это фича фреймворка - что-то вроде трейта или миксина.
В общем его можно подсключить к модели и она сама будет заполнять служебные поля при перемещении узлов. Для гибкости, при подключении можно указать поле таблицы, по которому надо сортировать данные.
MaterializedPathBehavior::$positionAttribute
. Это поле используется в коде для построения запросов:
$position = $this->node->{$this->positionAttribute}
Таким образом достигается гибкость. Тому, кто будет использовать это поведение не придется подгонять схему своей БД под него. Он сможет указать поля, с которыми надо работать.
Но конечно этим надо пользоваться с осторожностью и только там, где вы точно уверенны, что это необходимо. Иначе можно наворотить неподдерживаемую кашу.
UPD.
Еще немного о переменных переменных. Вообще вместо них можно добавить абстрактных методов вроде
getPositionAttribute()
и заставить пользователя переопределить их. Это будет более правильно идеалогически. Но, используя переменные, появляется возможность настройки без написания лишних классов.