基礎

PHPのクラス定数|constで変更不可の値を定義する方法

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以降は publicprotectedprivate を定数に付けられます。

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の違い

クラス内で定数にアクセスする際、selfstatic で挙動が異なります。

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がより型安全な選択肢として推奨される