PHPのlocal変数は、関数内global変数のようになる
PHPのscopeには3種類ある
local scopeはそのうちの1つ
要は普通にlocal変数なのだが、scopeが他の言語と異なる点が多くて非直感的である
tl;dr
local変数のscopeは、
block内ではなく、関数内でscopeになる
だから、関数内global変数、みたいになる
if文の中で宣言した変数に、block外からアクセスできる
phpif($b) {
$hoge = 'Hello';
}
echo $hoge; # 'Hello' または null ($bに依る)
これ入るんだ
phpfunction f() {
if($a = 'hoge') {
//
}
return $a;
}
echo f(); // "hoge"
try節内で宣言した変数に、catch節内とbloack外からアクセスできる
phptry {
$a = "hoge";
throw new ErrorException('error');
} catch (\Exception $e) {
echo "in catch: ", $a, "\n"; // in catch: hoge
}
echo "in out: ", $a , "\n"; // in out: hoge
forのlocal変数
php$i = 10;
for ($i=1; $i<=3; $i++) {
println($i);
}
echo $i; // 4 (10ではなく)
for文でappendする時に、forの外でempty listとして定義しておく必要あるかどうか
forで回すarrayがemptyの場合、宣言してないとエラーになる
php$ds = []; // これが空のとき
foreach ($ds as $d) {
$arr[] = $d;
}
dump($arr); // errorになる
forで回すarrayが値が入っている時はいける
php$ds = [1, 2, 3]; // 値が入っていると
foreach ($ds as $d) {
$arr[] = $d;
}
dump($arr); // `[1,2,3]`と、想定通りの挙動になる
空かどうかは判断できないので、結果的に「宣言しておく書き方をしよう」になる
php $ds = [1, 2, 3];
$arr = []; // どちらにも対応できるように空配列を宣言しておく
foreach ($ds as $d) {
$arr[] = $d;
}
dump($arr);
これは、結果的に他の言語を書くときと頭の使い方は同じ

local変数に関してはガバガバなくせに、配列系関数のscopeは無駄に厳しい