【保存版】PHPの定数の使い方まとめ|defineとconstのちがいもわかりやすく解説

PHP

PHPで変数をつかい慣れてくると、次に知りたくなるのが「定数」のつかい方です。

定数をつかえば、値の変更を防ぎ、コードの安定性が向上します。

しかし、define()constのちがいなど、初学者にとっては少しややこしい部分も。

この記事では、PHPの定数の基本から実践的なつかい方、よくあるミスまでを丁寧に説明します。

スポンサーリンク

定数ってなに?

説明

定数(constant)は、一度値を設定すると変更できない識別子です。

変数は$マークがついて値を変更できますが、定数は値が固定されています。

変数と定数のちがい

項目変数定数
記号$variableCONSTANT
値の変更✅ できる❌ できない
スコープ関数内など限定的グローバル(どこでもつかえる)
用途変わる値変わらない値

かんたんな例

<?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の定数活用のポイント

基本原則

  1. 変わらない値は定数に:設定値、固定メッセージなど
  2. わかりやすい名前:UPPER_CASE + アンダースコア
  3. 適切な方法を選択:define() vs const

使い分けガイド

場面推奨方法理由
基本的な設定値constシンプルで高速
条件による値define()柔軟性が高い
クラス関連の値クラス定数整理整頓しやすい
複数の関連値配列定数まとめて管理

コメント

タイトルとURLをコピーしました