Ссылки в PHP
Всем доброго времени суток. На связи Алексей Гулынин. В прошлой статье мы разобрали константы в PHP. В данной статье я бы хотел рассказать о ссылочных переменных (ссылках) в PHP. В PHP нет такого понятия, как указатели, но всё равно возможно создание ссылок на другие переменные. Всего в PHP существует 3 вида ссылок: символические, жесткие и ссылки на объекты. Символические ссылки появились в PHP, начиная с 3 версии, жесткие — с 4 версии, ссылки на объекты — с 5 версии.
Жесткая ссылка — это по сути та же самая переменная, т.е. синоним на неё. Многоуровневые ссылки в PHP не поддерживаются (т.е. ссылка на ссылку, оно и правильно, так как запутывает код). Для создания жесткой ссылки используется оператор &. Давайте сразу приведем пример жесткой ссылки:
<?php $a = 20; $b = &$a; echo "$a</br>"; //выведет 20 </br> - это тег перевода на новую строку $b = 50; echo "$a"; //выведет 50 ?>
Жесткие ссылки работают не только для переменных, но и для элементов массива (массивы мы разберем в одной из следующих статей). Подпишитесь на обновления сайта, чтобы не пропустить.
Для создания любой переменной в PHP, выделяется область памяти, т.е. получается в нашем случае, при обращении к переменной $a, PHP обращается к выделенной ранее области памяти и получает оттуда значение переменной. Когда создаётся ссылка &b на переменную $a, PHP также регистрирует эту переменную в своих таблицах, но выделяет для неё не новый участок памяти, а тот же самый, что и для переменной $a.
Жесткая ссылка и переменная, на которую она ссылается полностью одинаковы. Если мы удалим одну из них (жесткую ссылку или саму переменную), то память не очистится. Память очистится только тогда, когда ничто не ссылается на данную ячейку памяти.
При работе с встроенными функциями в PHP, всегда обращайте внимание, что передаётся в аргументе функции. Если там находится просто параметр, то он никак не изменится. Если же в параметре функции стоит жесткая ссылка, то исходный параметр также изменится. Давайте на простом примере покажу разницу. Создадим массив и применим к нему две функции, параметром одной будет являться жесткая ссылка, а параметром другой нет:
<?php $test = array(10,12,15,5,12,3,2); array_reverse($test); //переворачивает элементы массива, т.е. получится массив такой 2,3,12,5,15,12,10. print_r($test); //получим исходный массив $test2 = array_reverse($test); echo "</br>"; print_r($test2); //получим нужный массив (2,3,12,5,15,12,10) ?>
В данном случае мы видим, что исходный массив test не меняется, т.е. передаётся обычный параметр (arrayarray_reverse(array $array) )
Другой пример:
<?php $test = array(10,12,15,5,12,3,2); sort($test); //переворачивает элементы массива, т.е. получится массив такой 2,3,12,5,15,12,10. print_r($test); //получим отсортированный массив ?>
В данном случае мы видим, что исходный массив меняется, т.е. передаётся жесткая ссылка (array sort(array &$array))
Думаю теперь вы уясняли, что жесткие ссылки — это очень важная тема.
Символическая ссылка — это строковая переменная, хранящая имя другой переменной. Для того, чтобы создать символическую ссылку необходимо добавить ещё один знак "$" перед переменной. Давайте сразу пример:
<?php $odin = 1; $dva = 2; $tri = "odin"; echo $$tri; //выведет 1. echo "</br>"; $$tri = 3; //переменная $odin теперь имеет значение 3. echo $odin;//выведет 3 ?>
Мой совет: лучше не используйте символические ссылки, так как они очень сильно запутывают код. Из данного примера вы сами всё видите.
Ссылки на объекты будем раcсматривать в одной из следующих статей.
Домашнее задание: наберите все примеры из данной статьи и проанализируйте их. По всем вопросам пишите в комментариях.
В данной статье вы узнали, что такое ссылки в PHP.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.