[模擬問題] PHP8初級 – 関数(CTO古庄道明からの出題)

こんにちは。PHP技術者認定機構 CTOの古庄道明です。
今日もPHP8初級試験の模擬問題と解説を紹介します。
以下を解いて出題のイメージと知識を補っていただけると幸いです。

目次

問題

次のコードの実行結果として正しいものはどれか。

$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);

選択肢

選択肢1
【A】b 【B】c 【C】g 【D】e 【E】g

選択肢2
【A】b 【B】c 【C】b 【D】e 【E】f

選択肢3
【A】b 【B】c 【C】b 【D】e 【E】g

選択肢4
【A】b 【B】d 【C】g 【D】e 【E】f

選択肢5
【A】b 【B】d 【C】b 【D】e 【E】g

回答と解説

問題は「関数について」です。
https://www.php.net/manual/ja/language.functions.php
に一通り記載があるので、確認をしておくとよいでしょう。
また「変数のスコープ」についての知識も必要になります。
https://www.php.net/manual/ja/language.variables.scope.php
を併せて読んでおきましょう。

今回の設問はコードを実行順に読んでいくとよいので、ゆっくりコードを解読していきましょう。

まず
$val = 'a';
によって、変数 val に 文字列’a’が代入されます。
この変数は関数の外部で定義されているため、「グローバルスコープ」と呼称されます。

その次の行で
$val = 'b';
とあるので、変数 val は 文字列’b’に上書きされます。

この状態で
print ('【A】' . $val);
というコードになるので、出力は
【A】b
となります。

次は関数 func() の宣言です。関数本体の処理は、func() が呼び出されたときに確認することにしましょう。

続いて
$val = 'g';
となるので、変数 val は 文字列'g'に上書きされます。

その次に関数が呼び出されます。
func($val);
引数には 'g' を渡した状態であることを留意しながら、改めて関数を見ていきましょう。

関数の宣言は
function func($val = 'c') {
となっています。
上述の変数 $val と同じ名前ですが、こちらは関数のパラメータです。区別するため、以降は「パラメータval」と呼ぶことにしましょう。
パラメータを含め、関数の内部で使われる変数は「ローカルスコープ」に属します。

関数の宣言のうち
($val = 'c')
は「デフォルト引数値」「デフォルトのパラメータ値」などと呼称されます。
https://www.php.net/manual/ja/functions.arguments.php#functions.arguments.de
fault
引数が与えられない場合、パラメータval には ‘c’ が入りますが、今回は引数が与えられているので、パラメータval には 'g' が入っている状態になります。

直後に
$val = 'd';
とありますので、パラメータval には 'd' が上書きされます。

その状態で
print ('【B】' . $val);
というコードになるので、出力は
【B】d
となります。

続いて
global $val;
のコードです。
global $val; によって、ここ以降の関数内の $val は、グローバルスコープにある同名の変数 $val に結び付けられます。
言い方を変えると「今までの$val はローカルスコープの$valを使っていた」のが、この行以降「この関数の中の $val はグローバルスコープの$valを見る」ことになります。

次に
print ('【C】' . $val);
とあり、上述の通り、ここでの $val はグローバルスコープの変数valを参照しているため、'g'が入っているので
【C】g
となります。

$val = 'e';
のコードでは グローバルスコープの変数val に’e’が上書きされます。

その状態で
print ('【D】' . $val);
とあるので、
【D】e
となります。

関数の最後の行
$val = 'f';
によって、グローバルスコープの変数val に'f'が上書きされます。

関数から抜けて
print ('【E】' . $val);
が実行されます。
上述の通り グローバルスコープの変数val は最終的に 'f' が上書きされているので
【E】f
となります。

まとめると
【A】b
【B】d
【C】g
【D】e
【E】f
となり、合致するのは選択肢4であるため、正解は選択肢4となります。

PHP8初級試験と公式問題集に興味がある方は、以下のページをご覧のうえ、この機会に是非受験ください。

PHP8初級試験
https://www.phpexam.jp/summary/novice8

公式問題集:PHP8技術者認定初級試験公式問題集A
Kindle版 https://amzn.asia/d/1bS88y9
ペーパーバック版 https://amzn.asia/d/3P3Izeu

また、試験対策セミナーは毎月開催しています。興味がある方は以下のページをご覧いただき是非セミナーにもご参加ください。(フォローいただけるとセミナーのご案
内が届くようになります)

PHP技術者認定機構の公式Peatixグループ
https://peatix.com/group/43424

www.phpexam.jp

この記事が気に入ったら
いいね または フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次