5.

PHP 定数完全ガイド (define/const/Enum)

編集
この記事の要点
  • PHP の定数定義define("NAME", "value") 関数と const NAME = "value" キーワード (PHP 5.3+) の 2 種類
  • define()実行時評価constコンパイル時評価。条件分岐内で使えるのは define のみ
  • const COLORS = ["red", "blue"] のように配列も可 (PHP 5.6+)、定数式 (1 + 2 など) も OK
  • 存在判定は defined("NAME")、列挙的な値は PHP 8.1+ の Enum がベター
  • PHP_VERSION / PHP_EOL / __LINE__ 等の事前定義定数、クラス定数 class Foo { const BAR = 1; } も基本

PHP の定数とは

PHP の定数 (constant) は、一度定義したら再代入できない名前付きの値です。設定値・APIキー・マジカルナンバー回避など、コード全体で共有したい不変値に使います。

  • 変数と違い $ を付けない(NAME であって $NAME ではない)
  • 大文字スネークケースが慣例(MAX_RETRY
  • スコープはグローバル(クラス定数を除く)
  • スカラ値(int/float/string/bool/null)+ 配列 + 定数式が代入可能

define() と const の使い分け

// ① define() - 関数。実行時に評価される
define('SITE_NAME', 'My Wiki');
define('MAX_RETRY', 3);

// ② const - キーワード (PHP 5.3+)。コンパイル時に評価
const SITE_URL = 'https://example.com';
const TIMEOUT = 30;

// 参照
echo SITE_NAME;       // My Wiki
echo SITE_URL;        // https://example.com

// 配列も OK (PHP 5.6+)
const COLORS = ['red', 'green', 'blue'];
define('STATUS', ['ok' => 200, 'ng' => 500]);

// 定数式 (PHP 5.6+)
const BUFFER_SIZE = 1024 * 64;

define() と const の違い(重要)

項目define()const
評価タイミング実行時コンパイル時
条件分岐の中OKNG(最上位スコープのみ)
関数の中OK(グローバル定数)NG
クラスの中NGOK(クラス定数)
大文字小文字第3引数廃止 (PHP 7.3+ で deprecated)常に区別
速度わずかに遅いわずかに速い
// ✅ 条件分岐内で define() は OK
if (PHP_OS === 'Linux') {
    define('TMP_DIR', '/tmp');
} else {
    define('TMP_DIR', 'C:\\Temp');
}

// ❌ const は条件分岐内では使えない
if (PHP_OS === 'Linux') {
    const TMP_DIR = '/tmp';  // Parse error
}

// ✅ クラス内では const のみ
class Config {
    const VERSION = '1.0';
    const PI = 3.14159;
}
echo Config::VERSION;

定数の存在判定

define('API_KEY', 'secret');

// 存在判定
if (defined('API_KEY')) {
    echo 'API_KEY is defined: ' . API_KEY;
}

// 未定義参照は警告 + 文字列として扱われる (PHP 7.x まで)
// PHP 8.0+ では Error
echo UNDEFINED_CONST;
// → PHP 7: Notice: Use of undefined constant
// → PHP 8: Error: Undefined constant "UNDEFINED_CONST"

// 安全な参照: constant() 関数
$val = defined('API_KEY') ? constant('API_KEY') : null;

事前定義定数 (Predefined Constants)

定数意味
PHP_VERSIONPHP のバージョン文字列 (例 "8.3.2")
PHP_MAJOR_VERSIONメジャー番号 (8)
PHP_EOLOS 依存の改行 (Windows なら \r\n)
PHP_INT_MAX / PHP_INT_MINint の最大/最小
PHP_OS実行 OS (Linux / WINNT / Darwin)
DIRECTORY_SEPARATORパス区切り (Linux="/", Windows="\")
M_PI円周率 3.14159...
__LINE__現在の行番号(マジック定数)
__FILE__現在のファイルのフルパス
__DIR__現在のディレクトリ
__FUNCTION__現在の関数名
__CLASS__現在のクラス名
__METHOD__クラス名::メソッド名
__NAMESPACE__現在の名前空間

クラス定数

class HttpStatus {
    const OK = 200;
    const NOT_FOUND = 404;
    const INTERNAL_ERROR = 500;

    // 可視性指定 (PHP 7.1+)
    public const VERSION = '1.0';
    private const SECRET = 'xxxxx';

    // 配列も OK (PHP 5.6+)
    public const MESSAGES = [
        self::OK => 'OK',
        self::NOT_FOUND => 'Not Found',
    ];
}

echo HttpStatus::OK;         // 200
echo HttpStatus::MESSAGES[200];  // OK

// インターフェースの定数 (実質 public final)
interface Logger {
    const LEVEL_DEBUG = 0;
    const LEVEL_INFO = 1;
}

Enum との比較 (PHP 8.1+)

「限られた候補値の集合」を表すなら、定数より Enum がベターです。型安全になり IDE 補完も効きます。

// 旧: クラス定数で擬似 Enum
class Status {
    const ACTIVE = 'active';
    const INACTIVE = 'inactive';
    const PENDING = 'pending';
}

function setStatus(string $s): void { /* 何でも入る */ }
setStatus('typo');  // 通ってしまう

// 新: Enum (PHP 8.1+)
enum Status: string {
    case Active = 'active';
    case Inactive = 'inactive';
    case Pending = 'pending';
}

function setStatus(Status $s): void { /* Enum 型のみ */ }
setStatus(Status::Active);     // OK
setStatus('typo');              // TypeError

// Enum のメソッド
enum HttpStatus: int {
    case Ok = 200;
    case NotFound = 404;

    public function label(): string {
        return match($this) {
            self::Ok => 'OK',
            self::NotFound => 'Not Found',
        };
    }
}
echo HttpStatus::Ok->label();   // OK
echo HttpStatus::Ok->value;     // 200

定数の使い分け指針

用途推奨
環境設定(DB 接続情報等).env + env() / config()
名前空間内の不変値const
クラスのバージョン・上限値クラス定数
条件分岐で値が変わるdefine()
限られた候補値の集合Enum (PHP 8.1+)
マジカルナンバー回避const またはクラス定数

FAQ

Q: define と const どちらを使うべき?
A: PHP 5.3+ なら基本 const 推奨(コンパイル時評価で速い、IDE 補完が効く)。条件分岐・関数内・動的キーで定義したい時のみ define

Q: 定数に変数を入れたい
A: define() は実行時評価なので define("USER", $_ENV["USER"]) が可能。const は不可。

Q: クラス定数を継承先で上書きできる?
A: 可能。final const FOO = 1; (PHP 8.1+) で上書き禁止にできます。

Q: 設定値は定数より env() を推奨?
A: Laravel/Symfony プロジェクトでは .env + config() が定石。定数はライブラリ内部値やマジカルナンバー回避に。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 基本事項
  2. HTMLへの埋め込み
  3. 変数
  4. 可変変数
  5. 定数
  6. データ型
  7. キャスト
  8. エスケープ文字
  9. 配列
  10. 演算子
  11. 代入の際の注意点
  12. 条件分岐
  13. 繰り返し処理
  14. クラスとインスタンス
  15. コンストラクタ
  16. 関数
  17. スーパーグローバル変数
  18. スコープ
  19. staticについて
  20. yieldについて
  21. ファイルのアップロード方法
  22. DB接続方法
  23. SQL実行方法
  24. カプセル化の具体例
  25. 継承の構文
  26. オーバーライド
  27. ポリモーフィズム(多様性)の具体例
  28. 抽象クラス・メソッドの構文と具体例
  29. GET通信
  30. try catchで全てのエラーを拾う方法

最近更新/作成されたページ