パーマリンク | 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変数の挙動のソースまんまだが確かに共有されている・・・
Copyright 2006-2008 KANTENNA.COM Reserved.