定数は、スクリプトの実行中に決して変わらない値につける名前です。const MAX_USERS = 100;かdefine('MAX_USERS', 100);で宣言し、$を付けずに名前だけで使います。
慣習として、定数名はUPPER_SNAKE_CASEで書きます。定数はグローバルで、ファイルの先頭で宣言した定数はglobalなしでどの関数の中からも見えます。
define()とconstの違い
どちらも定数を作りますが、動くタイミングが違います。constはPHPがファイルをコンパイルするときに解決され、define()はほかの関数呼び出しと同じように実行されます。
const | define() | |
|---|---|---|
if、ループ、関数の中 | 使えない | 使える |
| 変数から名前を組み立てる | できない | できる |
| クラス定数 | 使える | 使えない |
| 値に式を使う | 使える(定数とリテラルの式) | 使える(任意の値) |
| 自動で名前空間に入る | 入る | 入らない(フルネームを指定する) |
短くてコンパイル時にチェックされるので、基本はconstを使いましょう。定数が条件や計算した名前に依存するときはdefine()を使います。
定数は変更できない
定数への代入は構文エラーです。
<?php
const LIMIT = 10;
LIMIT = 20;
PHP Parse error: syntax error, unexpected token "=" in /home/index.php on line 3
同じ定数を2回定義してもエラーにはなりませんが、PHPは警告を表示し、最初の値を保ちます。
<?php
define("LIMIT", 10);
define("LIMIT", 20);
echo LIMIT; // 10
Warning: Constant LIMIT already defined in /home/index.php on line 3
値がすでに設定されているかもしれない場合(たとえば複数回読み込まれる設定ファイル)は、先にdefined()で確認します。
定数の配列
定数には配列を入れられます。NAME[key]で読んだり、ループしたり、受け渡したりはできますが、変更はできません。
クラス定数
クラスの中では、constはそのクラスに属する定数を宣言します。外からはClassName::NAMEで、中からはself::NAMEかstatic::NAMEで読みます。クラス定数には可視性を付けられ、finalにもでき、PHP 8.3以降は型も宣言できます。
STATUS_NEWやSTATUS_PAIDのような関連するクラス定数のグループは、enumで書いたほうがよいことが多く、そうすれば不正な値が受け渡されるのも防げます。
マジック定数:LINE、FILE、__DIR__など
マジック定数は、現れる場所によって値が変わります。値はコンパイル時に埋め込まれます。
いちばんよく使われるのは、現在のファイルのディレクトリを表す__DIR__です。これを使ってincludeのパスを組み立てれば、スクリプトをどのディレクトリから起動しても動きます:require __DIR__ . '/config.php';。この書き方の全体はincludeとrequireを参照してください。
知っておきたい組み込み定数
PHPは独自の定数をたくさん定義しています。よく出てくるのは次のものです。
PHP_EOLは、PHPが動いているシステムの改行コードです(LinuxとmacOSでは"\n"、Windowsでは"\r\n")。ファイルやターミナルに書き出すテキスト向けで、HTMLの出力では改行は表示されないので、そこでは<br>を使います。
よくある質問
PHPのdefine()とconstの違いは何ですか?
constはファイルのコンパイル時に解決される言語構造で、トップレベルとクラスの中では使えますが、if、ループ、関数の中では使えません。define()は実行時に呼ばれる関数なので、どこでも使え、名前を変数から組み立てることもできますが、クラス定数は宣言できません。
PHPの定数に配列を入れられますか?
入れられます。const COLORS = ['red', 'green'];もdefine('COLORS', ['red', 'green']);も動き、要素はCOLORS[0]で読みます。あとから配列を変更することはできません。
PHPで定数が定義済みか確認するには?
defined('NAME')を使います。名前を文字列で受け取り、trueかfalseを返します。よくある書き方はif (!defined('APP_ENV')) { define('APP_ENV', 'production'); }です。クラス定数には'ClassName::NAME'を渡します。
PHPのマジック定数とは何ですか?
書かれた場所によって値が変わる定数です:__LINE__(現在の行)、__FILE__(ファイルのフルパス)、__DIR__(そのディレクトリ)、__FUNCTION__、__CLASS__、__METHOD__、__NAMESPACE__。両側にアンダースコアを2つずつ付けて書き、大文字小文字を区別しません。