PHP
130
どのような問題がありますか?

この記事は最終更新日から5年以上が経過しています。

投稿日

Organization

PHPで定数定義するときはdefine()よりもconstを使うべき

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

ユーザー登録して、Qiitaをもっと便利に使ってみませんか。
  1. あなたにマッチした記事をお届けします
    ユーザーやタグをフォローすることで、あなたが興味を持つ技術分野の情報をまとめてキャッチアップできます
  2. 便利な情報をあとで効率的に読み返せます
    気に入った記事を「ストック」することで、あとからすぐに検索できます
Hiraku
PHP, Go界隈をうろうろしています。最近はgRPCと戦ってる。 特に明示していなければ、記事中のソースコード片は `CC-0 1.0` とします。出典表示無しで自由にコピペして頂いて構いません。 ただ、記事自体をコピペされるのは嫌なので、ソースコード部分以外の文章は通常通り全ての著作権を私が保持するものとします。 引用を超える範囲のコピペは止めて下さい。
mercari
フリマアプリ「メルカリ」を、グローバルで開発しています。
この記事は以下の記事からリンクされています
m_suzularavelの定数定義からリンク

コメント

概ね記事の通りなのですが、ソースコードにリテラルで書けるようなもの(どんな環境でも一定であるもの)はconstが、初期化時に環境変数によって条件分岐して決定するようなものにdefineが利用されるのかなと思ひます。

ただし現在であれば、どちらの用途であってもいろんな場所に定数埋め込みや定数を使った分岐を書くよりは、クラス/メソッド呼び出しにまとめてしまった方がモダンなんじゃないかなと思ってます。

あとdefineにあってconstにない機能はcase_insensitive引数ですが… 単にgrepの障害になる邪悪な機能なのでなくなったことは喜ばしいですが単純に置換すると罠になることは皆無ではなさそうです。 (幸運にも私はこのオプションを使ったコードに出会ったことはないですが)

2

@tadsan 知らなかった。。クラス宣言や関数宣言はif文の中に書けるのに、constは無理なんですね。
しかもtrue/TRUEみたいな定数を作ることが可能なんですね!勉強になりました。

0
どのような問題がありますか?
あなたもコメントしてみませんか :)
ユーザー登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
新人プログラマ応援 - みんなで新人を育てよう!
~
データに関する記事を書こう!
~
130
どのような問題がありますか?
ユーザー登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
ユーザー登録ログイン
ストックするカテゴリー