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 以降は常に大文字小文字区別名付け規約を統一(全大文字推奨)

参考リンク

長野県・北アルプス地方在住のフリーランスWebプログラマー。
「落ち着くためのWeb開発」をテーマに、訪れる人が安心して使えるサービスづくりを心がけています。

LaravelやWordPressなどのWebアプリケーション開発を得意とし、技術面の安定性はもちろん、運用後も長く活用できる設計を大切にしています。
静かな山間の暮らしから生まれる視点で、シンプルかつ本質的な解決策をご提案します。

野鳥観察も趣味のひとつで、特にミソサザイ(Wren)に魅力を感じています。
小さな体に反して力強く上向きの尾羽、そして澄んだ鳴き声が遠くまで響く姿に、静かな存在感と芯の強さを感じます。
このサイト名「Laravel Wren」には、そんなミソサザイのように、小さくても確かな価値を届けたいという想いを込めています。

信頼できるパートナーとして、そして気軽に相談できる存在として、あなたのWebプロジェクトをサポートします。

Yudai Tsuyuzakiをフォローする