Где объявлять константы в PHP?

Ответ

В PHP константы объявляются в разных контекстах в зависимости от их назначения и области видимости.

  1. Глобальные константы: Объявляются с помощью define() или ключевого слова const вне класса. define() работает во время выполнения, const — на этапе компиляции.

    // config/constants.php
    define('APP_ENV', 'production'); // Можно объявить в условии if
    const APP_NAME = 'MyApplication'; // Должна быть объявлена в глобальной области видимости
    const MAX_LOGIN_ATTEMPTS = 5;
  2. Константы класса: Объявляются внутри класса с помощью const. Они относятся к классу, а не к его экземплярам (объектам).

    class DatabaseConfig {
        const DRIVER = 'mysql';
        const HOST = '127.0.0.1';
        const PORT = 3306;
    
        public static function getDsn(): string {
            return sprintf(
                '%s:host=%s;port=%d',
                self::DRIVER,
                self::HOST,
                self::PORT
            );
        }
    }
    // Обращение: DatabaseConfig::HOST
  3. Константы интерфейса: Аналогично классам, используются для определения контрактов.

    interface HttpStatus {
        const OK = 200;
        const NOT_FOUND = 404;
        const INTERNAL_ERROR = 500;
    }

Лучшие практики:

  • Используйте классовые константы для значений, логически связанных с определенным классом (настройки, коды состояний).
  • Глобальные константы (define) удобны для конфигурации среды, которая может определяться динамически.
  • Имена констант принято писать в UPPER_SNAKE_CASE.
  • Начиная с PHP 7.1, константы класса могут иметь модификатор видимости (public, private, protected).

Ответ 18+ 🔞

Блин, слушай, тут про константы в PHP — тема вроде простая, но столько нюансов, что просто ёперный театр начинается. Сейчас разложу по полочкам, чтобы ты не охуел потом в коде.

Вот смотри, есть три основных способа объявить эту самую константу, и каждый — для своего случая.

Первое — глобальные константы. Это когда ты хочешь, чтобы значение было доступно отовсюду, как будто хуй с горы торчит, всем видно. Делается через define() или через const, но разница есть, и она важная.

define('APP_ENV', 'production'); — это как динамическое объявление, можно хоть в условии if запихнуть, работает во время выполнения. А вот const MAX_ATTEMPTS = 5; — это уже на этапе компиляции, её нужно объявлять в самой верхней области видимости, в глобальной зоне. Если попробуешь в условии — будет тебе хиросима, ошибка.

// config/constants.php
define('APP_ENV', 'production'); // Можно и в if-е, если надо
const APP_NAME = 'MyApp'; // Только на верхнем уровне, блядь!
const MAX_LOGIN_ATTEMPTS = 5;

Второе — константы класса. Вот это уже поинтереснее. Объявляются внутри класса через const. Они привязаны не к объекту, а к самому классу. То есть, чтобы получить значение, тебе не нужен new, обращаешься прямо через имя класса с двумя двоеточиями. Удобно для всяких настроек, которые к логике класса относятся.

class DatabaseConfig {
    const DRIVER = 'mysql';
    const HOST = '127.0.0.1';
    const PORT = 3306;

    public static function getDsn(): string {
        // Используем self:: чтобы сослаться на константу этого же класса
        return sprintf(
            '%s:host=%s;port=%d',
            self::DRIVER,
            self::HOST,
            self::PORT
        );
    }
}
// Используем так: DatabaseConfig::HOST

Третье — константы интерфейса. Почти то же самое, что и в классе, но объявляются в интерфейсах. Часто используются для описания какого-то контракта, например, кодов ответа.

interface HttpStatus {
    const OK = 200;
    const NOT_FOUND = 404;
    const INTERNAL_ERROR = 500;
}

А теперь, ёпта, про лучшие практики, чтобы не быть распиздяем:

  • Классовые константы — твой лучший друг для всего, что связано с логикой конкретного класса. Коды ошибок, настройки, флаги — всё туда.
  • Глобальные define — оставь для реально глобальных штук, типа конфига среды (APP_ENV), который может определяться в рантайме.
  • Имена, блядь, всегда пиши в UPPER_SNAKE_CASE. APP_NAME, а не appName или ещё какую дичь. Это как неписаное правило, доверия к коду, который его нарушает, — ебать ноль.
  • И запомни с PHP 7.1: у констант класса теперь может быть модификатор видимости! public, private, protected. Это овердохуища полезно для сокрытия внутренних констант, которые не должны светиться наружу. Раньше-то они все были публичными, а сейчас — красота.

Вот и вся магия. Главное — не смешивать всё в одну кучу, а то получится пиздопроебибна, в которой через месяц сам не разберёшься.