PHP4 static修飾子

| 2008年04月03日 22:19

pearのNet_UserAgent_Detectを眺めていたら「static」があった。 「static」なんて使ったことなかったのでどんな動きするのか試してみた。

そもそもの挙動

そもそものstaticの挙動は

静的変数はローカル関数スコープのみに 存在しますが、プログラム実行がこのスコープの外で行われるようになってもその値を失わないません。

PHPマニュアルにあるように、変数のスコープが外れても値を保持してくれるということらしいので

サンプルコード


function noStatic()
{
    $count = 0;
    $count++;
    return $count;
}

function yesStatic()
{
    static $count = 0;
    $count++;
    return $count;
}

for ($i=0; $i<3; $i++) {
    echo "noStatic()" . $i . "回目 : " . noStatic() . "\n";
    echo "yesStatic()" . $i . "回目 : " . yesStatic() . "\n";
}


実行結果

noStatic()0回目 : 1 yesStatic()0回目 : 1 noStatic()1回目 : 1 yesStatic()1回目 : 2 noStatic()2回目 : 1 yesStatic()2回目 : 3

このような実行結果になるのは問題ない。

でstaticをクラス内で利用した場合、PHP4のメソッドにおけるstatic変数の挙動 でも書かれているように別オブジェクトであっても共有されるようだ。


class StaticTest
{
    var $name;

    function StaticTest($name)
    {
        $this->name = $name;
    }

    function get()
    {
        static $count = 0;
        $count++;
        return $count;
    }
}

$a = new StaticTest("A");
$b = new StaticTest("B");

for ($i=0; $i<3; $i++) {
    echo $a->name . $i . "回目 : " . $a->get() . "\n";
    echo $b->name . $i . "回目 : " . $b->get() . "\n";
}


実行結果

A0回目 : 1 A0回目 : 2 A1回目 : 3 A1回目 : 4 A2回目 : 5 A2回目 : 6

PHP4のメソッドにおけるstatic変数の挙動のソースまんまだが確かに共有されている・・・

kantenna.com 最新更新ページ

PHP4 static修飾子タグ:

トラックバック

  • http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/411
コメント (0)
コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)





この情報を登録しますか?