「PHP/入門/関数とは」の版間の差分
削除された内容 追加された内容
→無名関数: 関数の中で関数を定義してもクロージャーにはなりませんが、無名関数でクロージャーを実現できます。 PHPには、無名関数を定義する方法に、アロー関数と関数式の2つがあります。 タグ: 2017年版ソースエディター |
→変数のスコープ: PHPでは、名前空間のトップレベルで代入された変数をグローバル変数と呼び、関数内で代入された変数をローカル変数と呼びます。 PHPに変数宣言はないので、最初の代入が宣言に準じた扱いになります。 関数内のローカル変数は(static 宣言されなければ)動的で、関数を抜けると揮発します。 関数の中から、グローバル変数を参照するには、3つの方法があります。 タグ: 2017年版ソースエディター |
||
195 行
=== 変数のスコープ ===
PHPでは、名前空間のトップレベルで代入された変数をグローバル変数と呼び、関数内で代入された変数をローカル変数と呼びます。
PHPに変数宣言はないので、最初の代入が宣言に準じた扱いになります。
関数内のローカル変数は(static 宣言されなければ)動的で、関数を抜けると揮発します。
関数の中から、グローバル変数を参照するには、3つの方法があります。
;[https://paiza.io/projects/3IGyl9K9PL34agBfFkXBjQ?language=php 例]:<syntaxhighlight lang=php line highlight="8,18,27,32">
<?php
declare(strict_types=1);
$i = 10;
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
function
global $i
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
$i = 99;
}
g();
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
function a() {
$i = &$GLOBALS['i'];
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
$i = 42;
}
a();
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
function r(&$i) {
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
$i = 4423;
}
r($i);
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
: $i= 10
g: $i= 10
: $i= 99
a: $i= 99
: $i= 42
r: $i= 42
: $i= 4423
</syntaxhighlight>
: __FUNCTION__ は、実行中の関数を文字列返すマジック定数です。
:: トップレベルでは、 ”” を返します。
:; <code>g()</code>:キーワード global で宣言されたグローバル変数は代入を含む参照ができます。
:; <code>a()</code>:<code>$GLOBALS</code>はグローバル変数を要素とするハッシュで、代入を含む参照ができます。
:; <code>r()</code>:<code>グローバル変数へのリファレンスを関数の引数として渡すと、リファレンス経由で代入を含む参照ができます。
3つ方法がありますが、どれも使わないと関数からのグローバル変数の参照は <code>PHP Warning: Undefined variable $eee</code>になり失敗します。
=== static変数 ===
関数の内側で作られた変数は関数を抜けると揮発します。
関数から抜けても、次回の呼び出しで値を保持してほしいときは、ローカル変数を static 宣言します。
;[https://paiza.io/projects/4e_Gl-me4bQZ_jNrTuKOLg?language=php 例]:<syntaxhighlight lang=php line highlight=5>
<?php
declare(strict_types=1);
function
echo __FUNCTION__, ': $i =
$i++;
}
sacc();
sacc();
sacc();
sacc();
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
sacc: $i = 0
sacc: $i = 1
sacc: $i = 2
sacc: $i = 3
</syntaxhighlight>
{{コラム|関数内で関数を定義しても関数スコープにはならない|2=
|