Перейти к содержимому
Теория · Переменные и типы · урок 1 из 6

Переменные

Чему вы научитесь

Чему вы научитесь:

  • заводить переменные и менять их значение;
  • объяснять, почему изменение $a после $b = $a не меняет $b;
  • узнавать тип значения через var_dump и предсказывать, что напечатает echo;
  • преобразовывать значения из одного типа в другой и объявлять константы.
Две банки с этикетками $a и $b; копия плитки 5 переходит из первой во вторую, а оригинал остаётся

Представьте банку с этикеткой. На этикетке написано имя, а внутри лежит значение. По имени банку можно найти, заглянуть в неё или положить туда что-то другое. Программа хранит данные так же — в переменных: именованных значениях, которые можно прочитать и изменить.

Одну переменную вы уже встречали в первой теме: параметр $x функции double. Теперь заведём переменные сами. Переменная позволяет запомнить значение один раз и потом пользоваться им по имени:

PHP
<?php

$name = 'Anna';
$age = 30;
echo $name, ' ', $age, "\n"; // Anna 30
$age = $age + 1;
echo $name, ' ', $age, "\n"; // Anna 31

Давайте разберём по строкам:

  1. $name = 'Anna'; заводит банку $name и кладёт в неё строку 'Anna'.
  2. $age = 30; заводит вторую банку, с числом 30.
  3. echo печатает содержимое обеих банок: Anna 30.
  4. $age = $age + 1; читает из $age число 30, прибавляет 1 и кладёт результат 31 обратно в ту же банку.
  5. Второй echo печатает Anna 31: в $name ничего не менялось.

Объявлять переменную заранее не нужно. Она появляется, когда вы впервые кладёте в неё значение.

Имя переменной

Имя переменной в PHP всегда начинается со знака $. Этот знак — часть имени: для PHP $age и age — разные вещи, и переменной без $ не бывает.

Правила для остальной части имени:

  • первый символ после $ — буква или подчёркивание, но не цифра;
  • дальше идут буквы, цифры и подчёркивания;
  • регистр важен: $age и $Age — две разные переменные.
PHP
$Age = 40;
echo $age, ' ', $Age, "\n"; // 31 40

Здесь $Age — новая переменная, а в $age по-прежнему лежит 31. Составные имена в курсе пишем слитно, начиная каждое следующее слово с заглавной буквы: $userName, $itemCount. Так принято в большинстве PHP-проектов.

Присваивание

Знак = — это присваивание: PHP вычисляет то, что справа, и кладёт результат в переменную слева. Это не равенство из математики. Запись $age = $age + 1 читается так: «положи в $age то, что в ней было, плюс один».

Новое присваивание заменяет старое значение. Прежнее при этом пропадает: в банке всегда лежит что-то одно.

Здесь аналогия с банкой неточна. Если вынуть из настоящей банки варенье, она опустеет. А прочитать переменную — значит посмотреть на значение, а не забрать его: после echo $age в $age лежит то же число.

Копия при присваивании

А что делает строка $b = $a? Она не клеит на банку $a вторую этикетку. PHP берёт копию содержимого $a и кладёт её в отдельную банку $b. С этого момента у каждой переменной своё значение: изменение $a не меняет $b.

Давайте проверим это на программе. Нажмите «Следующий шаг» и следите за $b и $greeting в рамке {main}: после присваивания они больше не меняются.

ВживуюПрисваивание копирует значениешаг 1 из 8 · рамок: 1

В банку $a кладут число 5.

Следите за $b и $greeting в рамке {main}

Обе пары переменных ведут себя одинаково:

  1. $b = $a копирует число 5, и после $a = $a + 1 в $b по-прежнему 5.
  2. $greeting = $name копирует строку 'Anna', и новое значение $name до $greeting не доходит.
  3. Поэтому программа печатает 6 5 и Anna.

Этот вопрос часто задают на собеседовании: «Что окажется в $b после $b = $a и изменения $a?» Ответ: то значение, которое было в $a в момент присваивания. Присваивание копирует значение, а не связывает две переменные.

Частая ошибка

Имя переменной написали с опечаткой:

PHP
$total = 10;
echo $totl, "\n"; // ✗
TEXT
Warning: Undefined variable $totl

Переменной $totl никто ничего не присваивал, и PHP об этом предупреждает. Но скрипт не останавливается: на месте значения не печатается ничего, а строки ниже выполняются дальше. Поэтому читайте предупреждения, даже если программа отработала до конца. Чтобы исправить, напишите то же имя, что при присваивании: echo $total, "\n";.

Главное

  • Переменная — именованное значение; её имя начинается с $, и регистр в имени важен.
  • = кладёт значение справа в переменную слева; $age = $age + 1 записывает новое значение в ту же переменную.
  • $b = $a копирует значение в момент присваивания: позднее изменение $a не меняет $b.
  • Если прочитать переменную, которой ничего не присваивали, PHP выдаёт Warning: Undefined variable, но скрипт работает дальше.