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変数の挙動のソースまんまだが確かに共有されている・・・

PHP4 static修飾子タグ:

トラックバック
  • http://www.kantenna.com/cgi-bin/mt/mt-tb.cgi/216
コメントを投稿

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





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

このサイトは次のライセンスで保護されています。

Creative Commons License

IT業界、エンジニア関連の求人
Web業界に精通したエージェントなので、希望に合った仕事、プロジェクト、雇用形態を紹介してくれてしっかりと転職活動をサポートしてくれます。
初心者のみ採用!【スノーグラス】WEB系エンジニア募集
初心者のみのweb系エンジニア求人!なんでだ?そろそろ転職考えてるのでここ行ってみようかな・・・
Twitter Updates