ScotlandPHP 2016

構文

define() 関数を使用することにより、 定数を定義することが可能です。PHP 5.3.0 以降では、 クラス定義の外部で const キーワードを使って定数を定義することもできます。 define() を使えば任意の式を使って定数を定義できますが、 const キーワードを使う場合には、 次の段落で説明する制約があります。 定数が一度定義されると、 変更または未定義とすることはできません。

PHP 5.6 より前のバージョンでは、const キーワードで定数に指定できるのは、スカラデータ (boolean, integer, double, string) のみです。 PHP 5.6 以降では、定数をスカラー式として定義できるようになりました。 また、array の定数も指定できるようになりました。 resource の定数を指定することもできますが、 予期せぬ結果を引き起こすことがあるので避けるべきです。

単に定数の名前を指定することにより、その値を得ることが可能です。 変数とは異なり、その前に $ は不要です。 定数の名前を動的に得る必要がある場合、定数の値を読むために関数 constant() を使用することも可能です。 定義済の定数の一覧を得るには、 get_defined_constants() を使用してください。

注意: 定数と(グローバル)変数は、異なる名前空間にあります。 例えば、TRUE$TRUE は違うものを意味します。

未定義の定数を使用した場合、ちょうどstringとして コールしたかのように(CONSTANT vs "CONSTANT")、 PHPはその定数自体の名前を使用したと仮定します。 この際、E_NOTICE が発生します。 ある定数が設定されているかどうかを知るには、 defined() 関数を使用してください。 なぜ $foo[bar]が間違っている (まずbarを定数としてdefine()しなければ) のかというマニュアルもご覧ください。 これは 完全修飾形式の定数 には適用されず、この場合は未定義なら fatal error となります。 定数がセットされているかを単にチェックするには defined()を使用してください。

変数との違いは次のようになります。

  • 定数は、前にドル記号($)を要しません。
  • PHP 5.3 より前のバージョンでは、定数を定義することができるのは、define() 関数のみです。単なる代入による定義はできません。
  • 定数は、定義することができ、変数のスコープ規則に関係なく、あら ゆる場所からアクセス可能です。
  • 定数は一度設定されると再定義または未定義とすることはできません。
  • 定数は、スカラー値としてのみ評価可能です。 PHP 5.6 以降では、const キーワードを用いて配列定数を定義できるようになりました。 また PHP 7 以降では、define() を用いた配列定数の定義もできるようになりました。 配列を、定数スカラー式としても使えます (例:const FOO = array(1,2,3)[0];) が、最終的な結果は、許可されている型でなければいけません。

例1 定数の定義

<?php
define
("CONSTANT""Hello world.");
echo 
CONSTANT// "Hello world."を出力
echo Constant// "Constant" を出力し、警告 (notice) を発行
?>

例2 const キーワードによる定数の定義

<?php
// PHP 5.3.0 以降で動作します
const CONSTANT 'Hello World';

echo 
CONSTANT;

// PHP 5.6.0 以降で動作します
const ANOTHER_CONST CONSTANT.'; Goodbye World';
echo 
ANOTHER_CONST;

const 
ANIMALS = array('dog''cat''bird');
echo 
ANIMALS[1]; // 出力は "cat"

// PHP 7 以降で動作します
define('ANIMALS', array(
    
'dog',
    
'cat',
    
'bird'
));
echo 
ANIMALS[1]; // 出力は "cat"
?>

注意:

define() による定数の定義とは反対に、 const キーワードで定義した定数はトップレベルのスコープで宣言しなければなりません。 これはコンパイル時に定義されるからです。 つまり、関数、ループ、if 文、または try/catch ブロックの内部では宣言できないということです。

オブジェクト定数 も参照ください。

add a note add a note

User Contributed Notes

There are no user contributed notes for this page.
To Top