PHPのdefine関数は、プログラム内で使用する定数を定義するための組み込み関数です。変数と異なり、一度定義した値は後から変更できないため、設定値や固定的な値を管理する際に使用します。
しかし、define関数の正しい書き方や大文字小文字の区別、配列定数の扱い方などを理解していないと、意図しない動作やエラーが発生する可能性があります。特にconstとの違いを把握していないと、適切な場面で使い分けることができません。
この記事では、PHPのdefine関数で定数を定義する方法、配列定数の定義、constとの違い、などサンプルコードを交えて詳しく解説していきます。
PHPのdefine関数で定数を定義する方法
PHPのdefine関数を使用することで、プログラム内で使用する定数を定義できます。定数とは、一度値を設定すると、後から変更できない固定的な値のことです。設定ファイルのパスや税率など、プログラム全体で共通して使用する値を管理する際に活用します。
ここでは、define関数を使った定数の定義方法を3つ紹介します。
- 基本的な定数を定義する
- 大文字小文字を区別する定数を定義する
- 大文字小文字を区別しない定数を定義する
それぞれの定義方法には、名前の扱いや第3引数の設定に違いがあり、用途に応じて使い分ける必要があります。基本的には、大文字小文字を区別する方法が推奨されています。区別しない方法はPHP 7.3以降では非推奨となっているため、新規開発では使用を避けるべきでしょう。
それでは各項目について、詳しく解説していきます。
基本的な定数を定義する
PHPのdefine関数は、第1引数に定数名、第2引数に値を指定することで定数を定義できます。定数名は慣例として大文字で記述し、複数の単語を組み合わせる場合はアンダースコアで区切ります。
基本的な書き方は、以下の通りです。
<?php
// 定数を定義する
define('SITE_NAME', 'サンプルサイト');
define('MAX_LOGIN_ATTEMPTS', 5);
define('TAX_RATE', 0.1);
// 定数を使用する
echo SITE_NAME; // 出力: サンプルサイト
echo MAX_LOGIN_ATTEMPTS; // 出力: 5
echo TAX_RATE; // 出力: 0.1
?>
上記のコードでは、文字列、整数、小数の3種類の定数を定義しています。定数を使用する際は、定義した定数名をそのまま記述するだけで値を取得でき、変数のように$記号を付ける必要はありません。
大文字小文字を区別する定数を定義する
PHPのdefine関数で定義した定数は、デフォルトで大文字小文字を区別します。つまり、「SITE_NAME」と「site_name」は別の定数として扱われるため、定義した名前と完全に一致する形で使用する必要があります。
サンプルコードは、以下の通りです。
<?php
// 大文字で定数を定義する
define('API_KEY', 'abc123xyz');
// 正しい使用方法
echo API_KEY; // 出力: abc123xyz
// 誤った使用方法(エラーになる)
echo api_key; // Warning: Use of undefined constant api_key
echo Api_Key; // Warning: Use of undefined constant Api_Key
?>
上記のコードでは、API_KEYという定数を定義していますが、api_keyやApi_Keyのように大文字小文字が異なる名前で呼び出すと、未定義の定数として警告が発生します。定数を使用する際は、定義した名前と完全に一致させることが重要です。
【PR】プログラミングや生成AIを無料で学べる「コードキャンプフリー」
大文字小文字を区別しない定数を定義する
PHPのdefine関数は、第3引数にtrueを指定することで、大文字小文字を区別しない定数を定義できます。ただし、この機能はPHP 7.3以降で非推奨となり、PHP 8.0で完全に削除されているため、新規開発では使用を避けるべきでしょう。
サンプルコードは、以下の通りです。
<?php
// 大文字小文字を区別しない定数を定義する(PHP 7.2以前)
define('DB_HOST', 'localhost', true);
// 様々な形式で使用できる(PHP 7.2以前のみ)
echo DB_HOST; // 出力: localhost
echo db_host; // 出力: localhost
echo Db_Host; // 出力: localhost
?>
上記のコードは、PHP 7.2以前のバージョンでのみ動作します。第3引数にtrueを指定することで、DB_HOST、db_host、Db_Hostのいずれの形式でも同じ値を取得できますが、現在のPHPバージョンではこの機能は使用できません。
PHPのdefine関数で配列定数を定義する方法
PHPのdefine関数は、PHP 7.0以降から配列を定数として定義できるようになりました。配列定数を使用することで、複数の関連する値をまとめて管理でき、設定情報やステータスコードなどを扱う際に便利です。ここでは、配列定数を定義する方法を3つ紹介します。
- 1次元配列の定数を定義する
- 連想配列の定数を定義する
- 多次元配列の定数を定義する
それぞれの定義方法には、配列の構造や値の取り出し方に違いがあり、用途に応じて使い分ける必要があります。配列定数も通常の定数と同様に、一度定義した後は値を変更できないため、固定的な設定値として管理する際に適しています。
それでは各項目について、詳しく解説していきます。
1次元配列の定数を定義する
PHPのdefine関数は、第2引数に配列を指定することで、1次元配列の定数を定義できます。配列の各要素には、インデックス番号を使用してアクセスでき、複数の関連する値をまとめて管理する際に便利です。
サンプルコードは、以下の通りです。
<?php
// 1次元配列の定数を定義する
define('COLORS', ['red', 'green', 'blue']);
define('STATUS_CODES', [200, 404, 500]);
// 配列要素にアクセスする
echo COLORS[0]; // 出力: red
echo COLORS[1]; // 出力: green
echo STATUS_CODES[2]; // 出力: 500
?>
上記のコードでは、文字列の配列と数値の配列をそれぞれ定数として定義しています。配列の要素にアクセスする際は、定数名に続けて、角括弧[]内にインデックス番号を指定することで、目的の値を取得できます。
連想配列の定数を定義する
PHPのdefine関数は、キーと値のペアを持つ連想配列も定数として定義できます。連想配列を使用することで、意味のあるキー名で値を管理でき、設定情報やステータスメッセージなどを扱う際に可読性が向上します。
サンプルコードは、以下の通りです。
<?php
// 連想配列の定数を定義する
define('DATABASE', [
'host' => 'localhost',
'user' => 'root',
'password' => 'secret',
'database' => 'myapp'
]);
define('STATUS_MESSAGES', [
200 => 'Success',
404 => 'Not Found',
500 => 'Internal Server Error'
]);
// 連想配列の要素にアクセスする
echo DATABASE['host']; // 出力: localhost
echo STATUS_MESSAGES[404]; // 出力: Not Found
?>
上記のコードでは、「データベース接続情報」と「ステータスメッセージ」を連想配列の定数として定義しています。キー名を指定することで、インデックス番号を覚える必要がなく、直感的に値を取得できるため、コードの保守性が向上します。
【PR】『Python』を学べる企業・個人向けのプログラミングコース
多次元配列の定数を定義する
PHPのdefine関数は、配列の中に配列を含む多次元配列も定数として定義できます。複雑なデータ構造を定数として管理する必要がある場合に使用でき、階層的な設定情報やカテゴリ分けされたデータを扱う際に便利です。
サンプルコードは、以下の通りです。
<?php
// 多次元配列の定数を定義する
define('CATEGORIES', [
'electronics' => [
'smartphone',
'laptop',
'tablet'
],
'books' => [
'novel',
'manga',
'textbook'
]
]);
define('USERS', [
['id' => 1, 'name' => '太郎', 'role' => 'admin'],
['id' => 2, 'name' => '花子', 'role' => 'user']
]);
// 多次元配列の要素にアクセスする
echo CATEGORIES['electronics'][0]; // 出力: smartphone
echo USERS[1]['name']; // 出力: 花子
?>
上記のコードでは、カテゴリ別の商品リストとユーザー情報を多次元配列の定数として定義しています。最初の角括弧で外側の配列にアクセスし、次の角括弧で内側の配列にアクセスすることで、目的の値を取得できます。
PHPのdefineとconstの違い
PHPには、定数を定義する方法として、define関数とconst構文の2つが存在します。両者とも定数を定義する機能を持ちますが、定義できる場所や動作に違いがあるため、用途に応じて使い分ける必要があります。ここでは、defineとconstの主な違いを3つ紹介します。
- 定義できる場所の違い
- 動的な値の定義可否
- 名前空間への対応
それぞれの違いを理解することで、適切な場面で正しい方法を選択でき、コードの品質や保守性が向上します。基本的には、クラス内で定数を定義する場合や名前空間を使用する場合はconst、グローバルスコープで動的に定数を定義する場合はdefineを使用するとよいでしょう。
それでは各項目について、詳しく解説していきます。
定義できる場所の違い
PHPのdefine関数は、プログラムのどの場所でも定数を定義できますが、const構文は「トップレベル(グローバルスコープ)」または「クラス内」でのみ定義できます。つまり、if文やfor文などの条件分岐やループの中だと、defineは使用できますが、constは使用できません。
以下の表は、それぞれの定義可能な場所をまとめたものです。
| 定義方法 | グローバルスコープ | クラス内 | 関数内 | 条件分岐内 |
|---|---|---|---|---|
| define | ○ | ○ | ○ | ○ |
| const | ○ | ○ | × | × |
「条件によって異なる値を定数として定義したい場合」や「関数内で定数を定義したい場合」は、define関数を使用する必要があります。一方、クラス内で定数を定義する場合は、constを使用する方が記述がシンプルになります。
動的な値の定義可否
PHPのdefine関数は、変数や関数の戻り値など、実行時に決まる動的な値を定数として定義できます。一方、const構文は文字列や数値など静的な値のみを定義でき、変数や関数の戻り値を直接指定できません。
サンプルコードは、以下の通りです。
<?php
// 動的な値をdefineで定義する(OK)
$prefix = 'APP_';
define($prefix . 'VERSION', '1.0.0');
define('CURRENT_TIME', time());
// 動的な値をconstで定義する(エラー)
const APP_NAME = $prefix . 'MyApp'; // Fatal error
const START_TIME = time(); // Fatal error
// 静的な値をconstで定義する(OK)
const MAX_SIZE = 1024;
const APP_TITLE = 'My Application';
?>
上記のコードだと、define関数では変数を使った「定数名の生成」や「関数の戻り値」を定数として定義できますが、constでは変数や関数を使用するとエラーが発生します。実行時に値が決まる定数を定義する必要がある場合は、define関数を使用する必要があります。
名前空間への対応
PHPのconst構文は名前空間内で定義することにより、自動的にその名前空間に属する定数として扱われます。一方、define関数は第1引数に名前空間を含めた完全修飾名を指定する必要があり、記述が煩雑になります。
サンプルコードは、以下の通りです。
<?php
namespace MyApp\Config;
// constで名前空間内の定数を定義する(推奨)
const DATABASE_HOST = 'localhost';
const DATABASE_PORT = 3306;
// constで定義した定数を使用する
echo DATABASE_HOST; // 出力: localhost
// defineで名前空間内の定数を定義する(非推奨)
define('MyApp\Config\API_KEY', 'abc123xyz');
// defineで定義した定数を使用する
echo \MyApp\Config\API_KEY; // 出力: abc123xyz
?>
constを使用した場合は自動的に名前空間が適用されますが、defineを使用した場合は完全修飾名を指定する必要があります。名前空間を使用するプロジェクトでは、constを使用する方がコードの可読性が向上します。
コピペで定数を実装するサンプルコード
全てのセクションで解説した内容をまとめ、コピペで定数を実装できるようにしました。PHPで定数を使った設定管理を試してみたい方は、以下のサンプルコードをご活用ください。
実際のプロジェクトに合わせて使いたい場合は、以下の箇所を変更してください。
- 定数名: SITE_NAME、API_KEY、DATABASEなどを実際の定数名に変更
- 定数値: 各定数の値を実際の設定値に変更
- 配列の構造: 配列定数の内容を実際のデータ構造に変更
<?php
// 基本的な定数を定義する
define('SITE_NAME', 'サンプルサイト');
define('MAX_LOGIN_ATTEMPTS', 5);
define('TAX_RATE', 0.1);
// 配列定数を定義する
define('COLORS', ['red', 'green', 'blue']);
define('DATABASE', [
'host' => 'localhost',
'user' => 'root',
'password' => 'secret',
'database' => 'myapp'
]);
define('CATEGORIES', [
'electronics' => [
'smartphone',
'laptop',
'tablet'
],
'books' => [
'novel',
'manga',
'textbook'
]
]);
// 定数を使用する
echo SITE_NAME; // 出力: サンプルサイト
echo MAX_LOGIN_ATTEMPTS; // 出力: 5
echo COLORS[0]; // 出力: red
echo DATABASE['host']; // 出力: localhost
echo CATEGORIES['electronics'][0]; // 出力: smartphone
?>
※上記コンテンツの内容やソースコードはAIで確認・デバッグしておりますが、間違いやエラー、脆弱性などがある場合は、コメントよりご報告いただけますと幸いです。
ITやプログラミングに関するコラム
Illustrator(イラストレーター)で様々な図形の作り方を解説
CSSのstickyプロパティでWebサイトに固定要素を実装する方法
Dockerfileの基本的な使い方とビルド方法を簡単に解説
PHPのコメントの書き方とDocCommentの使い方を簡単に解説
【初心者向け】データベースの基本的な作り方を簡単に解説
【PHP】PDOでMySQLに接続する方法を簡単に解説
【WordPress】絞り込み検索機能を自作する方法をサンプルコードと併せて解説
【PHP】コードの動作確認をローカル・オンラインで行う方法
MacでWordPressのローカル環境を構築する方法を解説
ITやプログラミングに関するニュース
株式会社オロパスが共催ウェビナー登壇、マーケとIS連携による商談化率向上を解説
ストライクなど5社が共催セミナーを開催、持株会社化の理想と現実を解説
辻・本郷 税理士法人が事業承継ウェビナーを開催、士業・金融機関向けに専門知識を解説
Straker JapanとイグアスがIRセミナーを開催、AI活用で海外投資家との対話を促進
株式会社ニーズウェルが無料ウェビナー開催、請求書処理のDX化で業務負担を削減
株式会社シンミドウがAI活用HP解析ウェビナーを開催、HP改善と営業効率化の具体的手法を解説
N.Avenueが暗号資産トレジャリー解説ウェビナー開催、上場企業のDAT戦略を解説
株式会社SoVaが実践セミナーそば塾を開催、資金調達や組織づくりを解説
パナソニック インフォメーションシステムズが共催ウェビナー開催、AI翻訳Wordlyの活用法を解説
株式会社ビザスクが製造業向けウェビナーを開催、京セラ出身者がプロダクトアウトの実践知を解説




