Menu
Coddy logo textTech

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

Часть раздела Объектно-ориентированное программирование путешествия по PHP на Coddy. Урок 16 из 91.

Иногда вам нужны значения в class, которые никогда не должны изменяться. constants class позволяют Define фиксированные значения, которые остаются одинаковыми во всех экземплярах и не могут быть изменены после объявления.

Вы определяете константу с помощью ключевого слова 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

Как и статические свойства, constants принадлежат классу, а не отдельным objects. Вы access их с помощью 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

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

challenge icon

Задание

Легко

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

Вы создадите два файла, чтобы организовать свой код:

  • Temperature.php: Define class Temperature, которая обрабатывает преобразования температуры. У class должны быть три constants: FREEZING_POINT_C со значением 0, BOILING_POINT_C со значением 100 и CONVERSION_FACTOR со значением 1.8 (используется для преобразования Celsius в Fahrenheit). Добавьте свойство public $celsius и constructor, который accepts и устанавливает значение Celsius. Добавьте method toFahrenheit(), преобразующий сохранённую температуру Celsius в Fahrenheit по Formula: (celsius * CONVERSION_FACTOR) + 32. Также добавьте method getStatus(), который возвращает "Freezing", если температура equals constant точки замерзания, "Boiling", если она equals constant точки кипения, или "Normal" otherwise.
  • main.php: Подключите файл class Temperature. Создайте три объекта Temperature со значениями 0, 100 и 25. Для каждой температуры print преобразование в Fahrenheit, за которым следует статус в той же строке, в формате: "[fahrenheit]F - [status]". Каждая температура должна находиться на собственной строке. После вывода всех трёх directly access constant BOILING_POINT_C из class (using Temperature::BOILING_POINT_C) и выведите её на новой строке.

Помните, что constants access using self::CONSTANT_NAME inside class и ClassName::CONSTANT_NAME outside. В отличие от свойств, constants не используют символ $ при обращении к ним.

Попробуйте сами

<?php

require_once 'Temperature.php';

// TODO: Создайте три объекта Temperature со значениями 0, 100 и 25

// TODO: Для каждой температуры выведите в формате: "[fahrenheit]F - [status]"
// Каждая температура на своей строке

// TODO: Обратитесь к константе BOILING_POINT_C и выведите её напрямую из класса
// Используйте синтаксис ClassName::CONSTANT_NAME

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

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор PHP