PHPの変数スコープ


「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のほうが好みです。まあ、グローバル変数なるべく使わずにできればいいんですけどね。