HOME>WEBプログラム覚書>PHP4 static修飾子

PHP4 static修飾子

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

そもそもの挙動

そもそものstaticの挙動は

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

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

サンプルコード

PHP

  1. <?php
  2. function noStatic()
  3. {
  4.     $count = 0;
  5.     $count++;
  6.     return $count;
  7. }
  8.  
  9. function yesStatic()
  10. {
  11.     static $count = 0;
  12.     $count++;
  13.     return $count;
  14. }
  15.  
  16. for ($i=0; $i&lt;3; $i++) {
  17.     echo "noStatic()" . $i . "回目 : " . noStatic() . &quot;\n&quot;;
  18.     echo "yesStatic()" . $i . "回目 : " . yesStatic() . &quot;\n&quot;;
  19. }
  20. ?>

実行結果

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

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

PHP

  1. <?php
  2. class StaticTest
  3. {
  4.     var $name;
  5.  
  6.     function StaticTest($name)
  7.     {
  8.         $this-&gt;name = $name;
  9.     }
  10.  
  11.     function get()
  12.     {
  13.         static $count = 0;
  14.         $count++;
  15.         return $count;
  16.     }
  17. }
  18.  
  19. $a = new StaticTest("A");
  20. $b = new StaticTest("B");
  21.  
  22. for ($i=0; $i&lt;3; $i++) {
  23.     echo $a-&gt;name . $i . "回目 : " . $a-&gt;get() . &quot;\n&quot;;
  24.     echo $b-&gt;name . $i . "回目 : " . $b-&gt;get() . &quot;\n&quot;;
  25. }
  26.  
  27. ?>

実行結果

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

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

投稿日 2008年4月 3日 22:19
カテゴリ PHP
タグ テストコード | 動作確認
トラックバック URL http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1136

コメント

コメントする
Name
Email Address
URL