難易度は Level 1(やさしめ)〜Level 5(難関) の5段階です。
PHP8 技術者認定初級試験のサンプル問題(本番形式・解説付き)
PHP8 技術者認定初級試験(PHP技術者認定機構・PHP8技術者認定初級試験(PHP 8.0 準拠))の出題形式を、実際の問題で確かめられます。ここに掲載する5問は、無料の会員登録で解ける模試 第1回(40問)の冒頭から抜粋したオリジナル問題です。当サイトは全160問を本番CBT準拠の形式で収録しており、この5問はそのごく一部にあたります。
設問1
次のコードを実行した時の出力はどれか。 ```php $s = "a-b-c-d"; echo str_replace('-', '+', $s, $n), $n, ','; echo implode('|', explode('-', $s, 3)), ','; echo ucwords("hello big-world", '-'); ```
- a+b+c+d3,a|b|c|d,Hello big-World
- a+b+c+d3,a|b|c-d,Hello Big-World
- a+b+c+d1,a|b|c-d,Hello big-World
- a+b+c+d3,a|b|c-d,Hello big-World(正解)
解説
str_replace の第 4 引数には置換した回数が入り、- が 3 つなので 3 です。explode の第 3 引数 3 は分割の上限で、最後の要素に残りが丸ごと入って a、b、c-d の 3 つになり、a|b|c-d と出力されます。ucwords の第 2 引数は単語を区切る文字で、- だけを区切りにすると先頭の h と - の直後の w が大文字になり Hello big-World です。a|b|c|d は上限を無視してすべて分割した場合の出力です。Hello Big-World は区切りの指定を無視して空白でも区切った場合です。置換の回数が 1 になる出力は、置換した文字列の数を数えた場合ですが、数えるのは置換した箇所の数です。
設問2
次のコードを実行した時の出力はどれか。 ```php class Account { protected string $owner = 'sato'; } class Savings extends Account { public function owner(): string { return $this->owner; } } $s = new Savings(); echo $s->owner(), "\n"; try { echo $s->owner; } catch (Error $e) { echo get_class($e), ': ', $e->getMessage(), "\n"; } ```
- 1 行目は sato、2 行目は Error: Cannot access private property Account::$owner
- 1 行目は sato、2 行目は Warning: Undefined property: Savings::$owner
- 1 行目は sato、2 行目は sato
- 1 行目は sato、2 行目は Error: Cannot access protected property Savings::$owner(正解)
解説
protected のプロパティは、そのクラスと継承したクラスの内側からは使えますが、外側からは使えません。`owner()` は Savings のメソッドなので `$this->owner` が読めて、1 行目は sato です。クラスの外から `$s->owner` と書くと Error がスローされ、メッセージは `Cannot access protected property Savings::$owner` です(オブジェクトの実際のクラス名が入ります)。2 行目が sato になるのは public の場合、private という語が入るのは private のプロパティを外から読んだ場合です。Warning と Undefined property になるのは、親クラスの private プロパティを子クラスから読んだ時など、見えないプロパティを読んだ場合で、protected のプロパティを外から読んだ場合は Error になります。
設問3
PHP の変数名として、正しく書けるものを 2 つ選びなさい。
- `$cart total`
- `$_cart2`(正解)
- `$cart-total`
- `$Cart_Total`(正解)
- `$2nd_cart`
解説
変数名は `$` に続けて、英字かアンダースコアで始め、その後ろに英数字とアンダースコアを使います。`$_cart2` と `$Cart_Total` はこの規則に合っています。`$2nd_cart` は数字で始まっているので使えません。`$cart-total` のハイフンは引き算の演算子として解釈されます。`$cart total` は空白で名前が途切れてしまいます。なお、変数名は大文字と小文字を区別するので、`$cart_total` と `$Cart_Total` は別の変数です。
設問4
次のコードの出力はどれか。 ```php $x = "1"; switch ($x) { case 1: echo "A"; case 2: echo "B"; break; default: echo "C"; } ```
- C
- AB(正解)
- B
- A
解説
switch は == で比較するので、文字列の "1" と整数の 1 が等しいと判定され、case 1 から実行が始まります。case 1 には break が無いため、そのまま case 2 の echo へ進み、そこで break して抜けるので AB と出力されます。A だけになるのは case 1 の後で止まる場合で、break が無いので止まりません。C になるのは比較が厳密で一致しない場合ですが、switch の比較は厳密ではありません。B だけになるのは case 2 から始まる場合で、一致するのは case 1 です。
設問5
次のコードの出力はどれか。 ```php $d1 = new DateTime('2024-01-10'); $d2 = new DateTime('2024-03-05'); echo $d1->diff($d2)->format('%R%a日 %m月%d日'); ```
- +55日 2月5日
- +56日 1月25日
- -55日 1月24日
- +55日 1月24日(正解)
解説
`%R` は `$d2` が後の日付なので `+` になります。`%a` は 2 つの日付の総日数で、1 月 10 日から 3 月 5 日までは 2024 年の閏年を含めて 55 日です。`%m` と `%d` は暦に沿って月を繰り上げた差で、1 か月と 24 日になります。月どうし・日どうしを別々に引いた `2月5日` は、暦に沿った繰り上げをしていません。両端を含めて数えた 56 日は `%a` の値と合わず、`-` が付く肢は `$d2` の方が後の日付である点と合いません。
続きは、会員登録なしでそのまま50問解けます。採点と解説つきで、上と同じ本物の問題です。
登録なしで50問解く