Menu
Coddy logo textTech

Константы в классах

Часть раздела Объектно-ориентированное программирование путешествия по 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

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

challenge icon

Задание

Легко

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

Вы создадите два файла для организации вашего кода:

  • 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

?>
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Объектно-ориентированное программирование