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