PHPのクラス定数について調べる機会がありましたのでこちらのブログにも書いておこうと思います。
スコープがクラス内に限られた定数 const がPHP5.3から使えるようになりましたが
「使い方」と「使う時の注意点(できそうでできないこと)」をここにメモとして残しておきます。
PHPの定数とは?
定数の特徴として大きく以下の2つがあります
・一度代入した後は再代入できない。
・変数より処理が高速
1. PHPの定数 define()関数
PHPの定数としては define() 関数というのが古くからありました。
ただしこちらはスコープがグローバルスコープ(どこからでも参照可能)となってしまうので
あるクラスまたはある名前空間に限定して使いたいといった用途には向きません。
2. PHPの定数 const 構文
PHP5.3以降でcomst構文が使用できるようになりました。
こちらは名前空間やクラスのスコープに対応しているのでクラス定数としても使用できます。
const構文による定数の定義の仕方
// const キーワードを定数の前につける const MYCON = 'Hello father';
定数の呼び出し方
// クラス名:: をつけて呼び出す( self , parent も使用可能) echo MYCLASS::MYCON; 内部から呼び出すには self:: 外部から呼び出すには クラス名:: を使用することになります。
実際には次のように使用します
class MyFatherClass { const MYCON = 'Hello father'; public function showConstant() { echo self::MYCON . "\n"; } } $f = new MyFatherClass(); $f->showConstant();
3. PHP5.6 以降ならconst でも 1+2+3 が使えるように
PHP5.6より下ではconstの右辺に式が使えません。( const は関数ではないのでという事か..? )
以下は PHP5.3 〜 5.5 ではエラーとなるので注意が必要です。
const HOGE = 1+2+3; // エラーになる( PHP5.6未満 )
ところが PHP5.6以降なら const でも式が使用できるようになりました。
これでもう define() はあまり必要なくなりましたね。
4. PHP7.1 以降ならクラス定数のアクセス範囲を指定できるように
(なんか通販番組の後半みたいになっていますが。。。)
class Foo { public const BAR = 'bar'; private const BAZ = 'baz'; } echo Foo::BAR, PHP_EOL; echo Foo::BAZ, PHP_EOL;
このプログラムの出力は以下のようになります。(2つ目の echo でエラー)
bar Fatal error: Uncaught Error: Cannot access private const Foo::BAZ in …
5. 継承での使用
もちろん継承できます。
class MyFatherClass { const MYCON = 'Hello father'; public function showConstant() { echo self::MYCON . "\n"; } } class MySonClass extends MyFatherClass { public function showConstant() { echo self::MYCON . "\n"; } } $f = new MyFatherClass(); $f->showConstant(); $s = new MySonClass(); $s->showConstant();
この例は次のような結果となります。
Hello father Hello father
6. アクセス範囲を指定した継承での使用
private で 宣言をした定数は子クラスでは参照できません。
class MyFatherClass { public const MYCON = 'Hello father' . 'aiueo'; private const SUM = 1 + 2 + 3; public function showConstant() { echo self::MYCON . "\n"; echo self::SUM . "\n"; } } class MySonClass extends MyFatherClass { public function showConstant() { echo self::MYCON . "\n"; echo self::SUM . "\n"; } } $f = new MyFatherClass(); $f->showConstant(); $s = new MySonClass(); $s->showConstant(); この例は次のような結果となります。
Hello fatheraiueo 6 Hello fatheraiueo PHP Fatal error: Uncaught Error: Undefined class constant 'SUM' in
以上簡単ですがPHPのクラス定数 const の使い方でした。