Сравнение define() и const: создание неизменяемых значений в PHP

Раздел: Основы PHP -> Работа с константами в PHP

Определение констант в PHP

Основной способ объявления констант в PHP - это использование ключевого слова const (доступно с PHP 5.3) или функции define(). Оба подхода создают именованные значения, которые не могут быть изменены после определения, но имеют важные различия.

Как определить константу с помощью define()?

define('PI', 3.14159);
echo PI; // 3.14159

определяет константу php (определение константы в php (define, const))

Функция define принимает имя константы (строку) и её значение. Имя константы по умолчанию чувствительно к регистру. Можно передать третий параметр case_insensitive (true), чтобы сделать имя нечувствительным к регистру (устарело в PHP 7.3, удалено в PHP 8.0).

// Нечувствительность к регистру (только до PHP 7.3)
define('GREETING', 'Hello', true);
echo greeting; // 'Hello' (устарело)

Как определить константу с помощью const?

const SITE_NAME = 'Пример';
echo SITE_NAME; // Пример

Ключевое слово const используется для объявления констант вне класса (на уровне файла) или внутри класса. Оно вычисляется во время компиляции, поэтому может быть быстрее. Константы, объявленные через const, всегда чувствительны к регистру.

Типичная ошибка: попытка переопределить константу. PHP выбросит предупреждение или ошибку.

define('DB_HOST', 'localhost');
define('DB_HOST', '127.0.0.1'); // Notice: Constant DB_HOST already defined

Для проверки существования константы используйте defined():

if (!defined('DB_HOST')) {
    define('DB_HOST', 'localhost');
}

Целесообразность:
- const предпочтительнее для определения констант, которые не зависят от условий времени выполнения, особенно в классах.
- define() подходит для динамических имён (имя формируется из переменной) и условного определения (например, внутри цикла или if).

Как определить константу внутри класса?

class Config {
    const VERSION = '1.0';
    public static function getVersion() {
        return self::VERSION;
    }
}
echo Config::VERSION; // 1.0

Константы класса принадлежат классу, а не объекту. Их можно использовать без создания экземпляра.

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

Как определить константу с динамическим именем?

Только через define, так как const требует статического имени.

$prefix = 'APP_';
$name = 'DEBUG';
define($prefix . $name, true);
echo APP_DEBUG; // 1 (true -> 1)

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

define('123_INVALID', 'test');
echo 123_INVALID; // Синтаксическая ошибка
// Используйте constant()
echo constant('123_INVALID'); // 'test'

Как определить константу с массивом?

С PHP 7.0 const и define поддерживают массивы.

const FRUITS = ['apple', 'banana', 'cherry'];
define('COLORS', ['red', 'green', 'blue']);
echo FRUITS[1]; // banana

Ранее для констант-массивов приходилось использовать serialize.

Как использовать константы с выражениями?

const с PHP 5.6 позволяет вычислять выражения во время компиляции (скалярные выражения). define может использовать любые выражения.

const FULL_WIDTH = 1200;
const HALF_WIDTH = FULL_WIDTH / 2;
define('QUARTER_WIDTH', FULL_WIDTH / 4);
echo HALF_WIDTH; // 600

Ограничение const: нельзя использовать вызовы функций, переменные, или сложную логику. Для таких случаев используйте define.

Как определить константу в пространстве имён?

namespace MyApp;
const DB_NAME = 'mydb';
define('MyApp\\DB_HOST', 'localhost'); // явное указание пространства имён
echo DB_NAME; // 'mydb'
echo constant('MyApp\\DB_HOST'); // 'localhost'

const автоматически использует текущее пространство имён. Для define нужно указывать полностью определённое имя.

Расширенные примеры работы с константами

Пример 1. Использование define с условным определением и функциями

Пример
$env = getenv('APP_ENV') ?: 'production';
if (!defined('APP_ENV')) {
    define('APP_ENV', $env);
}
echo APP_ENV; // 'production' (или значение из окружения)
Вывод: production

Определение константы в зависимости от внешних условий. Важно проверять существование через defined(), чтобы избежать ошибки повторного определения.

Пример 2. Константы в трейтах

Пример
trait Timestamp {
    public const FORMAT = 'Y-m-d H:i:s';
}

class Log {
    use Timestamp;
}

echo Log::FORMAT; // 'Y-m-d H:i:s'

Трейты могут содержать константы (начиная с PHP 8.2). Они наследуются классами, использующими трейт.

Пример 3. Динамическое получение константы через constant()

Пример
define('MAX_LOGIN_ATTEMPTS', 5);
$name = 'MAX_LOGIN_ATTEMPTS';
echo constant($name); // 5

Функция constant() позволяет получить значение константы по строковому имени. Полезна, когда имя неизвестно на этапе написания кода.

Пример 4. Использование const с перечисляемыми типами (enum) в PHP 8.1+

Пример
enum Status: string {
    case Active = 'active';
    case Inactive = 'inactive';
}
echo Status::Active->value; // 'active'

Хотя enum не является константой в классическом смысле, их можно использовать как именованные значения. Константы enum могут быть объявлены внутри enum.

Пример 5. Константы с битовыми флагами

Пример
define('READ', 1);
define('WRITE', 2);
define('EXECUTE', 4);
$permissions = READ | WRITE; // 3
if ($permissions & READ) {
    echo 'Allow read'; // Allow read
}

Константы со степенями двойки удобны для комбинирования флагов.

Пример 6. Глобальные константы для конфигурации приложения

Пример
// config.php
define('DB_HOST', 'localhost');
define('DB_USER', 'root');
define('DB_PASS', '');
define('DB_NAME', 'test');

// index.php
require 'config.php';
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME;

Такой подход прост, но может привести к конфликтам имён. Для больших проектов рекомендуется использовать классы-конфиги или контейнеры.

Пример 7. Константы с объектами (не поддерживаются)

Пример
// define('OBJ', new stdClass()); // Ошибка: Objects are not allowed
// const OBJ = new stdClass(); // Ошибка (только до PHP 8.1: Constant expression contains invalid operations)

Константы могут содержать только скалярные значения, массивы и null (с PHP 8.1 также enum). Для неизменяемых объектов используйте readonly-свойства.

Определение константы в PHP (define, const) - comments

En
определяет константу php (php)