PHP8技術者認定上級試験合格体験記


先日、PHP技術者認定機構が実施しているPHP8技術者認定上級試験に、
1500満点の内1300点を取得して合格しました。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">PHP8上級/準上級試験合格！<br>PHP8技術者認定ウィザードをぎりぎり名乗れるようになりました<a href="https://twitter.com/hashtag/PHP%E8%A9%A6%E9%A8%93?src=hash&amp;ref_src=twsrc%5Etfw">#PHP試験</a> <a href="https://t.co/XWD7LiMSxA">pic.twitter.com/XWD7LiMSxA</a></p>&mdash; バキオ (@Bakio202076) <a href="https://twitter.com/Bakio202076/status/1774189945894457645?ref_src=twsrc%5Etfw">March 30, 2024</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


受験した経験を元に以下の点を記載していきます。
- 受験をした理由
- 学習方法
- 受験した感想

この記事の執筆時点では、
PHP8技術者認定上級試験の勉強方法に関する情報があまりなかったので、
受験を考えている人の参考になれば嬉しいです。



# PHP8技術者認定上級試験合格時の筆者のスペック
プログラマー歴約2年2ヶ月の29歳。
PHP歴も約2年2ヶ月。
実務で触ったことのあるPHPはPHP7.4のみ、PHP8以降は触ったことがない。

生のPHPはほぼ触ったことがなく、Laravelばっかり使っている。


# 受験をした理由

案件で触っているPHPのバージョンが7.4だったので、
いい加減PHP8以降のバージョンも触っておかないとやばいと思い、まずはPHP8以降のバージョンについて学習を始めました。
学習を始めたときには受験をしようとは思っておらず、特にゴールを決めずにPHP8について学習を始めました。

それで1ヶ月ほどPHP公式マニュアルを読んだり、PHP8技術者認定初級試験の教本でもある独習PHPを読んでみたりしたのですが、まあやる気にならないわけでして...

よく
「インプットはそこそこにして、アウトプットをすることが学習をするうえで大事」
と言われますが、本当にそのとおりだと思います。

そこでPHP8学習の最終的なアウトプットとして、
PHP8技術者認定上級試験を受験することを決意しました。


# 学習方法
多分2024年4月現在、この記事を読んでいただいている方の9割方が知りたいのはここではないでしょうか。

というのも今のところ
PHP8技術者認定上級試験の参考書、問題集、過去問といった類のものはありません。

なのでこの問題集をn周したら合格間違いなし！
といったものはないんですよね...
なので私自身学習方法は色々と試行錯誤をしましたので、
今後試験を受ける方の参考になれたら嬉しいです。


## 学習に使用したサイト、教本、アプリのURL
PHP公式マニュアル

https://www.php.net/

独習PHP

https://www.shoeisha.co.jp/book/detail/9784798168494

ChatGPT

https://chat.openai.com/

PRIME STUDY第1回 PHP 8 上級 模擬試験

https://study.prime-strategy.co.jp/study/ph8ex1/

PHP技術者認定機構ホームページ

https://www.phpexam.jp/summary/expert8

古庄親方の上級試験コラム

https://www.phpexam.jp/archives/category/column/oyakata


## 学習方法結論
- 学習時間は1日約2時間、土日のどちらかは約3時間、土日のどちらかはオフ
- PRIME STUDYが出題している模擬問題(以降模擬問題と記載)を最後まで解く
    - その中で間違えた問題、正解していても理解が浅いと思った分野はPHP公式マニュアルか独習PHPで理解を深める
    - 模擬問題の解説をChatGPTにしてもらう
- 古庄親方の上級試験コラムを、#1から#37まで実際にコードを書きながら読む
    - その際、模擬問題で間違えたところは特に重点的に読む
- PHP公式マニュアルを読む
    - その際はすべてのページを読むのではなく、PHP技術者認定機構のホームページに記載された出題範囲を確認して、出題に関係しそうな部分だけPHP公式マニュアルを読む
