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.  ?>

実行結果

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

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

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

プログラミングPHP 第2版
作者:Peter MacIntyre | 価格:¥ 3,990

トラックバック(0)

コメント

コメントする
Name
Email Address
URL
TIME LINE
2012
02.08

[Ubuntu11.10]Winows XPユーザーがUbuntuを使ってみて

Windows XPとUbuntuのデュアルブート環境にしてみておもったこと。

2012
02.03

[jQuery]closest()とparents()

今から16年前Netscapeブラウザのソースコードの公開方法の会議の中で、初めてオープンソースという言葉が使われた今日、 みなさんいかがお過ごしでしょうか。

今回の投稿はそれとは関係のないjQueryのparents()とclosest()が 似てたので何が違うのか試した時のメモです。

2012
02.01

[jQuery Mobile]初期化イベントメモ

jQuery Mobileは読み込まれてから

mobileinit -> pagebeforecreate -> pagecreate -> pageinit

の順番でイベントが発生する。

2012
02.01

[WordPress]管理画面のフッタのフィルタとアクション。

時間も時間なので、あまり使用頻度の高くない微妙なネタを。

会員制サイトなどで不特定多数の人にログインさせる場合、フッタのバージョン情報は隠しておきたかったり、 こじゃれたメッセージを表示したいときとか使うアクションとフィルタ。

2012
01.28

[WordPress] ブログの情報を取得する方法とノーキャッシュ疑惑

ブログのget_bloginfo()で取れないデータが必要な場合に使うもの。

2012
01.26

[jQuery Mobile]ダイアログ

jQuery Mobileにおけるダイアログの扱いはウインドウではなくページ。 なので通常のページと同様に扱える。ダイアログウインドウを出す。じゃなくダイアログページに遷移する。的な。

2012
01.25

[Ubuntu11.10]Ubuntuのインストール後の設定

インストール完了後の環境構築。PC起動時いちいちBIOSからブートドライブ選んで ブートするのかと思ってたら起動時にOS選択画面が出てくる。

すばらしいですね。

2012
01.24
2012
01.23

MinGW+Mintty+Git

MinGW+Mintty+Gitをやろうとして失敗に終わった。このエントリーには収穫できるものはありません。