PHPで変数をつかい慣れてくると、次に知りたくなるのが「定数」のつかい方です。
定数をつかえば、値の変更を防ぎ、コードの安定性が向上します。
しかし、define()
とconst
のちがいなど、初学者にとっては少しややこしい部分も。
この記事では、PHPの定数の基本から実践的なつかい方、よくあるミスまでを丁寧に説明します。
定数ってなに?

説明
定数(constant)は、一度値を設定すると変更できない識別子です。
変数は$
マークがついて値を変更できますが、定数は値が固定されています。
変数と定数のちがい
項目 | 変数 | 定数 |
---|---|---|
記号 | $variable | CONSTANT |
値の変更 | ✅ できる | ❌ できない |
スコープ | 関数内など限定的 | グローバル(どこでもつかえる) |
用途 | 変わる値 | 変わらない値 |
かんたんな例
<?php
// 変数(値を変更できる)
$name = "田中";
$name = "佐藤"; // 変更可能
echo $name; // 佐藤
// 定数(値を変更できない)
define("SITE_NAME", "私のサイト");
// SITE_NAME = "別のサイト"; // エラー!変更できない
echo SITE_NAME; // 私のサイト
?>
定数をつかう理由
安全性
- 間違って値を変更してしまうことを防ぐ
- バグの原因を減らす
可読性
- 意味のある名前で値を管理
- コードが読みやすくなる
保守性
- 設定値を一箇所で管理
- 変更時の影響範囲を限定
PHPの定数定義方法
方法1:define() 関数
基本的な書き方
<?php
define("定数名", "値");
?>
実際の例
<?php
// 基本的な定数定義
define("SITE_NAME", "私のウェブサイト");
define("VERSION", "1.0.0");
define("DEBUG_MODE", true);
define("MAX_USERS", 100);
// 定数をつかう
echo SITE_NAME; // 私のウェブサイト
echo VERSION; // 1.0.0
echo MAX_USERS; // 100
if (DEBUG_MODE) {
echo "デバッグモードです";
}
?>
方法2:const キーワード
基本的な書き方
<?php
const 定数名 = "値";
?>
実際の例
<?php
// constをつかった定数定義
const COMPANY_NAME = "株式会社サンプル";
const TAX_RATE = 0.1;
const ADMIN_EMAIL = "admin@example.com";
// 定数をつかう
echo COMPANY_NAME; // 株式会社サンプル
echo TAX_RATE; // 0.1
echo ADMIN_EMAIL; // admin@example.com
?>
define() と const のちがい
詳細比較表
項目 | define() | const |
---|---|---|
つかえる場所 | どこでも | クラス外・関数外のみ |
定義のタイミング | 実行時 | コンパイル時 |
条件分岐内での定義 | ✅ できる | ❌ できない |
変数をつかった定数名 | ✅ できる | ❌ できない |
名前空間 | つかえない | つかえる |
パフォーマンス | やや遅い | 速い |
条件分岐での定義例
<?php
// define():条件分岐内でつかえる
if ($environment === 'development') {
define("DEBUG", true);
} else {
define("DEBUG", false);
}
// const:条件分岐内でつかえない(エラーになる)
/*
if ($environment === 'development') {
const DEBUG = true; // エラー!
}
*/
?>
変数をつかった定数名
<?php
// define():変数をつかった定数名が可能
$prefix = "APP_";
$setting = "VERSION";
define($prefix . $setting, "2.0"); // APP_VERSION という定数ができる
echo APP_VERSION; // 2.0
// const:変数をつかった定数名は不可
// const $prefix . $setting = "2.0"; // エラー!
?>
どちらをつかうべき?
define() がおすすめの場面
- 条件によって値を変えたい
- 実行時に定数名を決めたい
- PHP 5.3より古いバージョンをつかう
const がおすすめの場面
- シンプルで固定的な値
- パフォーマンスを重視
- 名前空間をつかう
- 一般的な設定値
クラス定数

