n-name
@n-name

Ссылки в PHP (&$var1), переменные переменых ($$var2) и их практическое применение?

Доброго времени.
Какое практическое применение у ссылок (&$var1), и переменых переменных ($$var2)?
Часто в работе используете?
  • Вопрос задан
  • 449 просмотров
Пригласить эксперта
Ответы на вопрос 5
riky
@riky
Laravel
&$var1 - часто используется для передачи значения в функцию по ссылке, чтобы можно было изменить значение внутри и снаружи тоже изменилось. часто используется и в стандартных функциях например preg_match 3ий параметр.

$$var2 - никогда, очень злая магия.
Ответ написан
Комментировать
MegaMufa
@MegaMufa
По ссылке передаются в метод данные, которые должны быть изменены внутри метода. Иногда это избавляет от лишнего кода. Плюс расход памяти в некоторых случаях ниже.

По поводу переменных переменных. Используются при написании обобщенного кода. Вот пример. Это поведение Yii2 для хранения деревьев в БД. Поведение - это фича фреймворка - что-то вроде трейта или миксина.

В общем его можно подсключить к модели и она сама будет заполнять служебные поля при перемещении узлов. Для гибкости, при подключении можно указать поле таблицы, по которому надо сортировать данные. MaterializedPathBehavior::$positionAttribute. Это поле используется в коде для построения запросов:
$position = $this->node->{$this->positionAttribute}


Таким образом достигается гибкость. Тому, кто будет использовать это поведение не придется подгонять схему своей БД под него. Он сможет указать поля, с которыми надо работать.

Но конечно этим надо пользоваться с осторожностью и только там, где вы точно уверенны, что это необходимо. Иначе можно наворотить неподдерживаемую кашу.

UPD.

Еще немного о переменных переменных. Вообще вместо них можно добавить абстрактных методов вроде getPositionAttribute() и заставить пользователя переопределить их. Это будет более правильно идеалогически. Но, используя переменные, появляется возможность настройки без написания лишних классов.
Ответ написан
Комментировать
BOOMER_74
@BOOMER_74
Full-Stack разработчик
Ссылку Вы можете, например, передать в функцию, в которой присвоить ей значение, т.е.:
$a = 1;
function f(&$a) {
  $a = 2;
}
f($a);
echo $a; // 2

Переменные переменных, если я не ошибаюсь, вообще хотят запретить (или уже в 7.1 запретили), но все же:
$a = "b";
$b = 1;
$c = $$a;
echo $c;

Можно использовать, например, для передачи имени функции в другую функцию.
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
stackoverflow.com/a/5479167/1603055

Переменная в переменной удобна для динамических названий переменных...
stackoverflow.com/a/2715671/1603055
Ответ написан
Комментировать
Ссылки - иногда, в основном для создания shorthand-ссылок на какую-нибудь очень глубоко запрятанную переменную, чтобы код выглядел лаконичнее. Передавать в функцию по ссылке аргументы, на мой взгляд, антипаттерн во многих случаях.

А переменные переменных могут быть весьма хороши, когда необходимо извлечь содержимое массива или объекта более явным образом, чем это делает exports. Например:
foreach($object as $key => $value) {
    if(...) { // любое условие, можно составить список разрешенных ключей
        $$key = $value;
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы