define() / defined() / const
| 対応: | PHP 4(2000) |
|---|
プログラム中で変更されない値を定数として定義する仕組みです。設定値やバージョン番号など、固定値の管理に使用します。
構文
// 実行時に定数を定義する define(定数名, 値); // 定数が定義済みかどうかを確認する defined(定数名); // コンパイル時に定数を定義する const 定数名 = 値; // 定義済みのすべての定数を取得する get_defined_constants($categorize);
構文・関数一覧
| 構文・関数 | 概要 |
|---|---|
| define($name, $value) | 実行時に定数を定義します。条件分岐の中でも使用でき、変数で定数名を指定することも可能です。 |
| defined($name) | 指定した名前の定数が定義済みかどうかを判定します。定義済みなら『true』、未定義なら『false』を返します。 |
| const | コンパイル時に定数を定義するキーワードです。トップレベルまたはクラス内で使用できますが、条件分岐や関数の中では使用できません。 |
| get_defined_constants($categorize) | 定義済みのすべての定数を配列で返します。引数に『true』を渡すとカテゴリ別に分類されます。 |
PHPの組み込み定数
| 定数 | 概要 |
|---|---|
| PHP_VERSION | 実行中のPHPバージョンを文字列で返します。 |
| PHP_INT_MAX | 整数の最大値です。64ビットシステムでは『9223372036854775807』になります。 |
| PHP_EOL | OS固有の改行文字です。Linuxでは『\n』、Windowsでは『\r\n』になります。 |
| PHP_OS | PHPが実行されているOS名です。 |
| DIRECTORY_SEPARATOR | ディレクトリの区切り文字です。Linuxでは『/』、Windowsでは『\』になります。 |
| __FILE__ | 現在のファイルのフルパスです。マジック定数の1つです。 |
| __DIR__ | 現在のファイルのディレクトリパスです。 |
| __LINE__ | 現在の行番号です。 |
サンプルコード
define.php
<?php
// アプリケーション設定定数を定義する
define('APP_TIMEOUT_SECONDS', 40); // タイムアウト秒数
define('APP_MAX_RETRY', 3); // 最大リトライ回数
define('APP_VERSION_TEXT', 'バージョン 1.0.0'); // バージョン文字列
echo APP_TIMEOUT_SECONDS . "\n"; // 『40』と出力される
echo APP_VERSION_TEXT . "\n"; // バージョン文字列が出力される
// const でトップレベルに定数を定義する
const APP_NAME = 'MyApp';
const APP_DEBUG = true;
echo APP_NAME . "\n"; // 『MyApp』と出力される
// defined() で定数の存在を確認する
if (!defined('APP_ADMINS')) {
define('APP_ADMINS', 'user1、user2、user3');
}
echo APP_ADMINS . "\n"; // 管理者一覧が出力される
// define() は条件分岐の中でも使えるが、const は使えない
$is_maintenance = true;
if ($is_maintenance) {
define('APP_STATUS', 'メンテナンス中');
} else {
define('APP_STATUS', '稼働中');
}
echo APP_STATUS . "\n"; // 『メンテナンス中』と出力される
// PHP 7 以降、define() で配列を定数にできる
define('ALLOWED_ROLES', ['admin', 'editor', 'viewer', 'guest']);
echo ALLOWED_ROLES[0] . "\n"; // 『admin』と出力される
// クラス定数の定義
class ItemStatus {
public const ACTIVE = 'active';
public const INACTIVE = 'inactive';
public const ARCHIVED = 'archived';
public static function label(string $status): string {
return match ($status) {
self::ACTIVE => '有効',
self::INACTIVE => '無効',
self::ARCHIVED => 'アーカイブ済み',
default => '不明',
};
}
}
echo ItemStatus::ACTIVE . "\n"; // 『active』と出力される
echo ItemStatus::label('archived') . "\n"; // 『アーカイブ済み』と出力される
// マジック定数の使用例
echo "ファイル: " . __FILE__ . PHP_EOL;
echo "ディレクトリ: " . __DIR__ . PHP_EOL;
echo "行番号: " . __LINE__ . PHP_EOL;
echo "PHPバージョン: " . PHP_VERSION . PHP_EOL;
実行すると次のように出力されます。
php define.php 40 バージョン 1.0.0 MyApp user1、user2、user3 メンテナンス中 admin active アーカイブ済み ファイル: /path/to/define.php ディレクトリ: /path/to 行番号: 51 PHPバージョン: 8.3.0
constは条件分岐の中で使えない
『const』はコンパイル時に処理されるため、『if』文や『switch』の中に書けません。条件付きで定数を定義するには『define()』を使います。
<?php
$is_prod = true;
// if 文の中で const を使うとエラーになります
// if ($is_prod) {
// const BASE_URL = 'https://example.com'; // Fatal error
// }
次のように記述します。
<?php
$is_prod = true;
// 条件付きで定数を定義するには define() を使います
if ($is_prod) {
define('BASE_URL', 'https://example.com');
} else {
define('BASE_URL', 'http://localhost:8080');
}
echo BASE_URL; // 条件に応じた値が出力されます
定数に$は不要(変数と混同しやすい)
定数へのアクセスに『$』をつけると変数として扱われ、定数にはアクセスできません。定数名はドル記号なしで書きます。
<?php
define('APP_NAME', 'MyApp');
// $APP_NAME は変数であり、定数とは別物です
$APP_NAME = 'other_value';
echo APP_NAME; // 『MyApp』(定数)
echo $APP_NAME; // 『other_value』(変数)
定義済み定数を再定義しようとすると警告
同名の定数を2回『define()』しようとすると Notice が発生します。『defined()』でチェックしてから定義するのが安全です。
<?php
define('APP_ENV', 'production');
define('APP_ENV', 'development'); // Notice: Constant APP_ENV already defined
次のように記述します。
<?php
// defined() で確認してから定義します
if (!defined('APP_ENV')) {
define('APP_ENV', 'production');
}
echo APP_ENV;
実践パターン
環境別の設定定数(開発/本番切り替え)
実行環境に応じてDBやURLの設定定数を切り替える例です。
<?php
// 環境変数または設定ファイルから判定します
$env = getenv('APP_ENV') ?: 'development';
if ($env === 'production') {
define('DB_HOST', 'prod-db.example.com');
define('DB_NAME', 'app_prod');
define('DEBUG', false);
} else {
define('DB_HOST', 'localhost');
define('DB_NAME', 'app_dev');
define('DEBUG', true);
}
if (DEBUG) {
echo "開発環境: " . DB_HOST . "\n";
}
sample_env.php
php sample_env.php 開発環境: localhost
HTTPステータスコードの定数管理
HTTPステータスコードを定数で管理することでコードの可読性を上げる例です。
<?php
define('HTTP_OK', 200);
define('HTTP_NOT_FOUND', 404);
define('HTTP_INTERNAL_ERROR', 500);
define('HTTP_FORBIDDEN', 403);
function send_response(int $code, string $body): void {
http_response_code($code);
echo $body . "\n";
}
// ステータスコードを定数名で書くとコードの意図が伝わりやすくなる
send_response(HTTP_OK, '{"status":"ok"}');
send_response(HTTP_NOT_FOUND, '{"error":"not found"}');
sample_http.php
php sample_http.php
{"status":"ok"}
{"error":"not found"}
概要
『define()』と『const』はどちらも定数を定義しますが、使える場所に違いがあります。『const』はコンパイル時に評価されるため条件分岐の中では使えませんが、『define()』は実行時に評価されるためどこでも使えます。トップレベルで固定値を定義する場合は『const』、条件に応じて値を変えたい場合は『define()』を使い分けてください。
クラス内で定数を定義する場合は『const』キーワードを使用します。PHP 8.1 以降では『enum』を使うことで、関連する定数をより型安全にグループ化できます。
マジック定数は先頭と末尾にアンダースコア2つが付いた特殊な定数で、記述された場所によって値が変わります。デバッグ時のファイル名・行番号の取得や、ファイルの絶対パスの構築に活用できます。アクセス修飾子とクラス定数については『public / private / protected』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。