説明
クラスの中でも定数を定義できます。クラス定数は、そのクラスに関連する固定値を定義するときにつかいます。
基本的なつかい方
<?php
class UserStatus {
const ACTIVE = 1;
const INACTIVE = 0;
const PENDING = 2;
const BANNED = -1;
}
// クラス定数をつかう
echo UserStatus::ACTIVE; // 1
echo UserStatus::INACTIVE; // 0
// 条件分岐でつかう
$user_status = 1;
if ($user_status === UserStatus::ACTIVE) {
echo "ユーザーはアクティブです";
}
?>
より実用的な例
<?php
class Config {
const DB_HOST = "localhost";
const DB_NAME = "myapp";
const DB_USER = "root";
const CACHE_TIME = 3600; // 1時間(秒)
const MAX_FILE_SIZE = 5242880; // 5MB(バイト)
}
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const INTERNAL_ERROR = 500;
const UNAUTHORIZED = 401;
}
// つかう例
function connectDatabase() {
$host = Config::DB_HOST;
$dbname = Config::DB_NAME;
$user = Config::DB_USER;
echo "接続先: {$host}/{$dbname} ユーザー: {$user}";
}
function sendHttpResponse($status_code) {
if ($status_code === HttpStatus::OK) {
echo "成功しました";
} elseif ($status_code === HttpStatus::NOT_FOUND) {
echo "ページが見つかりません";
}
}
connectDatabase();
sendHttpResponse(HttpStatus::OK);
?>
クラス定数のメリット
整理整頓
- 関連する定数をまとめて管理
- 名前の衝突を避けられる
可読性
- 定数の意味がクラス名でわかる
- コードが理解しやすい
保守性
- 変更時の影響範囲が明確
- 関連する値をまとめて変更
定数の実務での活用例
ウェブサイトの設定
<?php
// サイト設定
define("SITE_TITLE", "私のブログ");
define("SITE_URL", "https://myblog.com");
define("SITE_EMAIL", "contact@myblog.com");
// データベース設定
define("DB_HOST", "localhost");
define("DB_NAME", "blog_db");
define("DB_USER", "blog_user");
define("DB_PASS", "password123");
// ファイルアップロード設定
define("UPLOAD_DIR", "/uploads/");
define("MAX_FILE_SIZE", 2 * 1024 * 1024); // 2MB
// つかう例
function generatePageTitle($page_name) {
return SITE_TITLE . " - " . $page_name;
}
function connectToDatabase() {
$dsn = "mysql:host=" . DB_HOST . ";dbname=" . DB_NAME;
try {
$pdo = new PDO($dsn, DB_USER, DB_PASS);
echo "データベース接続成功";
} catch (PDOException $e) {
echo "接続エラー: " . $e->getMessage();
}
}
echo generatePageTitle("ホーム"); // 私のブログ - ホーム
?>
ステータス管理
<?php
class OrderStatus {
const PENDING = "pending";
const CONFIRMED = "confirmed";
const SHIPPED = "shipped";
const DELIVERED = "delivered";
const CANCELLED = "cancelled";
}
class PaymentStatus {
const UNPAID = 0;
const PAID = 1;
const REFUNDED = 2;
const FAILED = 3;
}
// 注文処理の例
function processOrder($order) {
switch ($order['status']) {
case OrderStatus::PENDING:
echo "注文を確認中です";
break;
case OrderStatus::CONFIRMED:
echo "注文が確定しました";
break;
case OrderStatus::SHIPPED:
echo "商品を発送しました";
break;
case OrderStatus::DELIVERED:
echo "商品が配達されました";
break;
case OrderStatus::CANCELLED:
echo "注文がキャンセルされました";
break;
}
}
// 支払い状況の確認
function checkPayment($payment_status) {
if ($payment_status === PaymentStatus::PAID) {
return "支払い済み";
} elseif ($payment_status === PaymentStatus::UNPAID) {
return "未払い";
} elseif ($payment_status === PaymentStatus::REFUNDED) {
return "返金済み";
} else {
return "支払い失敗";
}
}
?>
API設定
<?php
class ApiConfig {
const BASE_URL = "https://api.example.com";
const VERSION = "v1";
const TIMEOUT = 30; // 秒
const MAX_RETRIES = 3;
}
class ApiEndpoints {
const USERS = "/users";
const ORDERS = "/orders";
const PRODUCTS = "/products";
const AUTH = "/auth/login";
}
// API呼び出しの例
function callApi($endpoint, $data = null) {
$url = ApiConfig::BASE_URL . "/" . ApiConfig::VERSION . $endpoint;
echo "API呼び出し: {$url}";
echo "タイムアウト: " . ApiConfig::TIMEOUT . "秒";
// 実際のAPI呼び出し処理がここに入る
}
// つかう例
callApi(ApiEndpoints::USERS);
callApi(ApiEndpoints::ORDERS);
?>
配列定数

