[模擬問題] PHP8初級 – テキストと数の操作(エバンジェリスト三雲勇二からの出題)

PHP8初級試験が開始されました!

「PHP7初級試験」の模擬問題を公開してきましたが、これらの問題を「PHP8初級試験」向けにアレンジしました。
受験を考えているあなたも、試験を合格したあなたも、ぜひチャレンジしてみてください!

目次

問題

下のような変数が用意されています。

$a = 3;
$b = '7';
$c = '123456789';

次の選択肢のなかで、誤っているものはどれでしょう? (1つ選択)

  1. 文字列を変数に代入するには 記号や " 記号、 <<< 記号が使用できる
  2. 変数は頭に $ 記号をつけ、変数名には数字とハイフンとアルファベットは使用できる。変数名の注意点として、数字は1文字目に使用できないこと、アルファベットは大文字と小文字が区別される
  3. echo --$a,$a,$a++; の実行結果は 222 であり、 実行後の $a3 のままである
  4. $a.$b*$a'$a.$b*$a'"$a.$b*$a" の実行結果はすべて異なる
  5. $c の文字列の長さを数える場合は strlen() 関数を使い、1文字取り出すには substr() 関数を使う

解答と解説は下にスクロールしてください





























解答

正解は 2. です。

解説

1. 文字列を変数に代入するには 記号や " 記号、 <<< 記号が使用できる

選択肢のとおりです。

2.の選択肢でも軽く触れましたが、PHP で文字列 (文字列リテラル) を変数に代入するには下記の4パターンがあります。

  1. ' (シングルクォーテーション) で囲む :
    変数も演算子もそのまま文字列として扱われますので、そのまま表示されます。
    ただし2文字だけ \ (バックスラッシュ) でエスケープする必要がある例外があります。
    • 文字列としての ' (シングルクォーテーション) : \'
    • 文字列としての \ (バックスラッシュ) : \\

  2. (ダブルクォーテーション) で囲む :
    で囲まれた文字列は変数が展開されます。
    また、\n などの多数のエスケープ文字の展開を行ったうえで文字列にします。
    はそのまま表示されますのでエスケープする必要がありません。

  3. <<<終端ID (ヒアドキュメント) で複数行を囲む :
    複数行に渡り文字列としてそのまま表示したい場合に使われる機能です。
    こちらは " で囲んだ場合と同じく、変数の展開やエスケープ文字の展開を行います。
    終端IDの行までを文字列として認識されます。
    終端IDは任意に決めることができます。

    下記は終端IDに END を使用したヒアドキュメントの例です。 $a は展開されます。

    echo <<<END
    $a
    b
    c
    END;

  4. <<<'終端ID' (NowDoc) で複数行を囲む :
    ヒアドキュメントと同じく、複数行に渡り文字列としてそのまま表示したい場合に使われる機能です。
    ヒアドキュメントとの違いとして、こちらは ' で囲んだ場合と同じくそのままの文字列として表示されます。
    ヒアドキュメントと区別するため、終端IDを ' で囲む必要があります。

    下記は終端IDに END を使用した NowDoc の例です。 $a はそのまま文字列として扱われます。

    echo <<<‘END’
    $a
    b
    c
    END;

【試験合格後もステップアップ!】

ヒアドキュメントは <<<"終端ID" のように、NowDoc のような " ダブルクォーテーションで終端IDを囲む表記もあります。あまり使用されていない表記であり、ヒアドキュメント表記方法を2種類使い分ける必要もないので、特に理由がなければ使わないほうが良いです。

ヒアドキュメント / NowDoc 表記は PHP 7.3 でインデント対応などのうれしい改善がされています。今まで敬遠されていた方も、もう一度ドキュメントを確認してみてください。
https://www.php.net/language.types.string

2. 変数は頭に $ 記号をつけ、変数名には数字とハイフンとアルファベットは使用できる。変数名の注意点として、数字は1文字目に使用できないこと、アルファベットは大文字と小文字が区別される

変数名に使用できる文字は、数字、アンダースコア、アルファベットなどありますが、ハイフンは使用できません
また、変数名の1文字目に数字は使用できません。

変数名の主な注意点として、選択肢にもある通りです。

  • 数字は1文字目に使用できないため、 $1user というような変数名は使用できません。
  • アルファベットは大文字と小文字が区別されるため、 $abc$Abc は別の変数になります。
  • アンダースコア $a_b_c は変数名として使用できますが、 $a-b-c はハイフンが含まれるため変数名として使用できません。

【試験合格後もステップアップ!】

変数名に使用できる文字列には、実はひらがなやカタカナ、漢字が使えます。
$なまえ$ナマエ$名前 はすべて変数名として使用できます。
ただし、使用できるからといってもこのような変数名は推奨いたしません。
PHPの変数名に使える文字の中で、ASCII 文字コードの範囲内の数字 / アンダースコア / アルファベットのみで命名されることが無難です。

3. echo --$a,$a,$a++; の実行結果は 222 であり、 実行後の $a3 のままである

選択肢のとおりです。

  • ++ を加算器 (インクリメント) といい、変数の数値を +1 します。
  • -- を減算器 (デクリメント) といい、変数の数値を -1 します。

加算器および減算器は変数の前後に書くことができます。
記載する位置により変数へ反映されるタイミングが異なります。

  • 変数の前に書く (前置) と変数の数値を変化させたあとに変数の値を返します。
  • 変数の後に書く (後置) と変数を返した後に数値を変化させます。