- 試験直前に最後の実力試しで模擬問題を解く



以降の章で詳しく解説していきます。


# 学習開始から2ヶ月間の学習方法
まず初めに、自分の現在の実力と問題の傾向を把握するために模擬問題を解きました。
上級合格には7割以上の正答率が必要なんですが、
この時点で正答率は3割以下、うーん厳しい。

模擬問題を解いたあとは、
2ヶ月間かけて模擬問題で間違えたところや、理解が浅いと感じたところをひたすらPHP公式マニュアル、
もしくは独習PHPで復習していきます。

私はその際基本的には独習PHPで復習し、
独習PHPに記載されていない範囲はPHP公式マニュアルを読んで復習しました。

独習PHPでの復習を優先した理由としては、
PHP公式マニュアルだと「コンテクスト」、「リテラル」といったあまり聞き慣れない言葉が多かったので、
独習PHPのほうが読みやすいと思い独習PHPでの復習を優先しました。

それに加えて、ChatGPTに模擬問題の解説をしてもらいました。
模擬問題には2024年4月現在問題と回答の解説がないので、
なぜこの回答が答えなのか理解できない問題がありました。
なのでChatGPTに以下のようなプロンプトを投げて解説をしてもらっていました。

```
以下の文章で間違えているところを教えて
「模擬問題の回答内容を記載」
```

最初はググって回答内容の理解をしようとしていたのですが、途中からは以下の流れでやっていました。

```
ChatGPTに回答の解説をしてもらう
↓
ChatGPTの解説が合っているかをググって調べる
```

ChatGPTはほぼ正確に解説をしてくれるのですが、
たまに間違えたこと言うので今のところは鵜呑みにしないほうがいいです。

といった感じで最初の2ヶ月間は模擬問題の内容を理解することに努めました。
個人的にはChatGPTに回答の解説をして貰う方法がかなり良かったと思っています。

例えば模擬問題には以下のような問題が出題されているのですが

### 問題文
以下選択肢から間違っている選択肢を選ぶこと
①
```php
$value = '外部からの入力値';
$header = "X-test: {$value}";
$result = mail(宛先, 件名, 本文, $header);
```
このコードを実行すると、メール文送られれる。
送られたメールのヘッダは以下のようになる。
X-test: 外部からの入力値

②③...省略

といった問題なんですが、①が間違えている選択肢です。

そしてこちらが回答です。
<details><summary>回答</summary>

外部からの入力値をそのままメールヘッダに設定しているのが間違い。
外部からの入力値をそのままメールヘッダに設定してしまうのは、攻撃者が不正なメールヘッダを挿入してしまう可能性があるため。
</details>


言われてみると確かにそうなんですけどね...
他にも解説なしだとなぜこの回答が答えなのかわからないところがあったので、
ChatGPTがなかったらもっと学習期間は伸びていたと思います。

# 3ヶ月目から受験までの学習方法
ここからはPHP公式マニュアルと、
PHP技術者認定機構で連載されているコラム「古庄親方の上級試験コラム」をメインに学習していきます。

まず古庄親方の上級試験コラムは、
私が受験した当時投稿されていた#1から#37全部の記事に目を通しました。

その中で理解が怪しいと思った部分は、実際にコードを書きながらコラムの記事を読んでいました。
逆に、理解ができていると思った部分は時間をかけずにサラッと読んでいました。


それからPHP公式マニュアルも読みこんでいきます。
ここで気をつけた点はPHP公式マニュアルを全ページ読もうとするのではなく、
PHP技術者認定ホームページに記載された試験範囲をメインに読むように気をつけました。

点を取るための勉強方法にはなってしまうのですが、
PHP公式マニュアルを全部読むとかなり時間がかかってしまうので私はこの方法を選択しました。

試験範囲というのはトップページの以下のあたりに記載されている内容ですね。
![スクリーンショット 2024-04-05 15.52.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693083/d23bb0db-7737-8c63-330b-558c3105c1f8.png)

