【PHP】define関数による定数の使い方や定義方法を解説

【PHP】define関数による定数の使い方や定義方法を解説

公開: 更新:
CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座

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やプログラミングに関するコラム


ITやプログラミングに関するニュース

ブログに戻る

コメントを残す

コメントは公開前に承認される必要があることにご注意ください。

CodeCampが提供するDX人材育成が可能なプログラミングやITが学べる公開講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプが提供する無料で学べるプログラミングスクール講座 - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア 配属3ヶ月で30%の生産性向上を実現するいよぎんコンピュータサービスの新人研修に迫る - IT・プログラミングを知って学べるコネクトメディア 金融業界の業務効率化を加速するニッセイアセットマネジメントの生成AI×GAS活用研修事例 - IT・プログラミングを知って学べるコネクトメディア 【製造業のDX人材育成事例】デジタル人材の即戦力化を実現する、日本ガイシ株式会社の異動者向オンボーディング研修 - ITやプログラミングを知って学べるコネクトメディア フューチャーアーキテクト株式会社が実現した新入社員向けIT研修プログラムでタスクフォース制度が主体的な学びと成長を生み出す - IT・プログラミングを知って学べるコネクトメディア コードキャンプDX人材育成研修 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【IT新入社員研修】オンラインとオフラインの最適バランスを実現したFutureOneの導入事例 - IT・プログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/【新入社員研修】柔軟なハイブリッド型Java研修で実現した新卒20名の成長と成果|サークレイス株式会社 - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/現場により近いところにデジタルを根付かせるDX基礎講座研修|株式会社ブリヂストン - ITやプログラミングを知って学べるコネクトメディア コードキャンプIT・プログラミング研修事例/業務の効率化・DX推進に向けたIT人材育成への第一歩|株式会社カナエ - ITやプログラミングを知って学べるコネクトメディア 企業・法人向けのIT・プログラミング研修 - ITやプログラミングを知って学べるコネクトメディア

新着記事

対象者別で探す

子供(小学生・中学生・高校生)向け
プログラミング教室検索する

子供(小学生・中学生・高校生)がロボットやプログラミング言語を学ぶことができるオフラインからオンラインスクールを検索、比較することが可能です。

子供(小学生・中学生・高校生)
プログラミング教室検索する

ITやプログラムなどの
最新情報を検索する

日々、新しいITやプログラミング言語の情報が流れていきますが、特定の情報を時系列でニュースやコラムを確認することができます。

ITやプログラムなどの
最新情報を検索する