Оператор присваивания в PHP. Что означает передача значений по ссылке?

оператор присваивания в php. что означает передача
  значений по ссылке?

Роль оператора присваивания

В прошлых статьях, приводя примеры кода, мы не раз использовали оператор присваивания. Теперь рассмотрим его подробнее. Присваивание значений — это наиболее часто используемое действие и на самом деле очень важно понимать, как оно происходит на низком уровне[1].

Каждый раз, создавая переменную, элемент массива или константу с добавлением какого-либо значения, интерпретатор PHP выделяет для его хранения определенный объем оперативной памяти. Если создать две переменные и использовать оператор присваивания для назначения им одинакового целого числа, то в оперативной памяти появятся два контейнера. Хоть они и содержат одинаковые значения, но существуют независимо друг от друга.

Оператор присваивания записывается как знак «=». Важно понимать, что в PHP символ «=» не используется для сравнивания двух значений, для этого существуют специальные логические операторы[2]. Стандартную операцию присваивания можно записать как «$имя_переменной = значение;». Оператор берет значение, стоящее справа от него, и помещает в контейнер, стоящий с лева.

//Присваивание строки переменной
$welkomeText = 'Добро пожаловать!';
echo $welkomeText; //Результат: Добро пожаловать!

//Присваивание переменной значения другой переменной
$newTextVariable = $welkomeText;
echo $newTextVariable; //Результат: Добро пожаловать!

//Присваивание значения элементу массива
$toDoList['today'] = 'Постирать одежду';
echo $toDoList['today']; //Результат: Постирать одежду

У оператора есть одна особенность. После присваивания, переменная будет содержать помещенные в неё данные, к которым вы сможете получить доступ в дальнейшем, но эти данные также станут и результатом выражения. Чтобы понять это запутанное высказывание, рассмотрите примеры, приведенные ниже. Эта особенность позволяет использовать ряд трюков: «множественное присваивание» и «одновременное присваивание и использование».

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

//Множественное присваивание значений переменным
$var1 = $var2 = $var3 = 4;
var_dump($var1, $var2, $var3);
/*
* Результат:
* int(4)
* int(4)
* int(4)
*
* Все переменные содержат одинаковые значения
*/

//Одновременное присваивание и исользование
$someText = 'просто текст';
$someVar = null; //пустая переменная
echo 'Данная операция выведет: '.($someVar = $someText). '<br>';
echo 'Переменная $someVar содежит: ' .$someVar;
/*
* фраза 'просто текст' будет выведена и при
* присваивании значения и при прямом обращении
* к значению переменной.
*/

Передача значений по ссылкам

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

Для передачи значения по ссылке используется символ «&». В процессе присваивания его необходимо поставить слева от переменной, значение которой должно быть передано по ссылке.

//передача значения переменной по ссылке
$countOfPeople = 25;
$countOfFriends = &$countOfPeople;
echo 'Количество человек: '. $countOfPeople .'<br>';
echo 'Из них друзей: '. $countOfFriends .'<br>';
/*
* Результат:
* Количество человек: 25
* Из них друзей: 25
*/


//Изменяем любую из переменных
$countOfPeople = 14;
echo 'Количество человек: '. $countOfPeople .'<br>';
echo 'Из них друзей: '. $countOfFriends .'<br>';
/*
* Результат:
* Количество человек: 14
* Из них друзей: 14
*/

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

//Передача значения переменной по ссылке двум другим
$var1 = 'test';
$var2 = &$var1;
$var3 = &$var2;
var_dump($var1, $var2, $var3);
/*
* Результат:
* string('test')
* string('test')
* string('test')
*/


//Удаление первой(родительской) переменной, не влечет
//за собой удаление значений, связанных с ней
unset($var1);
var_dump($var1, $var2, $var3);
/*
* Результат:
* null
* string('test')
* string('test')
*/

Термины, использованные в статье

  1. Низкий уровень — это абстрактное понятие, обозначающее процессы, происходящие максимально приближенно к механизмам компьютерной системы. Одна из основных задач «высокоуровневого языка программирования» – абстрагировать вас от того, на компьютере какой комплектации вы запускаете свою программу. Эта «высокоуровневая концепция» значительно упрощает написание программ.
  2. Логические операторы — набор операторов, позволяющих сравнивать различные сущности (типы данных, значения числовых переменных и т.д.) по критериям и осуществлять утверждения. Одними из основных мест использования логических операторов являются условия. Они, в зависимости от ложности или истинности входящего параметра, могут осуществлять ветвление программной логики.

Последние публикации