Menu

PHPの定数:define()とconstの違い、マジック定数

PHPの定数は変更できない値につける名前です:const MAX_USERS = 100; または define('MAX_USERS', 100);。defineとconstの違い、定数の配列、self::で読むクラス定数、defined()での確認、マジック定数__LINE__、__FILE__、__DIR__、__CLASS__を学びます。

このページのコードはエディタで実行できます - 編集してすぐに結果を確認できます。

定数は、スクリプトの実行中に決して変わらない値につける名前です。const MAX_USERS = 100;かdefine('MAX_USERS', 100);で宣言し、$を付けずに名前だけで使います。

慣習として、定数名はUPPER_SNAKE_CASEで書きます。定数はグローバルで、ファイルの先頭で宣言した定数はglobalなしでどの関数の中からも見えます。

define()とconstの違い

どちらも定数を作りますが、動くタイミングが違います。constはPHPがファイルをコンパイルするときに解決され、define()はほかの関数呼び出しと同じように実行されます。

constdefine()
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つずつ付けて書き、大文字小文字を区別しません。

Coddyのプログラミング言語のイラスト

Coddyでコードを学ぼう

始める