【PHP】 様々な関数の宣言
PHPでの関数では、無名関数を用いて変数に入れる、アロー関数で1行だけですぐreturnするコードを省略して書けるなど、いくつか書き方があります。
引数のデフォルト値や可変長引数など、他言語でもよくある仕様も見ておきましょう。
関数の宣言
普通の関数
普通の関数を宣言する場合は、function 関数名(引数, 引数, ...) { 実行内容 }
のように書きます。
function outputArray($ary) { $s = implode(", ", $ary); print($s); return $s; } outputArray([1, 5, 3, 10, 51]);
1, 5, 3, 10, 51
アロー関数
もしプログラムの実行が1行で、かつその1行でreturn
する場合、省略した書き方が可能です。
fn (args) => 式;
と書きます。
$doubleInt = fn ($n) => $n * 2; // function ($n) { return $n * 2 } と同じ print($doubleInt(100));
200
関数のスコープ
名前付きのfunction
で宣言した関数はグローバルになります。しかし、if文などで宣言するかどうかを分けることも可能です。
$b = true; if ($b) { function doubleValue($n) { return $n * 2; } } doubleValue(100); // スコープは違うがOK
上の例で、もし$b
がfalse
だった場合は、doubleValue
関数は作成されません。その状態で呼び出そうとするとエラーとなるため、関数が生成されるか不明確な場合は注意が必要です。
巻き上げ
トップレベルで宣言した名前付きの関数は巻き上げが行われます。つまり、宣言より前に関数を使うことが可能です。
f("hogehoge"); // OK function f($v) { print($v); }
しかし、if文内など、トップレベル以外で宣言したものは、宣言後になるまで使用できません。
f("hogehoge"); // Fatal error: Uncaught Error: Call to undefined function f() if (true) { function f($v) { print($v); } }
f("hogehoge"); // ブロック内に関数があるが、必ず通るので例外的にOK { function f($v) { print($v); } }
include順や循環参照など、重要な場面に関わるので知っておきましょう。
関数のデフォルト値
関数の仮引数には、実引数が設定されなかった場合にどのような値をデフォルトで入れるかを指定できます。function f(arg = "hoge") {...}
のように、仮引数 = 値
を書きます。
ここで、デフォルト値を設定した引数のあとにデフォルト値がない引数を設定することはできません。
function f($a, $b, $c = 100, $d = 300) { print($a + $b + $c + $d); } // 3つ目の引数はデフォルト値を上書きする f(10, 50, 30); // 10 + 50 + 30 + 300 = 390
可変長引数
最後の引数に限り、任意の数の引数を受け取ることができます。
可変長引数は、関数側にはfunction (arg1, arg2, ...arg3)
のように...
をつけます。呼び出し側は今まで通り普通にカンマ区切りで値を並べるだけです。
関数側には、可変長引数の変数には配列で代入されます。
function myPrint(...$v) { foreach ($v as $key => $value) { print("$key: $value\n"); } } myPrint(10, 50, 30);
0: 10 1: 50 2: 30
名前のある関数の代入
他の言語では普通に関数名だけとすれば代入できますが、PHPでは文字列にして代入する必要があります。
function doubleInt($n) { return $n * 2; } $f = 'doubleInt'; // $f = doubleInt とすると、doubleIntが定数と勘違いされる $f(100); // 200
もちろん配列などにしても可能です。
function double($n) { return $n * 2; } function half($n) { return $n / 2; } $f = ['double', 'half']; $f[0](100); // 200 $f[1](100); // 50
無名関数
function (arg) {...}
のようにするか、アロー関数にすると、名前の無い関数を作成できます。作成した関数は変数や配列などに代入するか、実引数に入れるのが一般的です。
function f($cb) { $cb("hoge", "fuga"); } f(function ($a, $b) { print($a . $b); });
hogefuga
コールバックに関しては下の記事を参考にしてください。 (コードはJavascriptですが、原理は同じです。)
まとめ
PHPの関数は、他の言語とおおよそ同じような操作が可能です。無名関数を用いてコールバックを行うのはもちろん、クロージャなども問題ありません。
名前がついた関数本体を変数に代入するときだけ、文字列で代入する必要があることに注意が必要です。
