define() vs const в PHP: что выбрать в 2024 (+код)

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

define() vs const в PHP: подробное руководство с примерами

Каждый PHP-разработчик рано или поздно сталкивается с вопросом: как лучше объявить константу — с помощью define() или ключевого слова const? На первый взгляд, разницы почти нет. Оба варианта создают неизменяемое значение. Но дьявол, как всегда, кроется в деталях.

Эта статья — не скучная выдержка из мануала. Мы разберём реальные кейсы, когда один подход выигрывает, а другой — подводит. Вы узнаете, как правильно объявлять константы в PHP 7 и PHP 8, и сможете писать более чистый и предсказуемый код.

Готовы? Поехали!

Что такое константа в PHP?

Прежде чем сравнивать, давайте вспомним базу. Константа — это идентификатор (имя) для простого значения. Её главное свойство: значение не может быть изменено или удалено в процессе выполнения скрипта.

Константы удобны для хранения настроек, путей к файлам, API-ключей и других статичных данных.

<?php
// Определяем константу через define()
define('SITE_NAME', 'PythonLib');

// Определяем константу через const
const SITE_URL = 'https://pythonlib.ru';

echo SITE_NAME; // PythonLib
echo SITE_URL;  // https://pythonlib.ru
?>

Оба способа работают. Но давайте копнём глубже.

Основные отличия define() и const

1. Время определения

Это самый важный пункт. const — это языковая конструкция, которая обрабатывается на этапе компиляции (до выполнения скрипта). define() — это функция, которая выполняется в рантайме (во время выполнения скрипта).

Что это значит на практике?

  • const можно использовать только для объявления констант на верхнем уровне скрипта или внутри класса. Вы не можете поместить const внутрь цикла for, условия if или функции.
  • define() можно вызывать где угодно: внутри цикла, условия, функции. Это даёт гибкость.
<?php
// Это сработает
if (true) {
    define('DB_HOST', 'localhost');
}

// А это вызовет фатальную ошибку
if (true) {
    // const DB_HOST = 'localhost'; // Ошибка!
}

// Но const можно использовать в классе
class Config {
    const DB_NAME = 'test';
}
?>

Вывод: если вам нужно определить константу динамически (например, в зависимости от условия или внутри функции), выбирайте define().

2. Типы данных

В PHP 7 и 8 define() поддерживает больше типов данных, чем const.

  • const может принимать только скалярные значения (int, float, string, bool, null) и массивы (начиная с PHP 5.6).
  • define() с PHP 7 также поддерживает массивы, а в PHP 8 — даже объекты (но это редкий случай).
<?php
// const может хранить массив (с PHP 5.6)
const FRUITS = ['apple', 'banana', 'cherry'];

// define() тоже может (с PHP 7)
define('VEGETABLES', ['carrot', 'potato']);

// А вот объект — только через define() (PHP 8+)
// const OBJECT = new stdClass(); // Ошибка!
define('MY_OBJECT', new stdClass()); // Работает
?>

Вывод: для большинства задач подходят оба варианта. Но если вам нужно сохранить объект — только define().

3. Контекст: глобальные vs классовые константы

const — универсальный инструмент. Его можно использовать как вне классов (глобальные константы), так и внутри классов (константы классов).

define() — только для глобальных констант. Внутри класса define() не работает.

<?php
class Database {
    // Правильно: константа класса
    const HOST = 'localhost';

    // Ошибка! define() нельзя использовать внутри класса
    // define('PORT', 3306); // Фатальная ошибка
}

// Глобальная константа через define() — можно
define('PORT', 3306);

echo Database::HOST; // localhost
echo PORT;           // 3306
?>

Вывод: если константа относится к классу (логически связана с ним), используйте const. Если это глобальная настройка — подойдёт define().

4. Производительность

Разница в скорости между define() и const минимальна и в 99% случаев не имеет значения. Однако есть нюанс:

  • Так как const обрабатывается на этапе компиляции, доступ к константам классов (ClassName::CONST) происходит чуть быстрее, чем к глобальным константам, определённым через define().
  • Но в реальных проектах эта разница теряется на фоне работы с базой данных, API и файловой системой.

Вывод: не зацикливайтесь на производительности при выборе между define() и const. Руководствуйтесь логикой и читаемостью кода.

5. Регистр имен

По умолчанию имена констант, объявленных через define(), чувствительны к регистру. const — тоже чувствителен.

Однако у define() есть третий параметр — case_insensitive. Если передать true, имя константы будет регистронезависимым.

<?php
define('GREETING', 'Hello', true);
echo greeting; // Hello (работает, хотя регистр другой)

// const не поддерживает регистронезависимость
// const TEST = 'value'; // echo test; // Ошибка!
?>

Важно: параметр case_insensitive устарел в PHP 7.3 и удалён в PHP 8.0. Не используйте его в новом коде.

Когда использовать define(), а когда — const?

Давайте подведём итог в виде простых правил.

Используйте const, если:

  • Константа логически относится к классу (например, HttpStatus::OK).
  • Вы хотите получить чуть более высокую производительность (для констант классов).
  • Вы пишете код на PHP 5.6 или ниже (но мы надеемся, вы уже

Блоги

Рекомендаций по книгам