- カテゴリ: PHP
- 掲載バージョン: PHP 8.4
- 名前空間 / FQCN / コマンド:
define(グローバル関数) - 関連: defined / constant / const / get_defined_constants / 名前空間定数
- 変更履歴: PHP 7.0 で配列を定義可能に、PHP 7.3 で大文字小文字非区別定数が非推奨、PHP 8.0 で
case_insensitive引数削除
要点(TL;DR)
- 何に使うか:実行時にグローバル(または名前空間)定数を定義する
- 最低限の使い方:
define('APP_ENV', 'production'); - よくある罠:
- 同名定数の再定義は警告(E_WARNING)
- 大文字小文字非区別定数は PHP 8 で廃止
- クラス定数は
defineでは作れない(public constを使う)
概要
define は、コードの実行時に定数を追加する関数です。設定値の読み込み後に定めたい定数や、条件により定数名/値を切り替えたいときに使います。コンパイル時に確定する const と違い、実行時のロジック・入出力の結果に基づき定義できるのが利点です。
構文 / シグネチャ
bool define(string $name, mixed $value);
引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
$name | string | ✅ | — | 定数名。'FOO' や 'App\BAR'(名前空間定数) |
$value | mixed | ✅ | — | 定数値。スカラ・配列等(リソースは不可) |
- 戻り値:
bool(成功でtrue、失敗でfalse) - 例外/副作用:
- 既存名の再定義や不正な名前で E_WARNING を発することがある
- グローバル/指定名前空間の定数表を更新する(破壊的)
使用例
最小例
<?php
define('APP_ENV', 'production');
if (defined('APP_ENV')) {
echo APP_ENV; // production
}
実務例(名前空間・配列定数・環境に応じた定義)
<?php
namespace App;
$config = [
'env' => $_ENV['APP_ENV'] ?? 'local',
'debug' => ($_ENV['APP_DEBUG'] ?? '0') === '1',
'roles' => ['admin', 'editor', 'viewer'], // PHP 7+ で配列OK
];
// 名前空間定数: "App\CONFIG" として定義される
define(__NAMESPACE__ . '\CONFIG', $config);
// 同じ名前を再定義しない安全策
if (!defined(__NAMESPACE__ . '\VERSION')) {
define(__NAMESPACE__ . '\VERSION', '1.2.3');
}
echo CONFIG['env']; // local / staging / production など
echo VERSION; // 1.2.3(同一名前空間内なら短縮名で参照可)
よくある落とし穴・注意
- 再定義は警告:同名を再度
defineすると E_WARNING。defined('NAME')で防ぐ。 - 大小非区別は廃止:
define('FOO', 'x', true)は PHP 8 で使用不可。 - クラス定数は不可:
define('Class::CONST', ...)はできない。class X { public const C = 1; }を使う。 - 名前の妥当性:
__MAGIC__風など PHP が予約する形式は避ける。慣例的に全大文字+スネークケース。 - スコープ誤解:
defineは関数内で呼んでもグローバル/名前空間定数。ローカルに限定されない。
代替・関連APIとの比較
const:コンパイル時に確定。クラス定数/名前空間定数に最適。条件分岐や関数呼び出し結果は不可。高速・静的。define:実行時に確定。環境変数や設定ファイルの結果で値を決めたいときに。柔軟。defined:存在チェック。再定義回避に必須。constant:文字列名から定数値を取得(動的参照)。get_defined_constants:全定数の一覧(デバッグ用途)。
テスト例(Pest)
<?php
it('defines a runtime constant', function () {
// 定数が未定義なら定義
if (!defined('TEST_FLAG')) {
define('TEST_FLAG', true);
}
expect(defined('TEST_FLAG'))->toBeTrue()
->and(TEST_FLAG)->toBeTrue();
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
PHP Warning: Constant FOO already defined | 同名で再定義 | defined('FOO') を挟む/一箇所に集約 |
Undefined constant FOO | 文字列をクォートせず使用(echo FOO だが未定義) | 先に define('FOO', '...')、または 'FOO' とクォートし constant('FOO') を使う |
| 名前空間内で参照できない | 定義は App\NAME だが \NAME を参照 | 同一NSなら NAME、他からは \App\NAME を参照 |
| 大文字小文字が合わない | PHP 8 以降は常に大文字小文字区別 | 名付け規約を統一(全大文字推奨) |
参考リンク
- PHP マニュアル — define
- PHP マニュアル — defined
- PHP マニュアル — constant
- PHP マニュアル — 定数(言語リファレンス)
- PHP マニュアル — 名前空間:定数

