「2.3.3変数のスコープ」からメモ
ブロックスコープ
PHPにはブロックスコープは無いようです。
<?php for($i = 0; $i < 10; $i++){ $hoge = $i;} echo "\$hoge = $hoge\n"; ?>
$hoge = 9
for文内で生成された$hogeがブロックを抜けても使用可能なので、ブロックスコープが無いということです。
グローバルスコープ
トップレベルで宣言した変数はグローバルスコープとなりますが、関数内でその変数をしようするためにはglobalキーワードもしくは$GLOBALS[]を使用します。
<?php function myfunc() { global $count; $count++; #もしくは$GLOBALSを使う #$GLOBALS["count"]++; } $count = 0; echo "\$count = $count\n"; myfunc(); echo "\$count = $count\n"; ?>
$count = 0 $count = 1
スタティック変数
ローカルスコープ(関数内)の変数は通常、関数の呼び出しが終了すると解放されてしまいますが、staticキーワードを使用すると関数の呼び出しが終了しても解放されずに、永続します。
<?php function myfunc() { static $count = 0; $count++; echo "\$count = $count\n"; } myfunc(); myfunc(); ?>
$count = 1 $count = 2
bashだとすべてがグローバル変数となり、関数内でlocalキーワードを使ったときだけローカル変数になります。なのでPHPとは全く逆ですね。不要な変数へのアクセスを防げるので、PHPのほうが好みです。まあ、グローバル変数なるべく使わずにできればいいんですけどね。