PHPでプログラミングを行う際、値を固定して保持するために「定数」を利用します。
PHPには定数を定義する方法として、constキーワードを使用する方法と、define関数を使用する方法の2種類が存在します。
一見するとどちらも同じ役割を果たしているように見えますが、実はその性質や動作するタイミング、記述できる場所に明確な違いがあります。
プログラムの可読性や保守性を高めるためには、これらの違いを正しく理解し、適切な場面で使い分けることが不可欠です。
本記事では、2026年現在のPHP開発において標準となっている知識をベースに、constとdefineの違いを詳しく解説します。
PHPにおける定数の基本概念
定数とは、プログラムの実行中にその値を変更することができない識別子のことです。
変数とは異なり、一度定義するとスクリプト内のどこからでも参照でき、意図しない値の書き換えを防ぐことができます。
定数は慣習として、すべて大文字のアルファベットとアンダースコアで命名されます。
これは、変数($記号で始まる)と視覚的に区別しやすくするためです。
PHPで定数を利用する主な目的は、システムの設定値やステータスコードなど、変更されるべきではないデータを安全に管理することにあります。
constキーワードによる定数定義
constは、PHPの言語構造として用意されているキーワードです。
主にクラス内での定数定義や、名前空間レベルでの定数定義に使用されます。
非常に簡潔に記述できるため、モダンなPHP開発では第一選択肢となります。
constの基本的な書き方
以下に、constを使用した定数定義の例を示します。
<?php
// グローバルなスコープでの定義
const APP_NAME = "MyTechnicalBlog";
// クラス内での定義
class DatabaseConfig {
public const HOST = "localhost";
protected const USER = "admin";
private const PASSWORD = "password123";
public function getHost() {
return self::HOST;
}
}
echo APP_NAME;
echo "\n";
echo DatabaseConfig::HOST;
?>
MyTechnicalBlog
localhost
constの特徴とメリット
constの最大の特徴は、コンパイル時に定数が定義されるという点です。
これにより、実行時のオーバーヘッドが少なく、パフォーマンス面でわずかに有利に働きます。
また、クラス内で使用する場合、PHP 7.1以降ではアクセス修飾子(public, protected, private)を付与できるようになりました。
これにより、オブジェクト指向プログラミングにおけるカプセル化をより厳密に守ることが可能になります。
define関数による定数定義
defineは、PHPに組み込まれている関数です。
関数の引数として定数名と値を渡すことで、定数を定義します。
constが登場する以前から存在する伝統的な手法ですが、現在でも特定の状況下では重要な役割を果たします。
defineの基本的な書き方
以下に、defineを使用した定数定義の例を示します。
<?php
// 基本的な定義
define("SITE_URL", "https://example.com");
// 第3引数はPHP 8.0以降、大文字小文字を区別しない設定(true)は非推奨・削除されました
define("VERSION", "2.0.1");
echo SITE_URL;
echo "\n";
echo VERSION;
?>
https://example.com
2.0.1
defineの特徴とメリット
defineの最大の特徴は、実行時に定数が定義されるという点です。
これにより、プログラムの実行結果や条件分岐、ループの中で動的に定数名を決定して定義することができます。
例えば、設定ファイルの内容を読み取ってループ内で複数の定数を一括定義するような処理は、defineでしか実現できません。
constとdefineの主要な違い(比較表)
両者の違いを理解するために、主要な項目を表形式でまとめました。
| 比較項目 | const | define |
|---|---|---|
| 定義タイミング | コンパイル時 | 実行時(Runtime) |
| 記述場所 | トップレベル、クラス内 | どこでも記述可能(if文内など) |
| クラス内定義 | 可能(アクセス修飾子も可) | 不可 |
| 動的な命名 | 不可 | 可能 |
| 計算式の使用 | 可能(静的な式のみ) | 可能(任意の式) |
| 大文字小文字の区別 | 常に区別する | 常に区別する(以前は指定可能だった) |
定義されるタイミングの違い
constはコンパイル時に処理されるため、スクリプトが実行される前に値が確定している必要があります。
これに対して、defineはスクリプトの実行フローの中で呼び出されたタイミングで定義されます。
この違いは、条件分岐の中で定数を定義できるかどうかに影響します。
<?php
// defineならif文の中で定義できる
if (true) {
define("DEBUG_MODE", true);
}
// constはif文の中では記述できない(構文エラーになる)
// if (true) {
// const ERROR_LOG = true;
// }
?>
スコープと記述場所の制約
constは、定義した名前空間やクラスに属する定数を作成するのに適しています。
一方、defineで定義された定数は常にグローバルスコープ(正確には定義された名前空間に関わらずグローバルなシンボルテーブル)に登録されます。
ただし、defineに名前空間付きの名前を渡すことで、疑似的に名前空間内の定数を作成することは可能です。
しかし、クラスの中で定数を持たせたい場合は、必ずconstを使用しなければなりません。
動的な命名の可否
定数名をプログラムの処理結果から作成したい場合、defineが必要になります。
<?php
for ($i = 1; $i <= 3; $i++) {
define("RANK_" . $i, $i * 100);
}
echo RANK_1; // 100
echo RANK_2; // 200
echo RANK_3; // 300
?>
このような動的な定義はconstでは構文エラーとなるため実現できません。
配列定数の扱い
以前のPHPではdefineで配列を扱うことができませんでしたが、PHP 7.0以降、どちらの方法でも配列を定数として定義できるようになりました。
<?php
// constでの配列
const APP_COLORS = ['red', 'blue', 'green'];
// defineでの配列
define('STATUS_CODES', [200, 404, 500]);
echo APP_COLORS[0]; // red
echo STATUS_CODES[1]; // 404
?>
現在の開発環境においては、配列の定義に関してはどちらを使っても大きな差はありません。
どちらを使うべきか?使い分けの基準
基本的には、モダンなPHP開発ではconstの使用が推奨されます。
コードが読みやすく、IDE(統合開発環境)による静的解析や補完の恩恵を受けやすいためです。
constを使用するべきシーン
クラスのプロパティとして定数を定義する場合。
名前空間内で定数を管理し、オートロードの対象にしたい場合。
定義する値が静的であり、実行時に変化しないことが明らかな場合。
コードの可読性を重視し、言語構造としてスッキリ見せたい場合。
defineを使用するべきシーン
アプリケーションの設定ファイル(config.phpなど)で、環境変数や他の関数の戻り値をもとに定数を決めたい場合。
定数の二重定義を防ぐために、defined()関数でチェックしてから定義したい場合。
if文や関数の内部、ループ処理の中で動的に定数を作成する必要がある場合。
古いライブラリやフレームワークとの互換性を維持しなければならない場合。
2026年現在のPHPにおける定数のベストプラクティス
近年のPHP(PHP 8.x系以降)では、型安全性と静的解析の重要性が増しています。
そのため、定数定義においても「どこで定義されているか」を明確にすることが求められます。
名前空間の活用
グローバルスコープに大量の定数をdefineでぶちまける手法は、現代では推奨されません。
名前の衝突を避けるために、namespaceを利用し、その中でconstを定義するのが一般的です。
<?php
namespace App\Config;
const TIMEOUT = 30;
const RETRY_LIMIT = 3;
?>
この定数を参照する際は、\App\Config\TIMEOUTのようにフルクオリファイド名(完全修飾名)でアクセスするか、use constを利用します。
クラス定数のアクセス制御
クラス定数はデフォルトでpublicですが、そのクラス内部でしか使わない値であれば積極的にprivate constを使用しましょう。
影響範囲を限定することで、リファクタリングが容易になり、外部からの予期せぬ依存を防ぐことができます。
また、PHP 8.3からはクラス定数に型を指定できる「Typed class constants」が導入されています。
<?php
class ApiClient {
// 型を指定した定数定義
public const string VERSION = "v1.2.0";
public const int MAX_REQUESTS = 100;
}
?>
型指定を行うことで、静的解析ツールがより正確にエラーを検知できるようになります。
注意点とよくあるエラー
定数を利用する上で、初心者が陥りやすいミスや技術的な注意点がいくつかあります。
定数の二重定義
定数は一度定義すると、同じスクリプト内で再定義することはできません。
constで同じ名前を定義しようとするとコンパイルエラーが発生します。
defineの場合は、実行時に「Notice: Constant ALREADY_EXISTS already defined」という警告が発生し、新しい値は無視されます。
これを防ぐには、defined()関数を使って存在確認を行うのが一般的です。
<?php
if (!defined('MY_SETTING')) {
define('MY_SETTING', 'default_value');
}
?>
マジック定数との混同
PHPには__LINE__や__FILE__、__DIR__といった「マジック定数」が存在します。
これらは定数のように見えますが、記述した場所によって動的に値が変わる特殊な存在です。
これらをconstやdefineで上書きすることはできませんので注意してください。
未定義定数の参照
定義されていない定数を参照しようとすると、PHP 8.0以降では Error 例外がスローされます。
以前のバージョンでは警告を出しつつ文字列として扱われてしまう挙動がありましたが、現在は厳格化されています。
スペルミスなどがないか、IDEの警告を確認しながら開発を進めることが重要です。
まとめ
PHPの定数定義におけるconstとdefineには、それぞれ明確な役割と特徴があります。
constは、コンパイル時に評価される言語構造であり、クラス内での使用やパフォーマンス、名前空間との相性に優れています。
対してdefineは、実行時に評価される関数であり、動的な定数名の決定や条件に応じた定義といった柔軟性が強みです。
現代のPHP開発においては、「原則としてconstを使用し、どうしても動的な定義が必要な場合に限りdefineを採用する」という方針がベストです。
また、クラス定数における型指定などの最新機能を活用することで、より堅牢でメンテナンス性の高いコードを書くことができます。
これらの違いを正しく使い分け、より安全で効率的なPHPプログラミングを目指しましょう。
