PHPでの「定数」
PHPで「定数」と言えば、
define('DEFINE_A', 'definition A');
のように定義するグローバルな定数や、
class Hoge { const CONST_A = 'constant A'; }
があるが、どういう意味で「定数」なのかをちゃんと理解していなかったので、調べてみた。
実験に使用したプログラムは次のとおり。(2010-0924-constants.php )
<?php date_default_timezone_set('Asia/Tokyo'); define('DEFINE_A', date("Y/m/d H:i:s.u")); class Hoge { const CONST_A = 'const A'; const CONST_B = DEFINE_A; // const CONST_C = date("Y/m/d H:i:s.u"); // !! compilation error } print('<dl>'); print('<dt>'.'test 1'.'</dt>'); print('<dd>'.'CONST_A: '.Hoge::CONST_A.'</dd>'); print('<dd>'.'CONST_B: '.Hoge::CONST_B.'</dd>'); //print('<dd>'.'CONST_C: '.Hoge::CONST_C.'</dd>'); print('<dd>'.'DEFINE_A: '.DEFINE_A.'</dd>'); // Hoge::CONST_A = 'constant A'; // !! compilation error define('DEFINE_A', 'define A'); print('<dt>'.'test 2'.'</dt>'); print('<dd>'.'CONST_A: '.Hoge::CONST_A.'</dd>'); print('<dd>'.'CONST_B: '.Hoge::CONST_B.'</dd>'); //print('<dd>'.'CONST_C: '.Hoge::CONST_C.'</dd>'); print('<dd>'.'DEFINE_A: '.DEFINE_A.'</dd>'); print('</dl>'); ?>
これを実行すると、次のような結果が得られる。
test 1 CONST_A: const A CONST_B: 2010/09/24 23:31:20.000000 DEFINE_A: 2010/09/24 23:31:20.000000 test 2 CONST_A: const A CONST_B: 2010/09/24 23:31:20.000000 DEFINE_A: 2010/09/24 23:31:20.000000
何秒かしてから再度アクセスすると次のようになる。
test 1 CONST_A: const A CONST_B: 2010/09/24 23:31:27.000000 DEFINE_A: 2010/09/24 23:31:27.000000 test 2 CONST_A: const A CONST_B: 2010/09/24 23:31:27.000000 DEFINE_A: 2010/09/24 23:31:27.000000
以上の結果から、次のことが読み取れる。
- 「定数」の値は、リクエストごとに評価・代入される。
- 同一リクエスト内では「定数」の値を変更することはできない。
つまり、「定数が定数である期間」(=定数の生存期間)はひとつのリクエストに対する処理が完了するまでということがわかる。