Ответ
В PHP константы объявляются в разных контекстах в зависимости от их назначения и области видимости.
-
Глобальные константы: Объявляются с помощью
define()или ключевого словаconstвне класса.define()работает во время выполнения,const— на этапе компиляции.// config/constants.php define('APP_ENV', 'production'); // Можно объявить в условии if const APP_NAME = 'MyApplication'; // Должна быть объявлена в глобальной области видимости const MAX_LOGIN_ATTEMPTS = 5; -
Константы класса: Объявляются внутри класса с помощью
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 -
Константы интерфейса: Аналогично классам, используются для определения контрактов.
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. Это овердохуища полезно для сокрытия внутренних констант, которые не должны светиться наружу. Раньше-то они все были публичными, а сейчас — красота.
Вот и вся магия. Главное — не смешивать всё в одну кучу, а то получится пиздопроебибна, в которой через месяц сам не разберёшься.