「PHP/入門/関数とは」の版間の差分

削除された内容 追加された内容
Ef3 (トーク | 投稿記録)
→‎無名関数: 関数の中で関数を定義してもクロージャーにはなりませんが、無名関数でクロージャーを実現できます。 PHPには、無名関数を定義する方法に、アロー関数と関数式の2つがあります。
タグ: 2017年版ソースエディター
Ef3 (トーク | 投稿記録)
→‎変数のスコープ: 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);
 
通常、グローバル変数を関数内で使用することはできない。
また、ローカル変数を関数外で使用することはできない。
 
特別な指定のない限り、グローバル変数とローカル変数はお互いに干渉しない。
 
このような、変数の使える範囲のことを、スコープ(Scope) と呼ぶ。
 
:<syntaxhighlight lang=php>
<?php
$i = 10;
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
print "グローバル変数{$i} <br>";
f();
 
function fg() {
global $i = 99;
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
$i = 99;
print "ローカル変数{$i} <br>";
}
 
g();
print "グローバル変数{$i} <br>";
 
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
?>
</syntaxhighlight>
 
function a() {
;実行結果
$i = &$GLOBALS['i'];
<pre>
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
グローバル変数10
$i = 42;
ローカル変数99
}
グローバル変数10
</pre>
 
a();
このとき、f() の中に、変数 $i があり、グローバルスコープにも、変数 $i がある。しかし、これらは別物である。
 
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
 
function r(&$i) {
しかし、下記のように global 宣言子を使うと、関数内からグローバル変数を書き換えることができる。
echo __FUNCTION__, ": \$i= {$i}", PHP_EOL;
 
$i = 4423;
;コード例
:<syntaxhighlight lang=php>
<?php
$i = 10;
print "グローバル変数{$i} <br>";
f();
 
function f() {
global $i ;
$i = 99; // 1行に global $i = 99; と まとめるとエラー
print "ローカル変数{$i} <br>";
}
 
r($i);
print "グローバル変数{$i} <br>";
 
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>になり失敗します。
;実行結果
<pre>
グローバル変数10
ローカル変数99
グローバル変数99
</pre>
 
=== static変数 ===
3行目のグローバル変数の値が 99 に置き換わっていることに注目してもらいたい。
関数の内側で作られた変数は関数を抜けると揮発します。
 
関数から抜けても、次回の呼び出しで値を保持してほしいときは、ローカル変数を static 宣言します。
 
;[https://paiza.io/projects/4e_Gl-me4bQZ_jNrTuKOLg?language=php 例]:<syntaxhighlight lang=php line highlight=5>
;その他
:<syntaxhighlight lang=php>
<?php
declare(strict_types=1);
$s = 99;
f();
 
function fsacc() : void {
globalstatic $si = 0;
echo __FUNCTION__, ': $i = $s *', $si, PHP_EOL;
$i++;
print "sの二乗は{$i}です。 <br>";
}
sacc();
sacc();
sacc();
sacc();
?>
</syntaxhighlight>
;実行結果:<syntaxhighlight lang=text>
 
sacc: $i = 0
;実行結果
sacc: $i = 1
sの二乗は9801です。
sacc: $i = 2
sacc: $i = 3
</syntaxhighlight>
 
{{コラム|関数内で関数を定義しても関数スコープにはならない|2=