Я писал о переменных в Вводной статье о переменных, но следующие две статьи я собираюсь посвятить более подробному объяснению переменных. Три статьи о переменных? да. Нужно покрыть так много материала.
Резюме: в 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" ?>
- PHP смотрит на переменную $ name. Он переходит в адрес памяти, на который указывает, и извлекает значение. Итак, он просматривает адрес памяти 0x12FF и извлекает значение «Дино Каджик».
- Затем он присваивает переменной $ name_2 значение «Dino Cajic». Как? Сохраняя значение «Dino Cajic» в новой ячейке памяти, 0x34FD, и указывая переменной $ name_2 на эту новую ячейку памяти.
- Переменная $ 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 могут выглядеть немного странно. В следующей статье мы рассмотрим переменные переменные.