PHPで定数を定義する方法!defineとconstの違いと使い分けを徹底比較
生徒
「プログラムの中で、途中で値が変わってほしくないデータがあるのですが、どうすればいいですか?」
先生
「それには『定数』という仕組みを使います。一度決めたら後から変更できない箱のようなものです。」
生徒
「定数を作るには、defineとconstという二つの書き方があると聞いたのですが、何が違うんですか?」
先生
「鋭いですね。実は使いどころに明確な違いがあるんです。初心者の方でも迷わないように、基本からじっくり解説していきましょう!」
1. 定数とは?初心者向けに基礎を解説
プログラミングの世界には、値を保存しておくための「変数」と「定数」という二つの概念があります。パソコンの操作に慣れていない方でも、身近な例で考えると分かりやすくなります。
変数は「中身を入れ替えられる魔法の箱」です。例えば、今日の気温や、ゲームのスコアのように、時間が経つと数値が変わるものを入れます。一方で定数は「中身を固定した、鍵付きの箱」のようなものです。一度中身を決めて鍵をかけたら、プログラムの実行中に二度と中身を書き換えることができません。
なぜこのような「書き換えられない箱」が必要なのでしょうか。それは、プログラムのミスを防ぐためです。例えば「消費税率」や「円周率」のように、プログラムの途中で勝手に数値が変わってしまうと困るものに定数を使います。定数を使うことで、自分や他のプログラマが間違えて値を上書きしようとしたときに、エラーを出して教えてくれるため、安全にシステムを動かすことができるのです。
2. define関数を使った定数の書き方
PHPで古くから使われている定数の定義方法が define() 関数です。これは関数という命令を使って「この名前で、この値を保存してね」とコンピュータにお願いする形式です。define という言葉には「定義する」という意味があります。
定数の名前(名前のことを識別子と呼びます)を決めるときは、一般的な変数と区別がつくように、すべて大文字で書くのがプログラミングの世界でのマナーとなっています。また、名前の先頭に $ マークをつけないのも定数の大きな特徴です。
まずは、最もシンプルな define の使い方を見てみましょう。
define("TAX_RATE", 0.1);
echo TAX_RATE;
実行結果は以下のようになります。
0.1
このコードでは、「TAX_RATE」という名前の箱に「0.1」という値を固定しました。一度定義すると、プログラムのどこからでもこの値を呼び出すことができます。ただし、後から define("TAX_RATE", 0.08); と書き直そうとしても、エラーになるか無視されるため、値は守られます。
3. constキーワードを使った定数の書き方
PHP 5.3というバージョンから登場した比較的新しい書き方が const です。const は「Constant(一定の、不変の)」の略称です。define が命令(関数)だったのに対し、const はPHPの言語そのものが持っている構文(キーワード)です。
書き方は非常にシンプルで、数学の方程式のように const 名前 = 値; と記述します。define よりも見た目がすっきりしていて読みやすいため、最近のプログラミング現場では好んで使われる傾向にあります。ただし、後述する通り define とは動きに細かな違いがあるため、注意が必要です。
const SITE_TITLE = "はじめてのPHP学習サイト";
echo SITE_TITLE;
実行結果はこちらです。
はじめてのPHP学習サイト
このように、文字列(文章)も定数として保存することができます。サイトの名前などは、途中で変わることがないため、定数にしておくと便利です。HTMLの中で何度も使い回す情報を一箇所で管理するのにも役立ちます。
4. defineとconstの違いを徹底比較
さて、ここからが本題です。どちらも同じ「定数」を作るための道具ですが、どのような違いがあるのでしょうか。大きく分けて3つのポイントを解説します。
一つ目は、定義できる場所の違いです。const はプログラムの「一番外側」や「クラス」という設計図の中でしか使えません。一方で define は、条件分岐(if文)の中や、独自の命令(関数)の中など、どこでも定義することが可能です。これを「動的な定義ができる」と表現します。
二つ目は、定義されるタイミングです。const はプログラムが動き出す前の「準備段階」で中身が決まります。これをコンパイル時と言います。反対に define はプログラムが実際に動いている「最中」に中身が決まります。これを実行時と言います。例えば、その日の時間によって値を変えたい定数などは define でしか作れません。
三つ目は、設定できる値です。古いPHPのバージョンでは const に計算式や配列を入れられませんでしたが、現在のPHP 8以降ではどちらもかなり柔軟に扱えるようになっています。しかし、基本的には const はシンプルで高速、define は多機能で柔軟というイメージを持っておけば間違いありません。
| 特徴 | define | const |
|---|---|---|
| 使う場所 | どこでも可能 | トップレベルやクラス内 |
| 決まる時期 | プログラム実行中 | 実行前の準備中 |
| 速度 | 普通 | わずかに速い |
5. 条件分岐の中で定数を使ってみよう
実際の開発現場では、ある条件のときだけ特定の定数を決めたい、という場面があります。その場合は、どこでも使える define の出番です。例えば、サイトの「テストモード」がオンのときだけ、特別なメッセージを表示するための定数を作ってみましょう。
ここでは if 文という、条件によって処理を分ける仕組みを一緒に使います。パソコンを触り始めたばかりの方でも、英語の「もしも(if)」という意味で捉えれば簡単です。
$testMode = true; // テスト中かどうか
if ($testMode === true) {
define("APP_STATUS", "デバッグ中");
} else {
define("APP_STATUS", "通常稼働");
}
echo APP_STATUS;
実行結果は以下のようになります。
デバッグ中
このコードでは $testMode という変数の値を見て、もし true (正しい)であれば「APP_STATUS」に「デバッグ中」という文字を入れ、そうでなければ「通常稼働」を入れるように命令しています。このように柔軟な設定ができるのが define の強みです。もしこれを const で書こうとすると、エラーが発生してしまいます。
6. 配列を定数にする便利な使い方
PHP 7以降では、複数のデータをひとまとめにした「配列」も定数として扱うことができるようになりました。配列とは、出席番号順に名前が並んでいる名簿のような、データのリストのことです。これを定数にすることで、リストの内容が勝手に書き換わるのを防ぐことができます。
例えば、一週間の曜日の名前を定数にしてみましょう。曜日は途中で増えたり減ったりすることはありませんよね。こうしたデータは定数にするのが最適です。ここでは const を使った書き方を紹介します。
const WEEK_DAYS = ["日", "月", "火", "水", "木", "金", "土"];
echo WEEK_DAYS[1] . "曜日"; // 1番目(月曜日)を表示
実行結果は次のようになります。
月曜日
プログラミングの世界では、数は 0 から数え始めるルールがあるため、[1] を指定すると「月」が表示されます。このように const を使うと、コードが非常に読みやすく整理されます。大規模なWEBサイトを作る際には、設定情報をこのように配列の定数で管理することが非常に多いです。
7. 定数を使うときの注意点とエラーの防ぎ方
最後に、定数を使う際に初心者がつまずきやすいポイントを整理しておきましょう。これを知っておくだけで、プログラミング学習の効率がぐっと上がります。
まず一つ目は、一度定義した定数は絶対に上書きできないということです。もし無理やり define で同じ名前を二回定義しようとすると、PHPは「Notice: Constant TAX_RATE already defined」という警告を出します。「もうその名前は使われていますよ!」という注意です。値が勝手に変わらないのが定数の魅力ですが、定義する名前が他の場所と被らないように気をつける必要があります。
二つ目は、定数の呼び出し方です。変数は echo $name; のように $ をつけますが、定数は echo NAME; のように名前だけを書きます。もし $NAME と書いてしまうと、PHPは「NAMEという名前の変数」を探しに行ってしまい、値が見つからずエラーになるか、空の結果になってしまいます。
三つ目は、定義されていない定数を使わないことです。存在しない定数を呼び出そうとすると、最新のPHPでは致命的なエラーとなり、プログラムが止まってしまいます。定数を使う前には、必ず define や const で定義されているかを確認する癖をつけましょう。自分一人でコードを書くときはもちろん、チームで開発するときは、共通のファイルに定数をまとめて書いておくと管理が楽になります。
まとめ
今回の記事では、PHPプログラミングにおける非常に重要な要素である「定数」について、その基礎知識から具体的な定義方法、そして状況に応じた使い分けまでを詳しく解説してきました。定数は、一度定義するとプログラムの実行中にその値を変更することができない「鍵付きの保存箱」のような存在です。消費税率やシステムの設定値、サイト名など、途中で書き換わると困るデータを安全に管理するために欠かせない仕組みであることを学んでいただけたかと思います。
定数の定義方法のおさらい
PHPで定数を作成するには、主に2つの方法があります。一つは古くから利用されている define() 関数を使う方法、もう一つは const キーワードを使う方法です。どちらも定数を作成するという目的は同じですが、その性質には明確な違いがあります。
define() は関数であるため、プログラムの実行時に評価されます。そのため、if文などの条件分岐の中で「もし~なら、この定数を作る」といった動的な定義が可能です。一方、 const は言語構造(キーワード)であり、プログラムが実行される前のコンパイル段階で値が決まります。記述がシンプルで読みやすいため、クラス内での定数定義や、グローバルな固定値の定義には const が推奨されることが多いです。
開発現場での使い分けのポイント
実際のWeb開発の現場では、どのように使い分けるのが正解でしょうか。基本的には、モダンなPHPの開発スタイルにおいては const を優先的に使用し、どうしても条件分岐が必要な場合や、古いバージョンのPHPとの互換性を保つ必要がある場合に define() を選択するというのが一般的な指針です。特に大規模なアプリケーション開発においては、クラス定数として const を利用することで、コードの可読性とメンテナンス性が飛躍的に向上します。
また、PHP 7以降では配列を定数に含めることができるようになり、設定情報の管理がより柔軟になりました。曜日データや都道府県リスト、エラーメッセージの集まりなどを定数配列として定義しておくことで、プログラム全体で一貫したデータを利用できるようになります。
復習用サンプルプログラム
ここまでの内容を統合した、実践的なサンプルコードを確認してみましょう。条件によって定数の値を変える define() の活用例と、リスト管理に便利な const による配列定数の例を組み合わせています。
// 環境設定(trueなら本番、falseなら開発)
$isProduction = false;
if ($isProduction) {
// 本番環境用の定数定義
define("DATABASE_NAME", "prod_db");
define("DEBUG_MODE", false);
} else {
// 開発環境用の定数定義
define("DATABASE_NAME", "dev_db");
define("DEBUG_MODE", true);
}
// ユーザー権限のリストを配列定数で定義
const USER_ROLES = ["管理者", "編集者", "一般ユーザー"];
echo "現在のデータベース: " . DATABASE_NAME . "\n";
if (DEBUG_MODE) {
echo "デバッグモードは有効です。\n";
}
echo "デフォルト権限: " . USER_ROLES[2];
実行結果は以下のようになります。
現在のデータベース: dev_db
デバッグモードは有効です。
デフォルト権限: 一般ユーザー
注意すべきエラーと対策
定数を利用する際、最も注意すべきは「二重定義」と「未定義の参照」です。一度定義した名前を再度定義しようとするとエラーが発生します。これを防ぐためには defined() 関数を使って、すでにその定数が存在するかを確認するテクニックも有効です。また、定数には $ マークをつけないというルールを徹底しましょう。
プログラミング初学者の方は、まずは const で単純な数値を定義することから始め、徐々に define() を使った複雑な制御に挑戦していくのが上達の近道です。定数を正しく使いこなすことで、バグの少ない、堅牢で美しいプログラムを書くことができるようになります。
生徒
「先生、まとめまで読んで定数の使い分けがかなりスッキリ分かりました!基本は const を使って、if文の中とかで動的に作りたいときだけ define を選べばいいんですね。」
先生
「その通りです!素晴らしい理解力ですね。特に最近のPHPでは const の方が推奨される場面が多いですが、 define の柔軟性も捨てがたいものがあります。状況に応じて最適な道具を選べるようになるのが、プロのエンジニアへの第一歩ですよ。」
生徒
「配列も定数にできるのは便利だと思いました。設定ファイルとかでよく見かける書き方ですよね。でも、定数名に $ をつけないのは、つい変数と混同してしまいそうです。」
先生
「慣れるまではよくあるミスですね。だからこそ、定数名はすべて大文字で書くという慣習があるんです。 $tax_rate は変数、 TAX_RATE は定数、と見た瞬間に判断できるように工夫されているんですよ。」
生徒
「なるほど、見た目で区別できるようにするのも大事なテクニックなんですね。これからコードを書くときは、大文字の定数を意識して使ってみます!」
先生
「ぜひそうしてください。定数を使いこなせれば、コードの安全性も読みやすさも格段にアップします。この調子で、次はさらに高度なPHPの機能にも挑戦していきましょうね!」