Menu
Coddy logo textTech

クラス定数

CoddyのPHPジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 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

チャレンジ

簡単

クラス定数を使用して、決して変更されない固定の変換値を保存する温度変換ユーティリティを作成しましょう。

コードを整理するために、2つのファイルを作成します。

  • Temperature.php — 温度変換を処理する Temperature クラスを定義します。このクラスには、0 に設定された FREEZING_POINT_C100 に設定された BOILING_POINT_C、および 1.8 に設定された CONVERSION_FACTOR(摂氏から華氏への変換に使用)の3つの定数を持たせる必要があります。public $celsius プロパティと、摂氏の値を受け取って設定するコンストラクタを含めてください。保存された摂氏温度を (celsius * CONVERSION_FACTOR) + 32 の公式を使用して華氏に変換する toFahrenheit() メソッドを追加します。また、温度が凝固点定数と等しい場合は "Freezing"、沸点定数と等しい場合は "Boiling"、それ以外の場合は "Normal" を返す getStatus() メソッドも追加してください。
  • main.php — Temperature クラスファイルを読み込みます。010025 の値を持つ3つの Temperature オブジェクトを作成します。各温度について、華氏への変換結果に続いてステータスを "[fahrenheit]F - [status]" という形式で同じ行に出力します。各温度はそれぞれ新しい行に出力してください。3つすべてを出力した後、クラスから直接 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: 0、100、25の値を指定して3つのTemperatureオブジェクトを作成する

// TODO: 各温度について、次の形式で出力する: "[fahrenheit]F - [status]"
// 各温度を個別の行に出力すること

// TODO: クラスから直接 BOILING_POINT_C 定数にアクセスして出力する
// ClassName::CONSTANT_NAME 構文を使用すること

?>
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン