第6章 ユーザー定義関数 / 第1回 模擬試験
次のコードの実行結果として正しいものはどれか。 ```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); ```
【A】b 【B】c 【C】g 【D】e 【E】g
【A】b 【B】c 【C】b 【D】e 【E】f
【A】b 【B】c 【C】b 【D】e 【E】g
【A】b 【B】d 【C】g 【D】e 【E】f
正解
解説
グローバル変数とローカル変数のスコープの問題です。関数内の`$val`は引数として受け取ったローカル変数であり、関数外の`$val`とは別物。基本的に引数は値渡しのため、関数内で変更しても呼び出し元の変数は影響を受けません。しかし、`global`を使った場合は以降が参照渡しとなるため、この選択肢が正解。
(参照: 独習PHP 第4版 第6章 関数 6.3節 引数の渡し方(値渡し・参照渡し))