説明
PHP 5.6以降では、配列も定数として定義できます。
基本的な配列定数
<?php
// PHP 5.6以降で使用可能
const COLORS = ["red", "green", "blue"];
const LANGUAGES = ["PHP", "JavaScript", "Python"];
// つかう例
echo COLORS[0]; // red
echo LANGUAGES[1]; // JavaScript
// ループでつかう
foreach (COLORS as $color) {
echo $color . " "; // red green blue
}
?>
連想配列の定数
<?php
const DATABASE_CONFIG = [
"host" => "localhost",
"port" => 3306,
"database" => "myapp",
"charset" => "utf8"
];
const ERROR_MESSAGES = [
"required" => "この項目は必須です",
"email" => "正しいメールアドレスを入力してください",
"password" => "パスワードは8文字以上で入力してください"
];
// つかう例
echo DATABASE_CONFIG["host"]; // localhost
echo ERROR_MESSAGES["required"]; // この項目は必須です
// 設定をつかった関数
function connectDatabase() {
$config = DATABASE_CONFIG;
echo "接続先: {$config['host']}:{$config['port']}";
}
?>
多次元配列の定数
<?php
const MENU_ITEMS = [
"home" => [
"title" => "ホーム",
"url" => "/",
"icon" => "home"
],
"about" => [
"title" => "会社概要",
"url" => "/about",
"icon" => "info"
],
"contact" => [
"title" => "お問い合わせ",
"url" => "/contact",
"icon" => "mail"
]
];
// つかう例
function generateMenu() {
foreach (MENU_ITEMS as $key => $item) {
echo "<a href='{$item['url']}'>";
echo "<i class='{$item['icon']}'></i>";
echo $item["title"];
echo "</a>";
}
}
generateMenu();
?>
よくあるミスと対策
ミス1:定数名の大文字小文字
<?php
// ❌ 悪い例:一貫性がない
define("siteName", "MyWebsite"); // キャメルケース
define("SITE_URL", "https://..."); // 大文字
define("max_users", 100); // 小文字
// ✅ 良い例:すべて大文字+アンダースコア
define("SITE_NAME", "MyWebsite");
define("SITE_URL", "https://...");
define("MAX_USERS", 100);
?>
ミス2:constの条件分岐内での定義
<?php
// ❌ エラーになる例
/*
if ($is_development) {
const DEBUG_MODE = true; // 構文エラー!
}
*/
// ✅ 正しい方法1:defineをつかう
if ($is_development) {
define("DEBUG_MODE", true);
} else {
define("DEBUG_MODE", false);
}
// ✅ 正しい方法2:三項演算子
const DEBUG_MODE = ($is_development) ? true : false;
?>
ミス3:定数の重複定義
<?php
// 最初の定義
define("APP_NAME", "MyApp");
// 同じ名前で再定義(警告が出る)
define("APP_NAME", "NewApp"); // 警告:既に定義済み
// 定義済みかチェックする方法
if (!defined("APP_NAME")) {
define("APP_NAME", "MyApp");
}
// または定数が存在するかチェック
if (defined("APP_NAME")) {
echo "APP_NAME は既に定義されています: " . APP_NAME;
} else {
define("APP_NAME", "MyApp");
}
?>
ミス4:定数名に変数をつかうときの注意
<?php
// ❌ 意図しない動作
$environment = "production";
$setting = "debug";
define($environment . "_" . $setting, false); // production_debug
// しかし定数名を参照するときが大変
echo production_debug; // これは動かない
// ✅ より良い方法
$env = "PRODUCTION";
define($env . "_DEBUG", false);
echo constant($env . "_DEBUG"); // constant()関数をつかう
// ✅ さらに良い方法:配列定数をつかう
const SETTINGS = [
"production" => [
"debug" => false,
"log_level" => "error"
],
"development" => [
"debug" => true,
"log_level" => "debug"
]
];
echo SETTINGS["production"]["debug"]; // false
?>
ミス5:Magic Constants の誤用
<?php
// PHPの魔法定数(Magic Constants)
echo __FILE__; // 現在のファイルのパス
echo __LINE__; // 現在の行番号
echo __FUNCTION__; // 現在の関数名
echo __CLASS__; // 現在のクラス名
// ❌ これらを再定義しようとするとエラー
// define("__FILE__", "custom.php"); // エラー!
// ✅ 独自の定数名をつかう
define("CUSTOM_FILE", "my_custom_file.php");
?>
定数の確認とデバッグ
定数の存在確認
<?php
// 定数が定義されているかチェック
if (defined("SITE_NAME")) {
echo "SITE_NAME は定義されています: " . SITE_NAME;
} else {
echo "SITE_NAME は定義されていません";
}
// 複数の定数をチェック
$required_constants = ["DB_HOST", "DB_NAME", "DB_USER"];
foreach ($required_constants as $const) {
if (!defined($const)) {
echo "必須定数 {$const} が定義されていません";
}
}
?>
すべての定数を表示
<?php
// すべての定数を取得
$all_constants = get_defined_constants();
// ユーザー定義の定数のみを表示
$user_constants = get_defined_constants(true)["user"];
echo "ユーザー定義の定数:";
foreach ($user_constants as $name => $value) {
echo "{$name} = " . (is_array($value) ? "Array" : $value);
}
?>
定数の値を動的に取得
<?php
define("APP_VERSION", "1.2.3");
define("APP_NAME", "MyApplication");
// 定数名を変数でつかう
$const_name = "APP_VERSION";
echo constant($const_name); // 1.2.3
// 存在しない定数の場合
$nonexistent = "NONEXISTENT_CONST";
if (defined($nonexistent)) {
echo constant($nonexistent);
} else {
echo "定数 {$nonexistent} は存在しません";
}
?>
環境別の定数管理
環境設定ファイルの例
config/development.php
<?php
// 開発環境用設定
define("DEBUG_MODE", true);
define("DB_HOST", "localhost");
define("DB_NAME", "myapp_dev");
define("LOG_LEVEL", "debug");
define("CACHE_ENABLED", false);
?>
config/production.php
<?php
// 本番環境用設定
define("DEBUG_MODE", false);
define("DB_HOST", "prod-server.example.com");
define("DB_NAME", "myapp_prod");
define("LOG_LEVEL", "error");
define("CACHE_ENABLED", true);
?>
メインファイル
<?php
// 環境判定
$environment = $_ENV["APP_ENV"] ?? "development";
// 環境別設定ファイルを読み込み
switch ($environment) {
case "production":
require_once "config/production.php";
break;
case "development":
default:
require_once "config/development.php";
break;
}
// 設定に基づいた処理
if (DEBUG_MODE) {
error_reporting(E_ALL);
ini_set("display_errors", 1);
} else {
error_reporting(0);
ini_set("display_errors", 0);
}
echo "環境: {$environment}";
echo "デバッグモード: " . (DEBUG_MODE ? "ON" : "OFF");
?>
まとめ
PHPの定数活用のポイント
基本原則
- 変わらない値は定数に:設定値、固定メッセージなど
- わかりやすい名前:UPPER_CASE + アンダースコア
- 適切な方法を選択:define() vs const
使い分けガイド
場面 | 推奨方法 | 理由 |
---|---|---|
基本的な設定値 | const | シンプルで高速 |
条件による値 | define() | 柔軟性が高い |
クラス関連の値 | クラス定数 | 整理整頓しやすい |
複数の関連値 | 配列定数 | まとめて管理 |
コメント