【PHP基礎】定数とは
定数とは
今回は定数について説明していきます。
定数は変数に似ていますが、値を変更することができません。
PHPで定数を定義する場合には、define関数を使用します。
define("定数名", 値);
定数には「$」が付かないことにも注意が必要です。
■定数名の命名規則
PHPにおける定数名の命名規則については、以下のようなものがあります。
- アルファベット、数字、アンダーバーが使用できる。
- アルファベットを使用した場合には、大文字と小文字は区別される。
- 数字で始めることはできない
※上記の規則と違い守らなくてもエラーにはなりませんが、一般的に定数は全て大文字で定義されることが多いです。
<?php define("$AAA", "定数1"); // エラー define("2BBB", "定数2"); // 定義時にエラーは出ないが、呼び出し時にエラー define("CCC_DDD", "定数3"); // OK ?>
■定数の使い道
変数と違い値の変更ができないということは、ここまでで説明しました。
では、どんな場合に定数を使用するのかということを説明したいと思います。
特徴から考えると値の変更をしたくない場合になるのですが、ではどんな値なら変更不可にしたいかを考えます。
ポイントは共通化です。
「ある値を変更したら別の値も同じように変更しなければならない」
プログラムを書いているとこのような状況に遭遇することがあります。
しかしこれでは「一つは変更したけれど、もう一方は変更し忘れちゃった」なんてことになりかねません。
このような場合に定数として定義しておき、様々な箇所から呼び出せば同じ値であることを保証できます。
値が変更になった場合でも一つだけ定義している定数の値を変更すれば、呼び出している箇所全ての値が変更できます。
もしこれが変数で定義されていると、呼び出し先で値を変更できてしまうので、「同じ値である」ということが保証できないわけですね。
■定数のサンプル
ではサンプルをみてみましょう。
今回は2つのファイルがあります。
実行するのはform.phpです。
登録画面のイメージで、名前の入力文字数が10文字を超えるとエラーメッセージが表示されます。(エラーなしの場合は特になにも起こりません)
▼constants.php
<?php define("MAX_NAME_LENGTH", 10); ?>
▼form.php
<?php require_once('constants.php'); // 別途作成したconstants.phpを読み込み // $nameは初回アクセス時は空文字、送信ボタンが押されて値がPOSTされたら入力値に $name = ''; if(isset($_POST['name'])) { $name = $_POST['name']; } // 10文字より大きい場合はエラーメッセージを代入 $message = ''; if(mb_strlen($name) > MAX_NAME_LENGTH) { $message = '名前は'.MAX_NAME_LENGTH.'文字以内で入力してください。'; } ?> <!DOCTYPE html> <html> <head> <title>定数のサンプル</title> <meta charset="utf-8"> </head> <body> <h1>定数のサンプル</h1> <form action="" method="POST"> <label>名前を入力してください:</label><input type="text" name="name" placeholder="10文字以内で入力してください" size="20" value="<?php echo $name; ?>"> <div style="color: red"><?php echo $message; ?></div> <button type="submit">送信</button> </form> </body> </html>
■サンプル解説
では解説です。
今回はよくある登録時の文字数チェックを例にあげてみました。
実際この場面で定数が使用されることがあります。
まず、form.phpの2行目ですが、constatnts.phpを読み込んでいます。
要はconstatnts.phpで定義したMAX_NAME_LENGTHという定数を使用できるようにしています。
※require_onceについては別の記事で扱います。
次にform.phpの12行目です。
名前の文字数を10文字以内にしたい場合、の条件は、以下の書き方でも同様の動きをします。
mb_strlen($name) > 10
しかし、共通化の考え方からは外れてしまいます。
例えば、名前の文字数チェックをするのは何も登録画面に限った話ではありません。
名前の変更画面でも同様のチェックを実装するはずです。
もしそれぞれの画面で最大文字数を定義していた場合、最大文字数が変更になったときに2箇所同じ修正をしなければなりません。
すると直し忘れが発生し、バグの原因になってしまいます。
そこで今回のconstants.phpのような特定のファイルで定数として定義し、そのファイルを読み込むことで一元管理が実現できます。
■定義済み定数
PHPにあらかじめ定義されている定数も存在しているのでざっと一覧で紹介します。
また一覧では紹介していませんが、円周率のような数学で使用される値もPHP側であらかじめ定義されています。
定数名 | 意味 |
---|---|
PHP_OS | PHPパーサーを実行中のOSの名称。 |
PHP_VERSION | 使用中のPHPのバージョン。 |
TRUE | 真を表す。 |
FALSE | 偽を表す。 |
E_ERROR | 構文エラー以外のエラーを定義する。 |
E_WARNING | 誤りがあるものの、実行は可能である場合の続行条件を定義する。 |
E_PARSE | 不正な構文によりパーサーの処理が中断した状態。 |
E_NOTICE | 上記以外の何かが起きた状態。 |
E_ALL | 全てのE_ではじまる定数が含まれる。 |
※注:E_がつく定数は、エラーレポートレベルを設定するために、通常error_reporting関数とともに使用されます。
■マジック定数
マジック定数とは、PHPで既に定義されている定数のうち、使われ方によって変化する定数を指します。
この定数は、大文字・小文字を区別しません。
定数の前後にあるアンダーバーは2つずつですので、お気をつけください。
こちらの細かい説明は省き、ザックリと一覧で紹介します。
__FILE__ | 処理中のファイル名。includeされている場合は、そのファイル名となる。 |
__DIR__ | そのファイルの存在するディレクトリ。dirname(__FILE__) と同じ。(PHP5.3.0で追加) |
__LINE__ | 処理中の行番号。includeファイルを処理中の場合は、そのファイルでの行番号となる |
__FUNCTION__ | 関数名(PHP4.3.0で追加) |
__CLASS__ | クラス名(PHP4.3.0で追加) |
__METHOD__ | クラスのメソッド名(PHP5.0.0で追加) |
__NAMESPACE__ | 現在の名前空間の名前。(PHP5.3.0で追加) |
__TRAIT__ | トレイト名。宣言された名前空間も含む。(PHP5.4.0で追加) |
■定数のまとめ
- 変数と違い、定数は値の変更ができない。
- 変更させたくない値を共通化し、一元管理したい場合に使用する。
- PHP側であらかじめ定義されている定数も存在する。