
В PHP константы в классах объявляются с помощью ключевого слова const и доступны без создания экземпляра класса. Константы всегда имеют фиксированное значение и не могут быть изменены после определения, что обеспечивает стабильность логики приложения и предотвращает случайные ошибки при изменении данных.
Синтаксис объявления прост: внутри класса указывается const ИМЯ_КОНСТАНТЫ = значение;. Значение константы может быть числом, строкой, булевым значением или выражением, вычисляемым во время компиляции. Например, const MAX_USERS = 100; создаёт константу, которую можно использовать в методах класса без обращения к объекту.
Доступ к константам осуществляется через оператор ::, например, ClassName::MAX_USERS. В PHP 7.1 и выше разрешено использовать visibility modifiers (public, protected, private), что позволяет ограничивать область видимости константы и контролировать её использование в наследниках класса.
Константы особенно полезны для хранения неизменяемых параметров конфигурации, кодов ошибок, настроек API и других значений, которые должны оставаться постоянными на протяжении работы приложения. Использование констант вместо глобальных переменных повышает читаемость кода и упрощает поддержку проектов.
Объявление констант в классах PHP: примеры и синтаксис
Синтаксис объявления константы:
class ИмяКласса {
const ИМЯ_КОНСТАНТЫ = значение;
}
Примеры:
class Circle {
const PI = 3.14159;
const SHAPE_TYPE = 'circle';
}
Доступ к константам осуществляется через оператор :::
echo Circle::PI; // 3.14159
echo Circle::SHAPE_TYPE; // circle
Особенности и рекомендации:
- Константы могут быть любого скалярного типа: int, float, string, boolean.
- Массивы также поддерживаются с PHP 5.6 и выше.
- Нельзя изменять значение константы после объявления.
- Использование
self::КОНСТАНТАвнутри методов класса позволяет ссылаться на константы текущего класса. - Константы наследуются в дочерних классах, доступ возможен через
parent::КОНСТАНТА.
Пример с методами и наследованием:
class Shape {
const DEFAULT_COLOR = 'black';
public function getColor() {
return self::DEFAULT_COLOR;
}
}
class Rectangle extends Shape {
public function parentColor() {
return parent::DEFAULT_COLOR;
}
}
$rect = new Rectangle();
echo $rect->getColor(); // black
echo $rect->parentColor(); // black
Рекомендуется использовать константы для фиксированных значений, которые логически принадлежат классу, например статусы, лимиты, типы объектов. Это повышает читаемость кода и упрощает поддержку.
Как объявить константу внутри класса PHP

Синтаксис объявления константы следующий:
class MyClass {
const NAME = 'Значение';
}
Константу можно вызвать извне класса через оператор :: без создания экземпляра:
echo MyClass::NAME;
Константа поддерживает только скалярные типы: строка, число, булевый тип, а с PHP 7 – массивы.
Для констант рекомендуется использовать имена в верхнем регистре с подчеркиваниями, чтобы отличать их от свойств класса.
Константы наследуются подклассами, но при необходимости их можно переопределить, объявив новую константу с тем же именем в дочернем классе.
Объявление констант в методах класса недопустимо, они должны быть определены на уровне класса.
Для проверки существования константы используется функция defined('MyClass::NAME'), которая возвращает true или false.
Разница между константами и свойствами класса
Свойства класса объявляются с ключевыми словами public, protected или private и могут изменяться в процессе работы программы. Для доступа к свойствам необходим объект класса ($object->property) или использование статического свойства (self::$property для статических).
Константы поддерживают только скалярные значения, массивы (с PHP 5.6 и выше) и неизменяемые объекты, тогда как свойства класса могут хранить любые типы данных, включая объекты и ресурсы, и изменяться динамически.
Использование констант оправдано для фиксированных настроек, идентификаторов и кодов ошибок, где изменение недопустимо. Свойства подходят для хранения состояния объекта или значений, которые меняются в процессе выполнения методов класса.
При проектировании классов рекомендуется выделять все фиксированные параметры в константы, а изменяемые значения – в свойства. Это повышает читаемость кода и снижает вероятность ошибок, связанных с непреднамеренной модификацией данных.
Доступ к константам через self и static