どのようにPHP公式マニュアルを読んだかというと、
例えば出題範囲の「基本的な関数」は、PHP公式マニュアルをまったく読みませんでした。

一度は目を通した方が良いとは思うんですが、
記載量が多かったので試験範囲に記載された以下の言葉を信じて読みませんでした。

- 試験範囲の暗記は必要ない
- debug_backtrace(int \\$options = DEBUG_BACKTRACE_PROVIDE_OBJECT, int $limit = 0): arrayという記述をみて「関数名や、引数と戻り値の型や引数のデフォルト値」は理解できるように

> 暗記の必要はありませんが、以下の点に注意しながら学習しておくとよいでしょう。
出題範囲は「PHP コアに含まれる関数」が対象になります
「関数名」や「引数の一覧」「戻り値」などを暗記する必要はありませんが、マニュアルにある例えば
debug_backtrace(int \\$options = DEBUG_BACKTRACE_PROVIDE_OBJECT, int $limit = 0): array
という記述をみて「関数名や、引数と戻り値の型や引数のデフォルト値」は理解できるようにしておきましょう
数は多いですが、一度くらいは目を通しておくとよいでしょう
何個か、でもよいので、実際にミニマムコードなど書いて挙動の確認をしておくとよいでしょう

![スクリーンショット 2024-04-05 15.56.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693083/721bee33-7505-a52a-4711-f502d2cb239a.png)


ただし以下の記載をみて、「関数名」や「引数の一覧」「戻り値」を読み取れない人は、
PHP公式マニュアルを読んで、何個かはコードを実際に書いてみて、以下の記載の意味を理解できるようにしておいたほうが良いと思います。

```php
debug_backtrace(int $options = DEBUG_BACKTRACE_PROVIDE_OBJECT, int $limit = 0): array
```

逆に「セキュリティ」の範囲は、出題範囲に記載されたリンクと、
独習PHPに記載されている内容をすべて読みながら実際にコードを書いて学習しました。

セキュリティ面の知識が弱いと自分自身でも思っていましたし、
実際に模擬問題を解いたときもセキュリティ面の理解度が浅かったので、ここは重点的に読み込みました。


といった感じ学習を進めていき、
受験日直前にもう一度模擬問題を解いたところ、ケアレスミスを除けば満点を取れるようになっていました。

![スクリーンショット 2024-04-05 16.04.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693083/091ea1d3-fe17-468c-7625-e29c40c50c90.png)


結果は最初に書いたように1300/1500。
結果が出るまでは上級合格ぎりぎりかなーと思っていたので合格は嬉しかったです。



# 受験した感想
満足しています。

理由としては範囲が広い試験のためPHPの基礎的な知識だけではなく、
PHP7~PHP8のバージョン毎の変更点を学べたり、
例外の設計の仕方や、SQLインジェクションやクロスサイトスクリプティング（XSS）といった攻撃方法から、
どのようにPHPで対策をしていくのか。
といったことを学べたので満足しています。


ただ、私的には上級試験というには物足りない感じもしました。

PHPを使ったシステムの設計方法や、リーダブルなコードの書き方。
それから選択問題だけではなく、記述式の実際にプログラミングをおこなう問題。
このあたりを試験に取り入れたら上級試験らしくなりそうな感じがします。


# 最後に
PHP合格体験記に応募するとお礼の品(ペチゾーのぬいぐるみとか)がもらえるので、
アウトプットも兼ねて応募するといいかもしれません。

私はキングペチゾーを応募中です。
早く届かないかなー。

合格体験記応募方法
https://www.phpexam.jp/summary/goodphper

### 2024年12月追記
[トラブルがありましたが](https://x.com/Bakio202076/status/1848312654965969344)無事にキングペチゾーとペーパーウェイトが届きました！
ありがとうPHP技術者認定機構。

キングペチゾーにはラバーダッキングの相手になってもらおうと思います。

![GeU1_Gwa4AAzG8t.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/693083/24b30fbc-060a-06c7-e4d6-805cd35e5d89.jpeg)