PHPの定数の基本
PHPでは、定数を宣言して使用する方法と、理解しておくべき基本概念、および使用例について解説します。また、定数を宣言するためのdefine()
関数とconst
キーワードの違いについても見ていきます。さらに、配列を定数として定義する定数配列についても紹介します。
PHPの定数
PHPの定数とは
PHPにおける定数(Constant)とは、一度定義すると値を変更できない単純な値の識別子(名前)です。つまり、一度値を代入すると、その後に再代入することはできません。定数はプログラムの実行中に固定された値を保持し、複数の箇所で共通して使用される値を表すために利用されます。
PHPの定数の宣言
define()
関数を使って宣言するか、- クラス内で
const
キーワードを使って宣言することもできます。
/* define()関数を使った宣言例 */
define('GLOBAL_CONSTANT', 200);
echo GLOBAL_CONSTANT; // 200
/* クラス内でconstキーワードを使った宣言例 */
class MyClass {
const CONSTANT = 'constant value';
function showConstant() {
echo self::CONSTANT . "\n";
}
}
echo MyClass::CONSTANT; // 'constant value'
$class = new MyClass();
$class->showConstant(); // 'constant value'
定数は通常、大文字で名前が付けられ、必要に応じて単語間をアンダースコア(_
)で区切ります。定数は一般的に、変更すべきでない設定値や役割、状態コードなどに使用されます。
PHPの定数は、スーパーグローバル変数と同様に、グローバルスコープ(Global Scope)で使用できます。
定数の重要性と活用例
定数は一度宣言されると値を変更できないため、プログラム内で変わってはならない値を表す重要な役割を果たします。こうした値を定数として定義することで、さまざまな利点を得ることができます。
- コードの可読性と保守性の向上
- 一貫性と安定性の維持
- バグやエラーの防止
コードの可読性と保守性の向上
定数を使うことで、ハードコーディングよりも明確で意味のあるコードを書くことができます。例えば、以下のように定数を使って意味を持たせた状態コードを定義することが可能です。
define('STATUS_ACTIVE', 1);
define('STATUS_INACTIVE', 2);
define('STATUS_ARCHIVED', 3);
このように定数で定義された状態コードを使うことで、コードの可読性が向上し、保守も容易になります。
一貫性と安定性の維持
定数は変更できない値を表すため、意図しない変更を防ぎ安定性を保つのに役立ちます。プログラムの複数の箇所で同じ値を使う場合、定数を活用することで、一度定義した値を一貫して使用できます。
define('MAX_LOGIN_ATTEMPTS', 5);
上記の定数を使ってログイン試行回数を制限することで、その値が後から変更されないようにし、一貫性を保つことができます。
バグやエラーの防止
定数は値が変更されないため、誤って値を変更してしまうバグを防ぐことができます。例えば、プログラム内で固定の数値を使用する場合、その値が変更されるのを防がなければ、値の誤りが発生する可能性があります。しかし、定数を使うことでこうした誤りを防止できます。
// 定数を使う場合
define('TAX_RATE', 0.1);
$totalAmount = $subTotal + ($subTotal * TAX_RATE);
// 定数を使わない場合
$taxRate = 0.1;
$totalAmount = $subTotal + ($subTotal * $taxRate);
これらの利点は定数の重要性を強調しており、プログラムの安定性と可読性の向上に大いに役立ちます。定数を適切に活用することで、コードの保守性と品質を高めることができます。
定数と変数の違い
定数と変数の最も大きな違いは、値を変更できるかどうかです。
変数はいつでも再代入して値を変更できますが、定数は一度値が割り当てられると変更できません。このため、定数は不変性を持ち、変更してはならない値を表現するのに適しています。
定数の利点と活用性の概要
- 定数はプログラム内で変わってはならない値を表すのに有用です
- 値の変更を防ぐことで、意図しないバグを減らすことができます
- 大文字で名前を記述することで、定数であることが区別され、可読性が向上します
- PHPのバージョンによって動作が多少異なる場合があるため、使用時にはPHPのバージョンを考慮する必要があります
本セクションでは、PHPの定数の概念と重要性について説明し、定数と変数の違いを比較することで定数の活用性を簡潔に紹介しました。次のセクションでは、定数の宣言と使用方法についてさらに詳しく見ていきます。
PHPの定数宣言と使用法
定数を宣言する方法には、define()
関数とconst
キーワードの2つがあります。本セクションでは、それぞれの方法を詳しく見ていくとともに、定数の有効範囲についても解説します。
define()
関数を使った定数の宣言方法
define()
関数を使ってグローバル定数を宣言できます。この方法はPHP4以降で利用可能です。
構文
define(string $constant_name, mixed $value, bool $case_insensitive = false): bool
引数
$constant_name |
定数に使用する名前です。文字列形式で指定します。 |
---|---|
$value |
定数の値です。PHP 5では値はスカラー型(整数、浮動小数点数、文字列、ブール値、null)でなければなりません。PHP 7からは配列も許可されるようになりました。 |
$case_insensitive |
定数名の大文字・小文字の区別を指定します。true に設定すると、定数は大文字・小文字を区別せずに定義されます。基本動作は大文字・小文字を区別するため、つまりCONSTANT とConstant は別の定数を表します。
警告: PHP 7.3.0以降、この機能は非推奨(deprecated)となりました。PHP 8.0.0以降はfalse のみが許容され、true を渡すと警告が発生します。 |
戻り値
成功時はtrue
、失敗時はfalse
を返します。
使用例
define('MY_CONSTANT', 10);
echo MY_CONSTANT // 出力: 10
上記の例では、MY_CONSTANT
はグローバルスコープでアクセス可能な定数であり、どこからでも参照できます。
const
キーワードを使った定数の宣言方法
const
キーワードを使ってクラス内で定数を宣言できます。この方法はPHP5以降で利用可能です。
class MyClass {
const CLASS_CONSTANT = 100;
public function getConstantValue() {
return self::CLASS_CONSTANT; // self::CONSTANT_NAME の形式でアクセス可能
}
}
echo MyClass::CLASS_CONSTANT; // 出力: 100、クラス名と :: 演算子を使ってアクセスできます
上記の例では、MY_CONSTANT
はMyClass
クラス内でのみアクセス可能な定数です。クラス内ではself::CONSTANT_NAME
の形式でアクセスでき、クラス外部ではクラス名と::
演算子を使ってアクセスします。
PHP定数の有効範囲
define() |
define() 関数で宣言された定数はグローバルスコープでアクセス可能です。つまり、どこからでも参照できます。 |
---|---|
const |
const キーワードでクラス内に宣言された定数は、そのクラス内でのみアクセス可能です。クラス内ではself::CONSTANT_NAME の形式でアクセスでき、クラス外部ではクラス名と:: 演算子を使ってアクセスします。クラス外部から直接アクセスしようとすると警告(warning)が発生します。 |
PHP定数の有効範囲の例
define()
関数を使った定数の有効範囲
define('GLOBAL_CONSTANT', 200);
class AnotherClass {
public function getConstantValue() {
return GLOBAL_CONSTANT;
}
}
echo GLOBAL_CONSTANT; // 出力: 200
$anotherClass = new AnotherClass();
echo $anotherClass->getConstantValue(); // 出力: 200
上記の例では、define()
関数で宣言したGLOBAL_CONSTANT
はグローバルスコープでアクセス可能です。そのため、クラス内からも参照できます。クラスAnotherClass
のgetConstantValue()
メソッドを呼び出してグローバル定数を出力する例を示しています。
const
キーワードで宣言したクラス内定数の有効範囲
class MyClass {
const CLASS_CONSTANT = 100;
}
echo MyClass::CLASS_CONSTANT; // 出力: 100
// クラス内定数を直接使用すると警告が発生します
// echo CLASS_CONSTANT; // 警告: Use of undefined constant CLASS_CONSTANT - assumed 'CLASS_CONSTANT'
上記の例では、const
キーワードで宣言したCLASS_CONSTANT
はクラス外部から直接アクセスしようとすると警告(warning)が発生します。
define()
関数とconst
キーワードの違い比較
比較項目 | define() 関数 |
const キーワード |
---|---|---|
宣言 | グローバルスコープでの宣言 | クラス内での宣言 |
アプローチ方法 | グローバルスコープでアクセス可能です。つまり、どこからでもアクセスできます | クラス内でのみアクセス可能です。クラス内部では、self::CONSTANT_NAME の形式でアクセスできますが、クラス外部からはクラス名と:: 演算子を使ってアクセスすることができます。ただし、クラス外部から直接アクセスしようとすると、警告(warning)が発生します。 |
定数名は大文字と小文字が区別されます | 基本的には大文字と小文字が区別されますが、設定によっては区別せずに定義することも可能です。ただし、PHP 8.0.0以降は大文字・小文字が区別されます | 区別されます |
処理のタイミング | ランタイム(実行時)に動的に呼び出され、定数の存在を確認することができます(定数が存在するかどうかを確認するために使用できます) | コンパイルタイム(コードが実行される前)に使用され、定数を定義します(定数を定義するために使用され、コンパイルタイムの時点で定数はすでに定義されているため、定数の存在を確認する目的では使用できません) |
PHPバージョン | PHP4以上 | PHP5以上 |
PHPの定数配列
PHP 7バージョン以降では、define()
関数を使った定数の宣言で、定数の値に配列を指定することも許可されました。
PHP 7バージョン以前は、定数の値はスカラー値(整数、浮動小数点数、文字列、ブール値、null)でなければなりませんでした。これは、開発者により柔軟な定数の使用を可能にし、開発の利便性を向上させるためです。例を使って説明します。
define('FRUITS', ['apple', 'orange', 'banana']);
echo FRUITS[0]; // 出力: apple
定数配列は読み取り専用です
define('FRUITS', ['apple', 'orange', 'banana']);
FRUITS[0] = 'grape'; // Fatal Eror
上記の例のように、定数として宣言された配列の要素を変更しようとするとエラーが発生することが確認できます。配列自体は要素を変更できますが、定数の値として使用された配列は読み取り専用です。 これは「PHPにおける定数(Constant)は一度定義された後に値が変更されない単純な値である」という一貫性を維持するためです。つまり、定数は変更されてはいけないためです。
ご注意ください!
PHP 7以前のバージョンおよびPHP 7以降のバージョンのいずれにおいても、const
キーワードでは配列を定数の値として宣言することはできません。 const
キーワードはスカラー(Scalar)値のみを定数の値として許可しており、配列やオブジェクトのような複合データ型は使用できません。