В PHP доступ к константам внутри класса осуществляется с помощью ключевых слов self и static. self используется для обращения к константам текущего класса, независимо от наследников:
Пример:
class Example {
const VERSION = '1.0';
public function getVersion() {
return self::VERSION;
}
}
Вызов (new Example())->getVersion() вернёт '1.0'. Даже если класс Example будет унаследован, self::VERSION будет ссылаться на константу родителя.
static применяется для позднего статического связывания. Оно позволяет дочерним классам переопределять константы, и при вызове через static будет использоваться константа того класса, через который был сделан вызов:
Пример:
class ParentClass {
const TYPE = 'parent';
public function getType() {
return static::TYPE;
}
}
class ChildClass extends ParentClass {
const TYPE = 'child';
}
Вызов (new ChildClass())->getType() вернёт 'child', тогда как (new ParentClass())->getType() вернёт 'parent'. Это особенно полезно при построении иерархий с изменяемыми константами, где необходимо, чтобы дочерние классы автоматически использовали свои значения.
Рекомендуется использовать self для фиксированных констант, которые не предполагается переопределять, и static для констант, которые должны быть адаптированы в наследниках.
Использование констант вне класса через имя класса

В PHP константы класса доступны вне его экземпляров через синтаксис ИмяКласса::ИМЯ_КОНСТАНТЫ. Это позволяет обращаться к фиксированным значениям без создания объекта класса, что повышает производительность и упрощает код.
Пример объявления и использования константы вне класса:
class Config {
const VERSION = '1.0.3';
const MAX_USERS = 100;
}
Доступ к этим константам вне класса осуществляется так:
echo Config::VERSION; // Выведет 1.0.3
echo Config::MAX_USERS; // Выведет 100
Для динамического обращения можно использовать переменную с именем класса:
$className = 'Config';
echo $className::VERSION;
Важно помнить, что константы класса неизменяемы. Попытка присвоить новое значение приведет к ошибке. Такой подход подходит для настроек, флагов и любых значений, которые должны оставаться фиксированными на протяжении выполнения скрипта.
Также PHP 7+ поддерживает доступ к константам через ключи массива для перечислений классов: constant('ИмяКласса::ИМЯ_КОНСТАНТЫ'), что полезно при генерации кода на основе конфигураций или при работе с пользовательским вводом.
Константы с массивами и другими сложными типами
PHP поддерживает объявление констант класса с массивами с версии 7.0. Константа может хранить многомерные массивы и ассоциативные структуры, что упрощает доступ к фиксированным данным без создания дополнительных методов.
Пример:
class Config {
const DATABASE = [
‘host’ => ‘127.0.0.1’,
‘port’ => 3306,
‘user’ => ‘admin’,
‘password’ => ‘secret’
];
}
Доступ к элементам массива через константу класса:
$user = Config::DATABASE[‘user’];
С PHP 8.1 добавлена поддержка констант с объектами, включая readonly свойства:
class AppSettings {
public const DEFAULT = [‘theme’ => ‘light’, ‘lang’ => ‘en’];
}
Константы не допускают вызовы функций или выражения, вычисляемые во время выполнения. Например:
// Ошибка
const NUMBERS = [rand(1, 10)];
Рекомендации:
— Использовать ассоциативные массивы для структурированных данных.
— Для неизменяемых объектов применять readonly в сочетании с константой.
— Избегать функций и динамических выражений внутри констант.
Такой подход обеспечивает безопасное хранение конфигураций и упрощает доступ к постоянным значениям в коде.
Константы и наследование классов

В PHP константы класса наследуются дочерними классами, но не могут быть изменены. Для доступа к константе родителя используется ключевое слово parent::, а для констант текущего класса – self:: или имя класса. Попытка присвоить новое значение вызовет ошибку.
Пример наследования констант:
class ParentClass {
const STATUS_ACTIVE = 1;
const STATUS_INACTIVE = 0;
}
class ChildClass extends ParentClass {
const STATUS_PENDING = 2;
public function getStatuses() {
return [
self::STATUS_PENDING,
parent::STATUS_ACTIVE,
parent::STATUS_INACTIVE
];
}
}
Важно помнить:
| Ситуация | Поведение |
|---|---|
| Объявление константы с тем же именем в дочернем классе | Константа перекрывает константу родителя, но доступ к родительской возможен через parent:: |
| Доступ к константе через объект | PHP разрешает обращаться через объект, но рекомендует использовать имя класса для ясности |
| Наследование интерфейсов | Интерфейсные константы всегда публичные и автоматически доступны в классах, реализующих интерфейс |
Рекомендации:
- Используйте уникальные имена констант для избегания конфликта при наследовании.
- Для логических групп констант создавайте отдельные базовые классы или интерфейсы.
- При перекрытии констант явно указывайте
parent::CONSTANT, чтобы код оставался читаемым.
Изменение поведения констант с помощью final

