この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:guest
更新日時:2026-06-11 07:10:02

タイトル: 定数
SEOタイトル: 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() が定石。定数はライブラリ内部値やマジカルナンバー回避に。