Я писал о переменных в Вводной статье о переменных, но следующие две статьи я собираюсь посвятить более подробному объяснению переменных. Три статьи о переменных? да. Нужно покрыть так много материала.

Резюме: в PHP переменные начинаются со знака доллара, за которым следует подчеркивание или буква, за которыми следует серия букв, цифр и / или подчеркиваний. Они чувствительны к регистру, поэтому $ awesome, $ Awesome, $ aWesome и $ AWesome - разные переменные.

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

<?php
$x = "Dino";
$x = 1;
$x = true;
?>

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

Допустим, мы хотели скопировать переменную. Есть два разных подхода к этому: копирование по значению и копирование по ссылке.

Что значит копировать переменную по значению? Чтобы ответить на этот вопрос, мы создадим новую переменную.

<?php
$name = "Dino Cajic";
?>

«Дино Кахич» - это значение, которое хранится в памяти. Мы скажем, что он хранится в ячейке памяти 0x12FF. Переменная $ name указывает на эту ячейку памяти. Когда вы вызываете переменную $ name, она извлекает значение из этой ячейки памяти, которым является «Dino Cajic». Это чрезмерное упрощение реального процесса.

Если мы создадим новую переменную $ name_2 и хотим скопировать значение «Dino Cajic», установив $ name_2 = $ name, что произойдет в памяти?

<?php
$name = "Dino Cajic";
$name_2 = $name; // $name_2 = "Dino Cajic"
?>
  1. PHP смотрит на переменную $ name. Он переходит в адрес памяти, на который указывает, и извлекает значение. Итак, он просматривает адрес памяти 0x12FF и извлекает значение «Дино Каджик».
  2. Затем он присваивает переменной $ name_2 значение «Dino Cajic». Как? Сохраняя значение «Dino Cajic» в новой ячейке памяти, 0x34FD, и указывая переменной $ name_2 на эту новую ячейку памяти.
  3. Переменная $ name теперь указывает на 0x12FF, а переменная $ name_2 указывает на 0x34FD. Значения такие же, но места в памяти разные.

Если мы изменим переменную $ name_2 для хранения «Стивена Джонсона», изменится только значение внутри ячейки памяти 0x34FD. Значение для $ name - «Дино Каджик», а значение для $ name_2 - «Стивен Джонсон». Вот что мы имеем в виду, когда говорим «копировать по значению».

<?php
echo $name; // Display: Dino Cajic
echo $name_2; // Displays: Stephen Johnson
?>

Давайте теперь займемся «копированием по ссылке». Мы создадим новую переменную $ name_3, и на этот раз мы хотим, чтобы $ name_3 указывало на то же место в памяти, что и $ name. И $ name, и $ name_3 должны указывать на ячейку памяти 0x12FF.

<?php
$name_3 = &$name;
?>

Символ & - это то, что сообщает PHP, что мы хотим скопировать по ссылке. Переменные технически просто хранят ячейки памяти, поэтому мы просто скопировали ячейку памяти из $ name, которая равна 0x12FF, в $ name_3. Поскольку и $ name, и $ name_3 теперь указывают на одну и ту же ячейку памяти, изменение любого из значений изменяет значение для обоих.

Я знаю, что мы еще не рассмотрели функции, но для тех, кто заинтересован и знаком с ними, вам может понравиться следующий сегмент.

При передаче аргумента функции мы можем передать аргумент по значению или по ссылке. Тот же подход используется путем предварительного добавления объявления параметра символом &. При передаче аргумента по значению создается копия. Любые изменения значения заканчиваются, когда завершается функция. При передаче аргумента по ссылке модификация вносится в переменную, которая находится вне функции.

Чтобы проиллюстрировать это, мы создадим новую переменную $ name. Мы сохраним значение «Dino» и передадим это значение функции displayName ($ name). Эта функция изменит переменную внутри тела функции и изменит значение на «Фрэнк». Когда мы выводим $ name вне функции, отображаемое значение по-прежнему будет «Dino».

Если мы передадим переменную $ name в displayNameByRef (& $ name) и изменим значение $ name внутри функции, мы получим другой результат, чем раньше, когда мы выводим переменную $ name вне функции. Если функция изменяет значение $ name с «Dino» на «Frank», и переменная отображается эхом вне функции, отображается значение «Frank».

Переменные в PHP могут выглядеть немного странно. В следующей статье мы рассмотрим переменные переменные.