クラス定数
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重要なポイント: 静的プロパティとは異なり、定数は一度定義されると変更できません。これらは、設定値、ステータスコード、数学定数など、アプリケーション全体で固定されるべき値に最適です。
チャレンジ
簡単クラス定数を使用して、決して変更されない固定の変換値を保存する温度変換ユーティリティを作成しましょう。
コードを整理するために、2つのファイルを作成します。
Temperature.php— 温度変換を処理するTemperatureクラスを定義します。このクラスには、0に設定されたFREEZING_POINT_C、100に設定されたBOILING_POINT_C、および1.8に設定されたCONVERSION_FACTOR(摂氏から華氏への変換に使用)の3つの定数を持たせる必要があります。public $celsiusプロパティと、摂氏の値を受け取って設定するコンストラクタを含めてください。保存された摂氏温度を(celsius * CONVERSION_FACTOR) + 32の公式を使用して華氏に変換するtoFahrenheit()メソッドを追加します。また、温度が凝固点定数と等しい場合は"Freezing"、沸点定数と等しい場合は"Boiling"、それ以外の場合は"Normal"を返すgetStatus()メソッドも追加してください。main.php— Temperature クラスファイルを読み込みます。0、100、25の値を持つ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 構文を使用すること
?>このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。