Добавить в корзинуПозвонить
Найти в Дзене
WebTechnology

Ссылочные переменные PHP

Ссылочные переменные в PHP - это замена указателей в C++. Но так как многие не знакомы с языком C++, то я расскажу о ссылочных переменных более подробно в этой статье. Пожалуй, ссылочные переменные в PHP - это одно из основных понятий, которое необходимо знать, иначе Вы даже не сможете пользоваться справочником. Начнём с первого типа ссылочных переменных - жёсткие ссылки. Жёсткая ссылочная переменная - это синоним другой переменной: <?php
  $a = 5;
  $b = &$a;
  $a = 8;
  echo $b;
?> Теперь объясняю, что здесь написано. Вначале мы создаём переменную a, которой присваиваем значение 5. Дальше мы создаём жёсткую ссылку b на переменную a. Затем изменяем переменную a. И ввиду того, что b - это синоним a, у нас изменяется и b тоже. То есть значение одно, а переменных, ссылающихся на это значение, две. Теперь очень важное правило: "Переменная существует до тех пор, пока на неё ссылается хотя бы одна ссылка". То есть пока мы не удалим все ссылки на ячейку памяти, в которой хранится значение,

Ссылочные переменные в 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, а особенно жёстких ссылочных переменных, обязательно. И очень надеюсь, что Вы разобрались с этой, в общем-то, непростой темой.