HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

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

以上の結果から、次のことが読み取れる。

  • 「定数」の値は、リクエストごとに評価・代入される。
  • 同一リクエスト内では「定数」の値を変更することはできない。

つまり、「定数が定数である期間」(=定数の生存期間)はひとつのリクエストに対する処理が完了するまでということがわかる。