第6章 ユーザー定義関数 / 第1回 模擬試験
PHPの関数引数に関する次の記述のうち、誤っているものはどれか。
引数は値渡しがデフォルトであり、関数内で引数の値を変更しても呼び出し元の変数は影響を受けない。
参照渡しを行うには、引数名の前に`&`を付ける。
PHP 8.0で導入された名前付き引数により、引数の順序を気にせず値を渡せる。
可変長引数は、他の引数より前(先頭)に定義することもできる。
正解
解説
可変長引数(`...$args`のように仮引数の前に`...`を付ける記法)を使うと、呼び出し時に渡された任意個数の引数がまとめて配列として関数内で受け取れます。
他の選択肢が誤りである理由は次の通りです。
・引数はデフォルトで値渡しであり、関数内でその値を変更しても呼び出し元の変数には影響しません。
・参照渡しにするには、仮引数名の前に`&`を付けます(`function foo(&$x)`)。
・PHP 8.0で導入された名前付き引数(`func(name: $value)`)を使うと、引数の定義順序を気にせず値を渡せます。
正解の選択肢自体が誤りである理由は次の通りです。
・可変長引数は、関数の引数リストの「最後」に1つだけ定義できるという制約があります。他の通常の引数より前(先頭)に置くことはできず、そのような定義はエラーになります。
例:
```
function sum($label, ...$nums) { // 可変長引数は最後
return "{$label}: " . array_sum($nums);
}
// function bad(...$nums, $label) {} // Fatal error: Only the last parameter can be variadic
```
(参照: 独習PHP 第4版 第6章 ユーザー定義関数 6.3.4節 可変長引数の関数 p.284〜285)
関連する問題
- 関数に関する次の記述のうち誤っているものはどれか。
- PHPの匿名関数とアロー関数に関する次の記述のうち、正しいものはどれか。
- 次のコードの実行結果として正しいものはどれか。 ```php $val = 'a'; $val = 'b'; print ('【A】' . $val); function func($val = 'c') { $val = 'd'; print ('【B】' . $val); global $val; print ('【C】' . $val); $val = 'e'; print ('【D】' . $val); $val = 'f'; } $val = 'g'; func($val); print ('【E】' . $val); ```
- PHPの変数のスコープに関する次の記述のうち、正しいものはどれか。
- PHPの関数の引数に関する次の記述のうち、正しいものはどれか。