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でも配列定数を定義できるようになった。