PHPの定数定義の方法について、変遷を調べてみました。(参考: PHP>マニュアル>言語リファレンス>定数>構文、PHP>マニュアル>関数リファレンス>その他の基本モジュール>その他>その他の関数>define)
define
: スカラー値のみ
const
: 存在しない
define
: スカラー値のみ
const
: スカラー値のみ
define
: スカラー値のみ
const
: スカラー値(スカラー式も可)と配列 ※ リソースも可能だが非推奨
define
: スカラー値と配列 ※ リソースも可能だが非推奨
const
: スカラー値(スカラー式も可)と配列 ※ リソースも可能だが非推奨
define
は関数式、const
は代入式という書き方の違いがあります。define
はそもそも関数として扱われるため、値の部分に任意の式を書くことができます。7.0からdefine
で配列も可能にしたのは、単にconst
にあわせていったと思われます。
なお、(Cを除く)他の言語の定数は、再代入できない(言語によっては警告を出すだけや、慣習としてそうするというのもある)ただの変数として扱う場合が多いです。そのため、
- 定義は代入式
- 任意のデータ(オブジェクト)を扱える
という場合がほとんどです。初期のPHPは関数式のdefine
だけで、しかもスカラー値のみであり、他の言語とは大きくかけ離れていました。それをバージョンアップの度に徐々にあわせていったと考えられます。
では、上を踏まえて、質問の回答です。
- これまで定数に配列を定義したいと思ったことがありますか?
あまりPHPを書かないのでPHPでそうしたいと思ったことは無いのですが、PHP以外の言語では普通に使っています。
- また、それはどんなケースでしたか?
指定フォルダ内のファイルを処理するスクリプトで、除外するファイル一覧として['System Volume Information', '$RECYCLE.BIN', 'Desktop.ini', ...]みたいなのを作った事があります。そのプログラムで変わることが無いような、サポート済み形式とか、定義済みの名前とか、そういった物の一覧を初めから用意したいときに使っています。たとえば、HTML5を処理するようなプログラムで使用できる要素名一覧を定数配列に入れておくとかです。
- オブジェクト定数ではなく、グローバル空間に配列を定数を定義する積極的なメリットはあるか
const
もグローバル空間に使用できます。まずは、クラス内とクラス外という比較で言えば、
- クラス内だと名前空間が分かれるため、名前の衝突防止等が期待できます。(大規模開発では必須)
- クラス内だとそのクラスに関連する定数だと一目でわかります。
と言う違いがあります。クラスを意識した作りにするのであればクラス内で書くべきでしょう。ただ、オブジェクト指向を使わないようなフラットなPHPにおいて、そのためだけにクラスを作るのはあまり意味が無いと思います。
では、グローバル空間において、const
とdefine
ですが、違いは代入式と関数式というところです。
const
の代入式の方が、変数の代入と書き方が同じになるため、わかりやすいような気がします。
define
は関数式なので、値部分を任意の式にできます。const
の右辺はスカラー式しか許されていません。
特に2.の違いが重要です。
PHP
1define("HOGE", array_merge([1, 2], [8, 9]));
と書くことができますが、
PHP
1const HOGE = array_merge([1, 2], [8, 9]);
と書くことはできません。関数等を用いて配列を作り上げたい(他にもたとえばrange(1, 10)
など)ときはdefine
を使うしかないようです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/09/18 05:35