タイトル: 定数
SEOタイトル: PHP 定数完全ガイド (define/const/Enum)
| この記事の要点 |
|
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 |
|---|---|---|
| 評価タイミング | 実行時 | コンパイル時 |
| 条件分岐の中 | OK | NG(最上位スコープのみ) |
| 関数の中 | OK(グローバル定数) | NG |
| クラスの中 | NG | OK(クラス定数) |
| 大文字小文字 | 第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_VERSION | PHP のバージョン文字列 (例 "8.3.2") |
PHP_MAJOR_VERSION | メジャー番号 (8) |
PHP_EOL | OS 依存の改行 (Windows なら \r\n) |
PHP_INT_MAX / PHP_INT_MIN | int の最大/最小 |
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() が定石。定数はライブラリ内部値やマジカルナンバー回避に。