generated at
PHPのlocal変数は、関数内global変数のようになる


PHPのscopeには3種類ある
local scopeはそのうちの1つ
要は普通にlocal変数なのだが、scopeが他の言語と異なる点が多くて非直感的である


tl;dr
local変数のscopeは、
block内ではなく、関数内でscopeになる
だから、関数内global変数、みたいになる



if文の中で宣言した変数に、block外からアクセスできる
php
if($b) { $hoge = 'Hello'; } echo $hoge; # 'Hello' または null ($bに依る)


これ入るんだ
php
function f() { if($a = 'hoge') { // } return $a; } echo f(); // "hoge"



try節内で宣言した変数に、catch節内とbloack外からアクセスできる
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変数
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);
これは、結果的に他の言語を書くときと頭の使い方は同じmrsekut



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