PHPのクラス定数(Class Constants)は、クラス内で定義される変更不可能な値です。const キーワードで宣言し、インスタンスを生成しなくてもアクセスできます。設定値やステータスコードなど、変更されるべきでない固定値の管理に使われます。
クラス定数はプロパティと異なり、$ を付けずに定義し、::(スコープ解決演算子)でアクセスします。PHP 7.1以降はアクセス修飾子も付けられるようになりました。
基本的な使い方
PHP
<?php
class MathConstants {
const PI = 3.14159265358979;
const E = 2.71828182845905;
}
// クラス名::定数名でアクセス
echo "円周率: " . MathConstants::PI . "\n";
echo "自然対数の底: " . MathConstants::E . "\n";
// インスタンスからもアクセス可能
$math = new MathConstants();
echo "PI: " . $math::PI . "\n";
// 定数は変更できない
// MathConstants::PI = 3.14; // Error!
実行結果
円周率: 3.14159265358979
自然対数の底: 2.71828182845905
PI: 3.14159265358979
クラス定数は クラス名::定数名 の形式でアクセスします。new でインスタンスを生成する必要がなく、コードのどこからでも使えます。
ステータス管理での活用
定数は固定のステータス値やカテゴリの管理に最適です。
PHP
<?php
class OrderStatus {
const PENDING = "pending";
const CONFIRMED = "confirmed";
const SHIPPED = "shipped";
const DELIVERED = "delivered";
const CANCELLED = "cancelled";
}
class Order {
private string $status;
public function __construct(
private string $productName,
private int $quantity
) {
$this->status = OrderStatus::PENDING;
}
public function confirm(): void {
$this->status = OrderStatus::CONFIRMED;
}
public function getInfo(): string {
return "{$this->productName} x{$this->quantity}(状態: {$this->status})";
}
}
$order = new Order("PHP入門書", 2);
echo $order->getInfo() . "\n";
$order->confirm();
echo $order->getInfo() . "\n";
実行結果
PHP入門書 x2(状態: pending)
PHP入門書 x2(状態: confirmed)
アクセス修飾子付きの定数
PHP 7.1以降は public、protected、private を定数に付けられます。
PHP
<?php
class Database {
public const VERSION = "8.0";
protected const MAX_CONNECTIONS = 100;
private const PASSWORD = "secret123";
public function getConfig(): string {
// クラス内からはすべてアクセス可能
return "v" . self::VERSION . " (max: " . self::MAX_CONNECTIONS . ")";
}
}
echo Database::VERSION . "\n";
// echo Database::MAX_CONNECTIONS; // Error: protected
// echo Database::PASSWORD; // Error: private
$db = new Database();
echo $db->getConfig() . "\n";
実行結果
8.0
v8.0 (max: 100)
selfとstaticの違い
クラス内で定数にアクセスする際、self と static で挙動が異なります。
PHP
<?php
class ParentClass {
const NAME = "親クラス";
public function showSelf(): string {
return self::NAME; // 定義元のクラスの定数
}
public function showStatic(): string {
return static::NAME; // 実行時のクラスの定数
}
}
class ChildClass extends ParentClass {
const NAME = "子クラス";
}
$child = new ChildClass();
echo "self: " . $child->showSelf() . "\n";
echo "static: " . $child->showStatic() . "\n";
実行結果
self: 親クラス
static: 子クラス
実用的な例
PHP
<?php
class HttpStatus {
const OK = 200;
const CREATED = 201;
const BAD_REQUEST = 400;
const UNAUTHORIZED = 401;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
const MESSAGES = [
self::OK => "OK",
self::CREATED => "Created",
self::BAD_REQUEST => "Bad Request",
self::UNAUTHORIZED => "Unauthorized",
self::NOT_FOUND => "Not Found",
self::SERVER_ERROR => "Internal Server Error",
];
public static function getMessage(int $code): string {
return self::MESSAGES[$code] ?? "Unknown";
}
}
echo HttpStatus::NOT_FOUND . " " . HttpStatus::getMessage(HttpStatus::NOT_FOUND) . "\n";
echo HttpStatus::OK . " " . HttpStatus::getMessage(HttpStatus::OK) . "\n";
実行結果
404 Not Found
200 OK
PHP 8.1のEnum
PHP 8.1以降では enum(列挙型)が導入されました。ステータスやカテゴリの管理には enum の方がより型安全で推奨されます。クラス定数はenum以前のコードや、単純な固定値の管理に引き続き使われます。
注意
定数には配列やスカラー値(文字列、数値、真偽値)のみ使用できます。オブジェクトや関数の戻り値は定数に使えません。また、定数名は慣例として大文字のスネークケース(MAX_RETRY_COUNT など)で命名します。
まとめ
constでクラス内に変更不可の定数を定義できるクラス名::定数名でインスタンスなしにアクセスできる- PHP 7.1以降はアクセス修飾子(public/protected/private)を付けられる
selfは定義元、staticは実行時のクラスの定数を参照する- PHP 8.1のenumがより型安全な選択肢として推奨される