Константы
Некоторые значения в программе не должны меняться: число дней в неделе, ставка налога, предел попыток входа. Если хранить такое значение в переменной, её можно случайно перезаписать в середине файла. Тогда программа молча начнёт считать неправильно.
Представьте банку, которую запечатали сразу после того, как наполнили. Этикетка видна, содержимое тоже, а положить в неё что-то другое уже нельзя. Такая банка в PHP называется константой: это именованное значение, которое задают один раз и потом только читают.
<?php
const RATE = 3;
define('LIMIT', 10);
echo RATE, ' ', LIMIT, "\n"; // 3 10
echo RATE * LIMIT, "\n"; // 30Давайте разберём по строкам:
const RATE = 3;объявляет константуRATEсо значением3.define('LIMIT', 10);объявляет константуLIMITдругим способом — вызовом функции.- Константы читают по имени, без
$, иechoпечатает3 10. - С константой можно считать, как с обычным числом:
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'.
echo PHP_INT_MAX, "\n"; // 9223372036854775807
echo M_PI, "\n"; // 3.1415926535898
var_dump(PHP_INT_MAX + 1); // float(9.223372036854776E+18)Разберём вывод:
- На 64-битной системе
PHP_INT_MAX— это9223372036854775807. echoпечатает дробное число с точностью до 14 значащих цифр, поэтомуM_PIокругляется до3.1415926535898.PHP_INT_MAX + 1вintуже не помещается, и результат становитсяfloat. ЗаписьE+18означает «умножить на 10 в 18-й степени».
На собеседовании иногда спрашивают, что будет при переполнении целого числа в PHP. Ответ: результат превращается в float и теряет точность, но ошибки нет.
Частая ошибка
Константе присвоили новое значение, как переменной:
const RATE = 3;
RATE = 4; // ✗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.