Ссылочные переменные PHP
Ссылочные переменные в PHP - это замена указателей в C++. Но так как многие не знакомы с языком C++, то я расскажу о ссылочных переменных более подробно в этой статье. Пожалуй, ссылочные переменные в PHP - это одно из основных понятий, которое необходимо знать, иначе Вы даже не сможете пользоваться справочником.
Начнём с первого типа ссылочных переменных - жёсткие ссылки. Жёсткая ссылочная переменная - это синоним другой переменной:
<?php
$a = 5;
$b = &$a;
$a = 8;
echo $b;
?>
Теперь объясняю, что здесь написано. Вначале мы создаём переменную a, которой присваиваем значение 5. Дальше мы создаём жёсткую ссылку b на переменную a. Затем изменяем переменную a. И ввиду того, что b - это синоним a, у нас изменяется и b тоже. То есть значение одно, а переменных, ссылающихся на это значение, две.
Теперь очень важное правило: "Переменная существует до тех пор, пока на неё ссылается хотя бы одна ссылка". То есть пока мы не удалим все ссылки на ячейку памяти, в которой хранится значение, наша память не освободится. Например, чтобы избавиться от переменной в примере выше необходимо написать следующие строки:
unset($a);
unset($b);
Только после этих строк переменная исчезнет.
Переходим ко второму типу (и последнему) ссылочных переменных в PHP, к символическим ссылкам. Символическая ссылка - это переменная, которая содержит строковое значение с именем другой переменной. Советую вдуматься в это определение, чтобы стало понятно. И сразу пример:
<?php
$a = 17.1;
$b = "a";
echo $$b;
?>
В результате, как не трудно догадаться, вылезет число "17.1". Обратите внимание, что мы использовали конструкцию из двух знаков "$". Такая конструкция добирается до значения переменной, на которую ссылается символическая ссылка.
В принципе, символические ссылки не особо важны, в отличии от жёстких, и постарайтесь их не использовать, так как они затрудняют чтение кода.
Теперь объясняю, почему без знания жёсткой ссылочной переменной невозможно пользоваться справочником, а, следовательно, невозможно писать скрипты на языке PHP. Давайте с Вами разберём пример одной из функций. Допустим, функция sort(array &$array), которая принимает в качестве параметра массив. А на выходе сортирует его. Встаёт вопрос: "Как работает данная функция?" То ли она принимает массив, сортирует его и возвращает, при этом аргумент никак не изменяется (то есть исходный массив не меняется вообще). То ли именно аргумент меняется и в итоге, новый массив не возвращается, а изменяется конкретно сам массив, который мы передали, тем самым, теряя исходный массив. Вдумайтесь в эти строки.
Для того, чтобы ответить на этот вопрос, надо посмотреть, что передаётся в аргумент: просто переменная, и тогда исходный массив никак не изменяется, или же всё-таки передаётся жёсткая ссылка на переменную, тогда, разумеется, исходный массив изменится. В параметрах функции sort(array &$array) чётко указано, что передаётся жёсткая ссылка (&$array), о чём свидетельствует знак "&", поэтому изменится исходный массив $array.
Надеюсь, я Вам доказал, что знание ссылочных переменных в PHP, а особенно жёстких ссылочных переменных, обязательно. И очень надеюсь, что Вы разобрались с этой, в общем-то, непростой темой.
-
- Михаил Русаков
Комментарии (7):
Добрый день! Подскажите пожайлуйста, как это работает: $k="title"; $v="Главная"; $$k = $v; echo $title; Тоесть, как получается так, что создается переменная $title?
Ответить
Да, создаётся переменная $title. То есть Вы задали имя будущей переменной в виде строки, которую сохранили в переменной $k. Но старайтесь избегать символических ссылок, так как они запутывают код.
Ответить
Немогу понять последние три обзаца данной статьи... Можете ли Вы,если Вас не затруднит, привести пример по проще?
Ответить
Посмотрите в справочнике функцию sort() и str_replace(), попробуйте их применить. И подумайте, в чём между ними отличие. Это отличие и происходит из-за ссылочных переменных.
Ответить
Михаил, поясните пожалуйста: "Переменная существует до тех пор, пока на неё ссылается хотя бы одна ссылка" После этого вы удаляете сначала переменную, потом ссылку на неё: unset($a); unset($b); Но ведь в соответствии с цитатой первая функция не удалит переменную a, потому что не удалена ссылка на неё. Я попробовал вывести переменную после её удаления - "переменной не существует". Но ссылка продолжает возвращать её значение, как будто переменную не удаляли. Что же в действительности происходит с переменной?
Ответить
Михаил можете объяснить, почему когда я пишу такой код: $a = 5; $b = &$a; $a = 8; echo $b; echo '<br>'; $a = 17.1; $b = "a"; echo $$b; То выводит "8" и "а", а должно вроде исходя из смысла вашей статьи выводить "8" и "17.1" ?
Ответить
$b = 12; $a = 5; $b = &$a; $a = 9; unset($a); echo $b; почему выводит 9 ведь должно 12...что не так
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.