define — 実行時にグローバル定数を定義する

PHP
  • カテゴリ: 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);

引数(表)

引数必須既定値説明
$namestring定数名。'FOO''App\BAR'(名前空間定数)
$valuemixed定数値。スカラ・配列等(リソースは不可)
  • 戻り値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 以降は常に大文字小文字区別名付け規約を統一(全大文字推奨)

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする