構文
const
キーワードか、
define() 関数を使うことで、定数を宣言することが出来ます。
define() を使えば任意の式を使って定数を定義できますが、
const
キーワードを使う場合には、
次の段落で説明する制約があります。
定数が一度定義されると、
変更または未定義とすることはできません。
const
キーワードで定数に指定できるのは、スカラー式
(bool, int,
float, string) と、
スカラー式だけを含んだ array の定数です。
resource の定数を指定することもできますが、
予期せぬ結果を引き起こすことがあるので避けるべきです。
単に定数の名前を指定することにより、その値を得ることが可能です。
変数とは異なり、その前に $
は不要です。
定数の名前を動的に得る必要がある場合、定数の値を読むために関数
constant() を使用することも可能です。
定義済の定数の一覧を得るには、
get_defined_constants() を使用してください。
注意: 定数と(グローバル)変数は、異なる名前空間にあります。 例えば、
true
と $TRUE は違うものを意味します。
未定義の定数を使用した場合、Error がスローされます。
PHP 8.0.0 より前のバージョンでは、
未定義の定数は、ちょうどstringとして
コールしたかのように(CONSTANT vs "CONSTANT")、
PHPはその定数自体の名前を使用したと解釈していました。
このような振る舞いは、PHP 7.2.0
以降では非推奨となり、E_WARNING
が発生するようになりました。
(それより前のバージョンでは、
E_NOTICE が発生していました)
(bar
が定数でなければ) なぜ
$foo[bar]が間違っている
のかというマニュアルもご覧ください。
これは 完全修飾形式の定数
には適用されず、この場合は未定義なら Error が発生します。
注意: 定数が設定されているかを確認するには、defined() 関数を使って下さい。
変数との違いは次のようになります。
-
定数は、前にドル記号(
$
)を要しません。 - 定数は、定義することができ、変数のスコープ規則に関係なく、あら ゆる場所からアクセス可能です。
- 定数は一度設定されると再定義または未定義とすることはできません。
- 定数は、スカラー値と配列としてのみ評価可能です。
例1 定数の定義
<?php
define("CONSTANT", "Hello world.");
echo CONSTANT; // "Hello world."を出力
echo Constant; // エラーが発生: Undefined constant "Constant"
// PHP 8.0.0 より前のバージョンでは、"Constant" を出力し、警告が発生
?>
例2 const
キーワードによる定数の定義
<?php
// 単純なスカラー値
const CONSTANT = 'Hello World';
echo CONSTANT;
// スカラー式
const ANOTHER_CONST = CONSTANT.'; Goodbye World';
echo ANOTHER_CONST;
const ANIMALS = array('dog', 'cat', 'bird');
echo ANIMALS[1]; // 出力は "cat"
// 配列の定数
define('ANIMALS', array(
'dog',
'cat',
'bird'
));
echo ANIMALS[1]; // 出力は "cat"
?>
注意:
define() による定数の定義とは反対に、
const
キーワードで定義した定数はトップレベルのスコープで宣言しなければなりません。 これはコンパイル時に定義されるからです。 つまり、関数、ループ、if
文、またはtry
/catch
ブロックの内部では宣言できないということです。
注意:
PHP 8.0.0 より前のバージョンでは、define() 関数を使って定義された定数は、 大文字小文字を区別しません。
User Contributed Notes 2 notes
the documentation doesn't go too far in explaining the crucial difference between the two ways of declaring constants in PHP.
Const is handled at compile time, define() at run time. For this reason, a constant cannot be conditionally defined using Const, for example.
Another difference we can notice occurs in the constant declarations in classes. Const infiltrates the class scope, while define() leaks into the global scope.
<?php
Class Myclass (){
const NAME = "Nicolas";
}
?>
The NAME constant is within the scope of the MyClass class.
Just a quick note:
From PHP7 on you can even define a multidimensional Array as Constant:
define('QUARTLIST',array('1. Quarter'=>array('jan','feb','mar'),'2.Quarter'=>array('may','jun','jul'));
does work as expected.