[PHP] 定数宣言 define()とconst どっち使う?

アフィリエイト広告を利用しています

このページの内容が役に立ったら X (旧twitter) でフォローして頂けると励みになります
挨拶や報告は無しで大丈夫です

先日、[PHP] コーディング規約で、ZendとPEARの標準コーディング規約を紹介し、この規約に従ってプログラムを書いていこうと言いました。

定数を宣言する際には、クラスのメンバとして "const" で定義しなければなりません。"define" によるグローバル定数の宣言も可能ですが、お勧めしません。
Zendの規約[B.3.5. 定数]より引用

Zendには、こんなふうに書かれています。まぁ禁止しているわけじゃなく、”お勧めしません”ですが。
ってか、Zendのコーディング規約って、classであることを前提に書かれてますよね。
一方、PEARのコーディング規約には、defineでの命名規則が書かれてあります。

で、define()は、使っていいの?ダメなの?

例えば、ユーザー情報クラスなどで、性別を男:0,女:1として表現するケースなど、定数にしておくと読みやすいコードになります。
では、define('MAN', 0); define('WOMAN', 1); と定義しましょうか?
いいえ違います。この場合は、次のようにユーザー情報クラスの中で定義するべきです。

$User = new UserInfo();
$User->setSex( UserInfo::MAN );
echo $User->getSexText();

class UserInfo{
const MAN = 0; // 男性
const WOMAN = 1; // 女性
private $Sex;
public function setSex($val){
if ( ($val == self::MAN) || ($val == self::WOMAN ) )
{
$this->Sex = $val;
}
}
public function getSexText()
{
if ($this->Sex == self::MAN){
return '男性';
} else if ($this->Sex == self::WOMAN){
return '女性';
}
return '';
}
}

性別は、ユーザー情報の一部分の情報です。プログラム中で、UserInfoクラスの外側で性別を表す定数が必要になるケースは稀で、非常に限定的な用途になるため、class内で定義します。

では、define()は、どのような場面で使うのか?というと・・・プログラム中のどこの場所で必要になるか分からないけど、状況によって値の変更が必要になる(可能性も含め)ことが分かっているケースです。
例えば、PHPファイルやディレクトリへの絶対パス、開発時と運用時の動作変更のためのフラグ、webサイトのタイトル、URL、メールアドレスなど。

なお、define()で定数を宣言する時は注意が必要です。
define()で定義した定数は、プログラム中のどんな場所でも使用することができるため、計画なしに何でも定数化していると、可読性の低いプログラムになってしまいます。
また、PHPの定義済みの定数があり、ここで定義された名前と被らないようにしなければなりません。

以上のことを踏まえ、私は、

  1. 定数を宣言するためだけのPHPファイルを用意する。
  2. 定数はすべて、1のファイルに記述し、最初にincludeする。
  3. 定数名は、 C_ で開始する。

という独自のルールを用いています。

3の 「C_ で開始する」で、C_ で始まっている定数は、自分が独自に定義した定数であることが一目で認識できるようになり、そして、1.2により、define()された定数は、このPHPファイルさえ見れば理解できるようになります。