В PHP начиная с версии 8.1 появилась возможность объявлять константы в классах с модификатором final. Это запрещает переопределение константы в наследуемых классах и обеспечивает стабильное поведение кода.
Синтаксис объявления выглядит следующим образом:
class Base {
final public const STATUS_ACTIVE = 1;
}
Попытка изменить или переопределить такую константу в дочернем классе вызовет фатальную ошибку:
class Child extends Base {
// Ошибка: Cannot override final constant Base::STATUS_ACTIVE
public const STATUS_ACTIVE = 2;
}
Рекомендации по использованию final с константами:
- Применяйте
final, если константа используется для критически важных значений, которые не должны меняться в иерархии классов. - Для констант конфигурации или флагов состояния, которые могут различаться в наследниках,
finalне использовать. - Использование
finalповышает читаемость и предсказуемость кода, особенно в больших проектах с множеством наследников. - Комбинируйте
finalсpublic,protectedилиprivateдля точного контроля доступа к константе.
Пример с различными уровнями доступа:
class Example {
final public const PUBLIC_CONST = 'public';
final protected const PROTECTED_CONST = 'protected';
final private const PRIVATE_CONST = 'private';
}
Использование final делает константы частью стабильного интерфейса класса, предотвращая непреднамеренные изменения в наследниках и упрощая поддержку кода.
Ошибки при обращении к константам и как их избегать
Одна из частых ошибок – попытка изменить значение константы после её объявления. В PHP это приведет к Fatal error. Константы должны быть неизменяемыми, поэтому любые операции присваивания после определения недопустимы:
Неправильно:
class Example { const VERSION = 1.0; }
Example::VERSION = 2.0; // Ошибка
Правильный подход – создавать новую константу с другим именем, если требуется изменить значение.
Ошибка при обращении к несуществующей константе возникает, когда опечатка в имени или неверный класс используются в синтаксисе ::. PHP вернет Notice и может интерпретировать константу как строку. Это особенно критично при динамическом формировании имен:
Неправильно:
echo Example::VERSI0N; // Notice: Undefined class constant
Чтобы избежать ошибок, используйте функцию defined('ClassName::CONSTANT') перед обращением:
Пример безопасного обращения:
if (defined('Example::VERSION')) {
echo Example::VERSION;
}
Ошибка доступа к константе через объект вместо класса возникает при использовании $object->CONSTANT. Константы в PHP не являются свойствами объектов и должны вызываться через имя класса или ключевое слово self внутри класса:
Неправильно:
$example = new Example();
echo $example->VERSION; // Ошибка
Правильно:
echo Example::VERSION;
echo self::VERSION; // внутри класса
Также частая ошибка – попытка использовать константу как переменную при конкатенации строк или математических операциях без правильного синтаксиса. Константы не требуют знака $ и должны использоваться напрямую:
Неправильно:
$version = $Example::VERSION; // Ошибка
Правильно:
$version = Example::VERSION;
Следуя этим правилам, вы исключаете синтаксические ошибки и повышаете читаемость кода, избегая неожиданных уведомлений и фатальных ошибок при работе с константами в классах PHP.
Вопрос-ответ:
Как объявить константу внутри класса в PHP?
Константу внутри класса можно объявить с помощью ключевого слова const. Оно указывается перед именем константы. Например: class Example { const VERSION = '1.0'; }. После объявления значение константы нельзя изменить, и оно доступно через имя класса: Example::VERSION.
В чем разница между свойствами и константами класса?
Свойства класса могут иметь разные значения для разных объектов и могут быть изменяемыми, тогда как константы фиксируют значение и одинаковы для всех экземпляров класса. Константы доступны без создания объекта, через обращение к имени класса, а свойства чаще используют внутри методов экземпляров.
Можно ли использовать вычисляемое значение при объявлении константы в классе?
Нет, в PHP значение константы должно быть известно на момент объявления и должно быть литералом (строка, число, массив или логическое значение). Нельзя использовать выражения с вызовами функций, арифметику или переменные. Например, const PI = 3.14; допустимо, а const PI2 = 3.14 * 2; — вызовет ошибку.
Как обратиться к константе родительского класса из дочернего класса?
Если класс-наследник хочет использовать константу родителя, можно обратиться через имя родителя и оператор разрешения области: ParentClass::CONSTANT_NAME. Также можно использовать ключевое слово parent внутри дочернего класса: parent::CONSTANT_NAME, что позволяет ссылаться на константу без прямого упоминания имени родителя.