上記の例では、各項目が次のように値が戻ります。

  1. --$a : 前置減算器です。 先に変数の値を -1 したあとで変数の値を返します。$a3 から 2 に変更され、変更後に変数の値が参照されるため 2 が返ります。

  2. $a : 単に変数を返します。上記の前置減算器で 2 に変更されているため 2 が返ります。

  3. $a++ : 後置加算器です。先に変数の値を返すため、現在の $a の値である 2 が返ります。その後に変数の値を +1 しますので、 $a3 に変更されます。

上記の流れにより、実行結果は上記の項目が続けて表示されるので 222 となります。
また、 $a は初期値が 3 であり、実行後に 3 になるので、結果として 3 のままとなります。

【試験合格後もステップアップ!】

インクリメント/デクリメントは正しく理解しないとバグになりやすい機能です。
特に前置と後置が同じコード内に記述されていると、一気にコードの可読性が下がり理解しづらくなります。
理解しやすさを優先し ++$a のような前置インクリメント/デクリメントは使わず、$a++ したあとで $a と呼び出すような後置インクリメント/デクリメントのコードに書き換えることもできます。
前置か後置のどちらかに統一することでコードが読みやすくなると思います。
チームで開発する場合は、後置インクリメント/デクリメントに統一するほうが初心者が理解しやすいかと思います。

PHP の機能をよく知っていてもあえて使わず、コードの可読性を優先するようなバランスを取ることもときには重要です。

4. $a.$b*$a'$a.$b*$a'"$a.$b*$a" の実行結果はすべて異なる

選択肢のとおりです。

実行結果は全て異なります。
この選択肢の重要なポイントは、すべての実行結果がイメージできていることです。

以下、実行結果を表示するコードです。

  • $a.$b*$a の実行結果:321
    演算子には優先順位が存在します。文字列演算子 . よりも算術演算子 * のほうが優先度が上になります。
    したがって、 $b*$a が先に計算され 21 の数値が返ります。このとき、文字列 $b は自動的に数値に変換され計算されます。
    最後に $a21 を文字列として結合するため 321 となります。

  • '$a.$b*$a' の実行結果:$a.$b*$a
    文字列 (文字列リテラル) を変数に代入する際に、シングルクォーテーション を使用することができます。
    で囲まれた文字列は変数も演算子もそのまま文字列として扱われますので、そのまま表示されます。

  • "$a.$b*$a" の実行結果:3.7*3
    文字列 (文字列リテラル) を変数に代入する際に、ダブルクォーテーション を使用することができます。
    で囲まれた文字列は変数や \n などのエスケープ文字の展開を行ったうえで文字列にします。
    今回の例では、 $a$b の変数が展開されて置き換わりますが、記号はそのまま表示されます。

【試験合格後もステップアップ!】

演算子の優先度は非常に重要です。
数学と同じく () 内を優先する、 +- よりも */ を優先するなどわかりやすいものもありますが、文字列演算子やビット演算子などその他の演算子との優先順位もわからないときには必ず確認しておく必要があります。

公式演算子の優先順位
https://www.php.net/manual/ja/language.operators.precedence.php

PHP 8.0 で文字列演算子 . の優先順位が算術加算演算子 + や算術減算演算子 - よりも低くなりました。
$a.$b+$a は、PHP 7.4 までは 40 ですが、PHP 8.0 以降は 310 となります。
PHP 7.4 以前でも PHP 8.0 以降でも同じ実行結果にするには ($a.$b)+$a と明示的にカッコで括る必要があります。
このように、文字列演算子と算術演算子など組み合わせる際に優先順位がわかりにくいものは、意識して () で括るようにしておいたほうがバグもなくコードもわかりやすくなります。

文字列と数値の演算を同時にすることはバグが発生しやすくなるので、変数の型を意識して明示的に型キャストした上でプログラミングすることをおすすめいたします。

5. $c の文字列の長さを数える場合は strlen() 関数を使い、1文字取り出すには substr() 関数を使う

選択肢のとおりです。

文字列の長さ (バイト数) を数えるには、 strlen() 関数を使用します。
文字数ではありませんので注意してください。
混同しやすい関数として count() 関数がありますが、こちらは主に配列やオブジェクトの要素を数えたりする関数です。

文字列から部分的な文字列を取り出すには、 substr() 関数を使用します。
引数 length1 を指定すると半角1文字を取り出すことができます。

【試験合格後もステップアップ!】

日本語を含む文字列の文字数を数えるには mb_strlen() 関数を、日本語を含む1文字を取り出すには mb_substr() 関数を使用します。
通常、日本語文字列に対しては mb_ で始まるマルチバイト文字列関数をよく使用するので、文字列関数を利用する際にはマルチバイト文字列関数を利用することをまず考慮に入れてください。

count() 関数のオブジェクトの要素を数えるという機能は、 Countable インターフェイスを実装したオブジェクトであることで、 Countable::count() の戻り値を利用するものとなります。

試験の情報

PHP8初級試験 の詳細およびキャンペーン情報はこちら
https://www.phpexam.jp/summary/novice8/

模擬問題作成及び解説

三雲 勇二
プライム・ストラテジー株式会社 所属。PHP 技術者認定機構で実施している試験 ( PHP8上級 / PHP5上級 / PHP7初級 / PHP5初級 / 徳丸実務 / 徳丸基礎 / KUSANAGI for WordPress ) 含め多数の試験に合格。ペチゾーをデスク周りにおいて日々お仕事しています。
Facebook: facebook.com/yuji.mikumo
Twitter: @maikeru

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

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