Константы в классах
Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy — урок 16 из 91.
Иногда вам нужны значения в классе, которые никогда не должны меняться. Константы класса предоставляют способ определения фиксированных значений, которые остаются неизменными для всех экземпляров и не могут быть изменены после объявления.
Вы определяете константу с помощью ключевого слова const внутри класса. По соглашению имена констант пишутся в верхнем регистре:
<?php
class Circle {
const PI = 3.14159;
public $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return self::PI * $this->radius * $this->radius;
}
}
$circle = new Circle(5);
echo $circle->area();
Вывод:
78.53975Как и статические свойства, константы принадлежат классу, а не отдельным объектам. Вы обращаетесь к ним, используя self::CONSTANT_NAME внутри класса или ClassName::CONSTANT_NAME снаружи:
<?php
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
}
echo HttpStatus::OK . "\n";
echo HttpStatus::NOT_FOUND;
Вывод:
200
404Ключевой момент: В отличие от статических свойств, константы не могут быть изменены после определения. Они идеально подходят для значений, которые должны оставаться неизменными во всем приложении, таких как конфигурационные значения, коды состояния или математические константы.
Задание
ЛегкоДавайте создадим утилиту для конвертации температуры, которая использует константы класса для хранения фиксированных значений преобразования, которые никогда не меняются.
Вы создадите два файла для организации вашего кода:
Temperature.php— Определите классTemperature, который обрабатывает преобразования температуры. Класс должен иметь три константы:FREEZING_POINT_Cсо значением0,BOILING_POINT_Cсо значением100иCONVERSION_FACTORсо значением1.8(используется для перевода из Цельсия в Фаренгейт). Добавьте свойствоpublic $celsiusи конструктор, который принимает и устанавливает значение Цельсия. Добавьте методtoFahrenheit(), который преобразует сохраненную температуру Цельсия в Фаренгейт по формуле:(celsius * CONVERSION_FACTOR) + 32. Также добавьте методgetStatus(), который возвращает"Freezing", если температура равна константе точки замерзания,"Boiling", если она равна константе точки кипения, или"Normal"в противном случае.main.php— Подключите файл класса Temperature. Создайте три объекта Temperature со значениями0,100и25. Для каждой температуры выведите результат преобразования в Фаренгейт, а затем статус в той же строке в формате:"[fahrenheit]F - [status]". Каждая температура должна быть на новой строке. После вывода всех трех значений обратитесь к константеBOILING_POINT_Cнапрямую из класса (используяTemperature::BOILING_POINT_C) и выведите ее на новой строке.
Помните, что доступ к константам осуществляется с помощью self::CONSTANT_NAME внутри класса и ClassName::CONSTANT_NAME извне. В отличие от свойств, константы не используют символ $ при обращении к ним.
Шпаргалка
Константы класса — это фиксированные значения, которые никогда не меняются и являются общими для всех экземпляров класса. Определяйте их с помощью ключевого слова const:
<?php
class Circle {
const PI = 3.14159;
public function area($radius) {
return self::PI * $radius * $radius;
}
}
Обращайтесь к константам, используя self::CONSTANT_NAME внутри класса:
return self::PI * $radius * $radius;
Обращайтесь к константам, используя ClassName::CONSTANT_NAME вне класса:
echo Circle::PI;
Основные отличия от статических свойств:
- Константы нельзя изменить после объявления
- Константы не используют символ
$ - Константы идеально подходят для фиксированных значений, таких как настройки конфигурации, коды состояния или математические константы
По соглашению имена констант пишутся в верхнем регистре:
<?php
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
}
echo HttpStatus::OK; // 200
Попробуйте сами
<?php
require_once 'Temperature.php';
// TODO: Создайте три объекта Temperature со значениями 0, 100 и 25
// TODO: Для каждой температуры выведите в формате: "[fahrenheit]F - [status]"
// Каждая температура на отдельной строке
// TODO: Обратитесь к константе BOILING_POINT_C и выведите её напрямую из класса
// Используйте синтаксис ClassName::CONSTANT_NAME
?>В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Внешние файлыВведение в ООПКлассы и объектыКлючевое слово $thisМетодыСвойстваКонструктор (__construct)Деструктор (__destruct)Итоги — Простой калькулятор4Наследование
Основы наследованияКлючевое слово parent::Переопределение методовКлючевое слово finalАбстрактные классыИтоги — Иерархия сотрудников7Инкапсуляция
Public, Protected, PrivateПодробный разбор модификаторов доступаГеттеры и сеттерыСокрытие данныхConstructor Promotion (8.0)Итоги — Система учета студентов10Продвинутые концепции ООП
Композиция против наследованияВнедрение зависимостейАнонимные классыПеречисления (PHP 8.1)Файберы (PHP 8.1)Глубокое погружение в клонирование объектовГенераторы и итераторы13Паттерны проектирования. Часть 2
Паттерн КомандаПаттерн АдаптерПаттерн ДекораторПаттерн Шаблонный методПаттерн СостояниеПаттерн КомпоновщикПаттерн Репозиторий2Пространства имен и автозагрузка
Введение в пространства именКлючевое слово useСтандарт автозагрузки PSR-4Автозагрузчик ComposerИтоги: структурированный проект5Интерфейсы и контракты
Введение в интерфейсыРеализация интерфейсовРеализация нескольких интерфейсовИнтерфейс против абстрактного классаType Hinting с интерфейсамиИтоги — Калькулятор фигур8Магические методы
Введение в магические методы__toString и __debugInfo__get, __set, __isset, __unset__call и __callStatic__clone и клонирование объектов__serialize и __unserializeИтоги — Кастомная коллекция11Система типов и обработка ошибок
Объявление типовNullable-типыТипы объединения и пересеченияКлассы исключенийИерархия пользовательских исключенийTry, Catch, FinallyИтоги — Валидатор форм14Проект: Управление библиотекой
Обзор проектаКлассы Book и User3Свойства классов
Свойства экземпляра и статические свойстваКонстанты в классахСтатические методы и свойстваПриватные и защищенные свойстваСвойства Readonly (PHP 8.1)Итоги — Менеджер банковского счета6Полиморфизм
Снова о переопределении методовПолиморфизм через интерфейсыType Hinting и Union TypesПозднее статическое связываниеИтоги — Payment Processor9Трейты
Введение в трейтыИспользование нескольких трейтовРазрешение конфликтов трейтовАбстрактные методы в трейтахТрейты и наследование12Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн SingletonПаттерн FactoryПаттерн ObserverПаттерн Strategy