Edited at

PHPの定数について

More than 3 years have passed since last update.

古い知識をアップデートすべく、PHPを再勉強中。

知らない間に、define()以外にも定数定義の方法が追加されていた。


PHPの定数定義は二種類の方法がある。


1. define() 関数を利用するもの

define("FOO", 1);


2. const 構文を利用するもの

const FOO = 1;


define() と const の違い

const 構文は PHP5.3 で導入されたもの。それ以前のバージョンでは利用できない。

単なるシンタックスシュガーかと思ったら、いくつか違いがあるみたい。


1. クラス定数として利用できるか。

class Hoge

{
const FOO = "foo"; // <= OK
define("BAR", "bar"); // <= ERROR!!
}

constを利用した場合、クラス内で定数を定義することができる。

(クラス内でdefine()を利用して定数を定義しようとするとエラーになる)

constを利用してクラス内で定義された定数はクラス定数となり、パブリックなアクセス権を持つ。(逆にいうとアクセス権を指定することはできない)

クラスの外部から参照する場合は「クラス名::定数名」とする。


2.名前空間の影響を受ける。

constで定義された定数は名前空間の影響を受ける。


lib.php

<?php

namespace Lib;

const FOO = "foo";
define("BAR", "bar");


とした場合、定数FOOは名前空間 Lib の配下にあるが、定数BARは名前空間の影響を受けず常にグローバルとなる。(最近のPHPでは名前空間が使えるのか)


test.php

<?php

require_once("lib.php");

echo BAR . PHP_EOL; // <= OK
echo \Lib\FOO . PHP_EOL; // <= OK
echo FOO . PHP_EOL; // <= ERROR



3.定義時に式が使えない。(2014.4.21 追記)

コメント欄で教えていただきましたが、defineの場合、定数の値に式を使うことができるとのことです。

const FOO = 1+2;      # <= ERROR

define('FOO1', 1+2); # <= OK

ドキュメントには式が使えるとの記述を見つけることができなかったので気づきませんでした。


どちらを使えば良いのか?

PHP5.3以降を利用するのであれば、constを使えば良い。ということで良いのかな?