PHPで定数を定義する場合、define
関数とconst
キーワードの2種類の方法がある。
<?php
define('HOGE', 'hoge');
const FUGA = 'fuga';
見て分かる通り、defineは関数であるのに対しconstは関数ではないのでconstの方が高速に処理される。
大量に定数定義したいならconstを使う方が望ましい。
その昔「定数定義を高速に行う」というためだけの関数がいくつか存在していたが、いずれも拡張モジュールのメンテナンスが止まっているようなので、今やるならconst書き換えが現実的なチューニング法なんじゃないかな。
http://php.net/manual/ja/function.apc-define-constants.php
https://pecl.php.net/package/hidef
defineでしかできないこと
defineは関数なので、引数には式であれば何でも書くことができる。関数の実行結果を書いてもOK。
<?php
define('APP_PATH', dirname(__DIR__, 2));
こういうdefineはconstに書き換えることはできない。
ちなみに名前空間つきの定数もdefineで定義することができる。
<?php
define('Foo\Moo\APP_PATH', dirname(__DIR__, 2));
echo Foo\Moo\APP_PATH;
constでしかできないこと
クラス定数はconstでしか定義できない。ちなみに通常の定数をdefineでなくconstで定義できるようになったのは、PHP5.3から。
<?php
class A
{
const HOGE = 'hoge';
}
constの右辺に書けるもの
任意の式が書けないのでconstでは書けないものが存在するが、定数であれば書くことができる。なので別の定数も書くことができる。
<?php
const DIR = __DIR__;
const HOGE = FooClass::HOGE;
配列定数について
割と最近のPHPの機能として配列定数がある。
PHP5.6からconstでなら配列定数を定義できるようになり、PHP7からdefineでも配列定数を定義できるようになった。
コメント
@tadsan2
@Hiraku0
概ね記事の通りなのですが、ソースコードにリテラルで書けるようなもの(どんな環境でも一定であるもの)は
const
が、初期化時に環境変数によって条件分岐して決定するようなものにdefine
が利用されるのかなと思ひます。ただし現在であれば、どちらの用途であってもいろんな場所に定数埋め込みや定数を使った分岐を書くよりは、クラス/メソッド呼び出しにまとめてしまった方がモダンなんじゃないかなと思ってます。
あと
define
にあってconst
にない機能はcase_insensitive
引数ですが… 単にgrepの障害になる邪悪な機能なのでなくなったことは喜ばしいですが単純に置換すると罠になることは皆無ではなさそうです。 (幸運にも私はこのオプションを使ったコードに出会ったことはないですが)@tadsan 知らなかった。。クラス宣言や関数宣言はif文の中に書けるのに、constは無理なんですね。
しかもtrue/TRUEみたいな定数を作ることが可能なんですね!勉強になりました。