PHP4 static修飾子
pearのNet_UserAgent_Detectを眺めていたら「static」があった。
「static」なんて使ったことなかったのでどんな動きするのか試してみた。
そもそもの挙動
そもそものstaticの挙動は
静的変数はローカル関数スコープのみに 存在しますが、プログラム実行がこのスコープの外で行われるようになってもその値を失わないません。
とPHPマニュアルにあるように、変数のスコープが外れても値を保持してくれるということらしいので
サンプルコード
PHP
- <?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変数の挙動
でも書かれているように別オブジェクトであっても共有されるようだ。
PHP
- <?php
- 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変数の挙動のソースまんまだが確かに共有されている・・・
| 投稿日 |
2008年4月 3日 22:19 |
| カテゴリ |
PHP |
| タグ |
テストコード | 動作確認 |
| トラックバック URL |
http://www.kantenna.com/cgi-bin/mt504/mt-tb.cgi/1136 |