PHPの基礎 - 定数

提供:MochiuWiki - SUSE, Electronic Circuit, PCB
ナビゲーションに移動 検索に移動

概要

定数は、プログラムの実行中に値が変更されない固定値を表現するために使用する。
変数とは異なり、1度定義すると変更できない。

定数の定義方法には、主に2つのアプローチがある。

  • define関数を使用する方法
  • constキーワードを使用する方法


constキーワードはコンパイル時に定義される必要があり、クラス内での定数定義にも使用できる。
define関数は実行時に定義できるため、動的な使用が可能である。

PHPには多くの組み込み定数が存在する。
例えば、PHP_VERSIONはPHPのバージョン、TRUEFALSENULLといった論理値も定数として扱われる。

また、マジックコンスタントと呼ばれる特殊な定数もある。
__FILE__ (現在のファイルパス) や __LINE__ (現在の行番号) 等がこれに該当する。

定数を使用することにより、コード全体で一貫した値を維持できること、意図しない値の変更を防げること、コードの可読性が向上すること等が挙げられる。
特に、設定値やシステム全体で共有する値の管理に適している。

なお、定数が定義済みかどうかはdefined関数で確認できる。

 if (defined('MAX_USERS')) {
    echo "MAX_USERSは定義済みです";
 }



define関数の使用

 define('MAX_USERS', 100);
 echo MAX_USERS;  // 出力 : 100



constキーワードの使用

 const MIN_AGE = 18;
 echo MIN_AGE;  // 出力 : 18



魔法定数

__DIR__は、PHPの魔法定数 (マジカル定数) の1つであり、そのPHPファイルが配置されているディレクトリの絶対パスを返す。
この定数は、PHP 5.3以降で使用可能である。

例えば、以下に示すようなファイル構成の場合、index.phpファイル内で__DIR__を指定すると/var/www/html/myappを指す。

/var/www/html/myapp/
             ├── index.php
             └── classes/
                    └── class.php


__DIR__のメリットを以下に示す。

  • パスの信頼性
    // 相対パスの場合 (非推奨)
    require_once('class.php');  // 実行時の作業ディレクトリに依存
    
    // __DIR__を使用 (推奨)
    require_once(__DIR__ . '/class.php');  // 常に確実なパス
    

  • 異なるディレクトリからの実行でも動作
    // classes/class.phpを読み込む場合
    require_once(__DIR__ . '/classes/class.php');
    

  • セキュリティの向上
    相対パスを使用する場合と比べて、意図しないファイルが読み込まれるリスクを減らす。

  • IDEのサポート
    絶対パスを使用することいより、IDEの補完機能やパス解決が正確に機能する。


 // 一般的な使用例
 
 // 設定ファイルの読み込み
 require_once(__DIR__ . '/config/config.php');
 
 // クラスファイルの読み込み
 require_once(__DIR__ . '/classes/User.php');
 
 // テンプレートの読み込み
 include(__DIR__ . '/templates/header.php');


※注意

  • WindowsでもLinuxでも適切に動作する。(パスの区切り文字を自動的に処理)
  • ファイルパスを組み立てる場合は、ディレクトリの区切り文字 ("/") の重複に注意する。


 // 応用例
 
 // 共通の定数として定義
 define('BASE_PATH', __DIR__);
 define('CLASS_PATH', BASE_PATH . '/classes');
 define('CONFIG_PATH', BASE_PATH . '/config');
 
 // 後で使用
 require_once(CLASS_PATH . '/User.php');
 require_once(CONFIG_PATH . '/database.php');