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

Константы

Некоторые значения в программе не должны меняться: число дней в неделе, ставка налога, предел попыток входа. Если хранить такое значение в переменной, её можно случайно перезаписать в середине файла. Тогда программа молча начнёт считать неправильно.

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

PHP
<?php

const RATE = 3;
define('LIMIT', 10);
echo RATE, ' ', LIMIT, "\n"; // 3 10
echo RATE * LIMIT, "\n"; // 30

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

  1. const RATE = 3; объявляет константу RATE со значением 3.
  2. define('LIMIT', 10); объявляет константу LIMIT другим способом — вызовом функции.
  3. Константы читают по имени, без $, и echo печатает 3 10.
  4. С константой можно считать, как с обычным числом: RATE * LIMIT даёт 30.

Константа заодно даёт числу имя. Строка RATE * LIMIT понятна и через месяц, а про 3 * 10 придётся вспоминать, что означает каждое число. А если ставка изменится, её поправят в одном месте — в объявлении.

Два способа объявить

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

const

Ключевое слово const, имя, знак = и значение. Эту запись пишут на верхнем уровне файла: внутри функции const — ошибка разбора. В современном коде чаще встречается именно эта форма.

define

Функция с двумя аргументами: имя константы строкой в кавычках и её значение. Константа появляется, когда PHP доходит до вызова, поэтому define работает и внутри функции. Эту форму часто можно увидеть в старом коде.

Имя константы пишут без $, заглавными буквами, а слова разделяют подчёркиванием: MAX_LOGIN_ATTEMPTS. Такое имя сразу отличает константу от переменной.

Константу нельзя изменить

Присвоить константе новое значение нельзя: файл с такой строкой PHP не запустит. Повторное объявление тоже не сработает: второй const RATE = 4; вызовет Warning: Constant RATE already defined, this will be an error in PHP 9, а RATE останется равной 3.

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

Встроенные константы

Часть констант PHP объявляет сам:

  • PHP_INT_MAX — самое большое число типа int;
  • M_PI — число π;
  • PHP_EOL — перевод строки той системы, на которой работает PHP (в курсе мы пишем "\n");
  • PHP_VERSION — версия PHP строкой, например '8.5.12'.
PHP
echo PHP_INT_MAX, "\n"; // 9223372036854775807
echo M_PI, "\n"; // 3.1415926535898
var_dump(PHP_INT_MAX + 1); // float(9.223372036854776E+18)

Разберём вывод:

  1. На 64-битной системе PHP_INT_MAX — это 9223372036854775807.
  2. echo печатает дробное число с точностью до 14 значащих цифр, поэтому M_PI округляется до 3.1415926535898.
  3. PHP_INT_MAX + 1 в int уже не помещается, и результат становится float. Запись E+18 означает «умножить на 10 в 18-й степени».

На собеседовании иногда спрашивают, что будет при переполнении целого числа в PHP. Ответ: результат превращается в float и теряет точность, но ошибки нет.

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

Константе присвоили новое значение, как переменной:

PHP
const RATE = 3;
RATE = 4; // ✗
TEXT
Parse error: syntax error, unexpected token "="

Это ошибка разбора: PHP не запускает файл вовсе, даже строки выше ошибки. Если значение должно меняться, ему нужна переменная: $rate = 4;.

Главное

  • Константа — именованное значение, которое задают один раз: const RATE = 3; или define('LIMIT', 10);.
  • Имя константы пишут без $, заглавными буквами: MAX_LOGIN_ATTEMPTS.
  • Присвоить константе новое значение нельзя: RATE = 4; — ошибка разбора.
  • Часть констант PHP объявляет сам: PHP_INT_MAX, M_PI, PHP_EOL, PHP_VERSION.