• PHP
PHP8準上級試験 攻略ガイド 模擬問題解説

参考サイト

PHP8上級/準上級試験
https://www.phpexam.jp/summary/expert8

Python試験とPHP試験の無料模擬試験サイト
https://study.prime-strategy.co.jp

PHP8技術者認定上級試験合格体験記
https://qiita.com/Bakio202076/items/bb930d93847b06044e6a

プログラミング初心者のPHP修羅の道#4〜PHP8上級問題を徹底追求する〜
https://hiro-hobbyblog.com/%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E5%88%9D%E5%BF%83%E8%80%85%E3%81%AEphp%E4%BF%AE%E7%BE%85%E3%81%AE%E9%81%93%EF%BC%834%E3%80%9Cphp8%E4%B8%8A%E7%B4%9A%E5%95%8F%E9%A1%8C/#google_vignette

試験概要

準上級試験は、PHPの基本的な知識と実践的なスキルを証明する資格です。上級との主な違いは、出題範囲の深さと合格ラインにあります。

上級との比較:

  • 準上級:合格ライン65%以上、基本的な実装力
  • 上級:合格ライン70%以上、応用的な設計力


項目準上級上級
合格ライン65%以上70%以上
出題レベル基本的な実装力応用的な設計力
設計スキル基本的なOOP設計デザインパターン
セキュリティ基本的な対策高度な脆弱性対策
データベース基本的なSQL操作パフォーマンスチューニング

基本情報

  • 試験時間:90分
  • 問題数:75問
  • 形式:マークシート
  • 受験料:15,000円(税込)

学習範囲

PHP8準上級試験 出題範囲

  1. PHP基礎
    • 変数とデータ型
    • 制御構文
    • 関数
    • 名前空間
  2. オブジェクト指向
    • クラスとオブジェクト
    • 継承
    • インターフェース
    • トレイト
  3. データベース
    • PDO基礎
    • 基本的なSQL
    • トランザクション
  4. セキュリティ
    • XSS対策
    • CSRF対策
    • パスワード管理
  5. Web基礎
    • HTTP基礎
    • REST API
    • JSON処理

PHP基礎

error_reporting() 関数

スクリプト実行中に発生するエラーや警告をどの程度表示・ログ出力するかを制御する仕組み

代表的なエラーレベル一覧

エラーレベル意味・概要
E_ERROR1致命的な実行時エラー。即座にスクリプトの実行が停止するようなエラー。
E_WARNING2警告。スクリプトの実行は続行されるが、修正が必要な可能性がある状況。
E_PARSE4コンパイル時パースエラー(文法エラー)。通常はスクリプト自体が動かない。
E_NOTICE8注意。不正確な使い方かもしれないが、致命的ではない場面で発生。
E_ALL~0すべてのエラー・警告・通知を含む。(バージョンにより値は微妙に異なる)

PHP のバージョンが上がるにつれて、新しいエラーレベルが追加・変更される場合があります

PHP の「代表的なデータ型」

bool型(論理型)true(真) または false(偽) の 2つしか値を持たない、論理値 を表す型
string型(文字列型)「文字列」
array型(配列型)複数の値1つの変数 でまとめて扱う型です。
PHP では「連想配列」も同じ array 型で扱います。
object型(オブジェクト型)
null型変数が「値を持っていない状態」を表す特殊な型です。s
resource型PHP で ファイル操作データベース接続画像処理 などを行うときに使われる「外部リソース」を示す型。
callable型関数として呼び出せるもの」を表す型です。

float型 問2

PHP には単精度型がなく、「float」という名前で倍精度に相当する 1 種類の浮動小数点数型が存在しています。(「float / double」“単精度 / 倍精度”という 2 種類の浮動小数点数型が多言語では一般的)

名前区間 問3

名前空間とは:

  1. ファイルやクラスを整理する仕組み
  2. フォルダ構造をプログラム上で表現する方法

「PHPMailer」の場合:

実際のファイル構造 📁 phpmailer/ └📁 phpmailer/ ├📄 PHPMailer ├📄 SMTP └📄 Exception 名前空間での表現 PHPMailer\PHPMailer\ ├ PHPMailer ├ SMTP └ Exception

バックスラッシュ(\)の使用について

バックスラッシュを使う主なケース:

  1. PHPの標準クラスを使用する時(例:\DateTime)
  2. 違う名前空間のクラスを使用する時
  3. 現在の名前空間と異なる場所にあるクラスを指定する時

オブジェクト指向

インスタンスメソッド

$foo = new Foo();           // まずインスタンス生成
$result = $foo->myMethod(2, 3);  // インスタンス経由で呼び出し
class Car $color $speed drive() new Car() Instance $color = “red” $speed = 0 drive()

this

Instance ($car) function drive() { $this->speed = 60; $this->color = “red”; } $this

static メソッド

static メソッド」は、インスタンスを生成せずに 呼び出せます。

クラス名::メソッド名(引数...) // で直接コール。
class Car static function getInfo() { // $this は使用不可 ❌ return self::$info; } インスタンス化せずに使用するため、 $thisは存在しません

static メソッドはオブジェクトのインスタンスを生成せずにコールするため、疑似変数 $this は、 static として宣言されたメソッドの内部から利用することはできない。(問3)

self

self::は自クラスを表し、$thisは自身のオブジェクトを表す

selfstaticの違い:
staticは、実行時のクラスコンテキストに基づいて参照されるため、継承されたクラスでも柔軟に対応できます。一方、selfは定義時のクラスを指すため、継承時の柔軟性がありません。

継承

parent::の目的

親クラスの機能を子クラスで「再利用」するためのキーワードです(親クラスのメソッドを子クラスでオーバーライド(再定義)した場合)

親クラス Animal eat() { … } 子クラス Dog parent::eat()

インターフェイス

トレイト

抽象メソッドとは

  • abstractキーワードを使用して宣言

abstract class Animal {
    // 抽象メソッド - 実装を持たない
    abstract public function makeSound();
    
    // 通常のメソッド - 実装を持つ
    public function sleep() {
        echo "Zzz...";
    }
}

class Dog extends Animal {
    // 抽象メソッドの実装が必須
    public function makeSound() {
        echo "Woof!";
    }
}
abstract class Animal abstract makeSound() sleep() { echo “Zzz…” } extends class Dog makeSound() { echo “Woof!” } 抽象クラス: ・抽象メソッドを含むことができる ・インスタンス化できない ・通常メソッドも持てる 継承クラス: ・抽象メソッドの実装が必須 ・インスタンス化可能

アクセス修飾子

アクセス修飾子は、クラスのプロパティやメソッドの可視性(アクセス範囲)を制御するキーワードです。

宣言の前に使用します

アクセス修飾子を指定しない場合、 public

アクセス修飾子の種類と範囲 public どこからでもアクセス可能(クラスの外部からも) protected 自分のクラスと継承したクラスからのみアクセス可能 private 自分のクラスの中でのみアクセス可能

コンストラクタは「最初の設定をする特別な関数」

  • 新しいものを作るときの「最初の設定」
  • 必ず必要な情報を設定できる
  • クラスから実体(インスタンス)を作る時に自動的に動く
クラス User 定義 コンストラクタ定義 必須パラメータ: name, age オブジェクト生成 new User(“John”, 25) 定義された必須パラメータを渡す コンストラクタ実行 自動的に__constructが実行 渡されたパラメータで値を設定 class User { function __construct($name, $age) { // ここで必須パラメータを定義 }

子クラスで新しいコンストラクタを定義すると、親のコンストラクタは自動で呼ばれない 問4

子クラスで新しいコンストラクタを定義した場合コンストラクタを継承する場合でもparent::__construct()の呼び出しが必要です。

親クラス User function __construct($name) { $this->name = $name; } 子クラス BasicUser // コンストラクタなし 自動呼び出し ✓ 子クラス AdminUser function __construct($name, $role){} 自動呼び出しなし ✗ $basic = new BasicUser(“John”); // 親のコンストラクタが自動実行 $admin = new AdminUser(“John”, “admin”); // 要parent::__construct()

デストラクタとは?

デストラクタは、オブジェクトが破棄(削除)される時に自動的に呼び出されるメソッドです。 PHPでは __destruct() という名前で定義します。

クラス継承において親クラスのデストラクタは自動的に呼び出されます。問4

クラスの継承とメソッドの呼び出し順序 親クラス (Parent) • __construct() • __destruct() 子クラス (Child) • __construct() • __destruct() コンストラクタ: 明示的な呼び出しが必要 デストラクタ: 自動的に呼び出される デストラクタの実行順序:子クラス → 親クラス

マジックメソッドとは

__call() 問4

特定の状況下で自動的に呼び出されます。マジックメソッドは、すべて名前が二重のアンダースコア__)で始まるのが特徴です。

メソッド名役割使用例・説明
__construct()クラスのインスタンスが生成される際に自動的に呼び出されるコンストラクタ。オブジェクトの初期化処理を行う。
php<br>public function __construct($name) {<br> &nbsp;&nbsp;$this->name = $name;<br>}
__destruct()クラスのインスタンスが破棄される際に自動的に呼び出されるデストラクタ。リソースの解放や終了処理を行う。
php<br>public function __destruct() {<br> &nbsp;&nbsp;echo "オブジェクトが破棄されました。";<br>}
__get($property)存在しないプロパティにアクセスしようとしたときに呼び出される。動的にプロパティを取得する。
php<br>public function __get($name) {<br> &nbsp;&nbsp;return $this->data[$name] ?? null;<br>}
__set($property, $value)存在しないプロパティに値を設定しようとしたときに呼び出される。動的にプロパティを設定する。
php<br>public function __set($name, $value) {<br> &nbsp;&nbsp;$this->data[$name] = $value;<br>}
__call($method, $arguments)存在しないメソッドを呼び出そうとしたときに呼び出される。動的にメソッドを処理する。
php<br>public function __call($name, $args) {<br> &nbsp;&nbsp;echo "メソッド {$name} は存在しません。";<br>}
__toString()オブジェクトを文字列として扱おうとしたときに呼び出される。オブジェクトを文字列に変換する際の挙動を定義。
php<br>public function __toString() {<br> &nbsp;&nbsp;return "オブジェクトの文字列表現";<br>}
__invoke()オブジェクトを関数として呼び出したときに呼び出される。オブジェクトを関数のように使用する。
php<br>public function __invoke($x) {<br> &nbsp;&nbsp;return $x * 2;<br>}
__clone()オブジェクトがクローンされたときに呼び出される。クローン時のカスタム処理を実装。
php<br>public function __clone() {<br> &nbsp;&nbsp;$this->property = "クローンされた値";<br>}
__sleep()serialize() 関数が呼び出されたときに呼び出される。オブジェクトのシリアライズ前に実行する処理を定義。
php<br>public function __sleep() {<br> &nbsp;&nbsp;return ['property1', 'property2'];<br>}
__wakeup()unserialize() 関数が呼び出されたときに呼び出される。オブジェクトのアンシリアライズ後に実行する処理を定義。
php<br>public function __wakeup() {<br> &nbsp;&nbsp;// 再接続などの処理<br>}
__serialize()PHP 7.4以降で serialize() が呼び出されたときに使用される。オブジェクトのシリアライズ方法をカスタマイズ。
php<br>public function __serialize() {<br> &nbsp;&nbsp;return ['property1' => $this->prop1];<br>}
__unserialize()PHP 7.4以降で unserialize() が呼び出されたときに使用される。オブジェクトのアンシリアライズ方法をカスタマイズ。
php<br>public function __unserialize($data) {<br> &nbsp;&nbsp;$this->prop1 = $data['property1'];<br>}

クラスの中で定義して使用します。存在しないメソッドや、アクセスできないメソッドが呼び出された時に自動的に実行されるメソッドです。

class Person {
    public function __call($method, $arguments) {
        echo "存在しないメソッド「{$method}」が呼ばれました!\n";
        echo "渡された引数: " . implode(', ', $arguments) . "\n";
    }
}

$person = new Person();
$person->someUndefinedMethod("さいとう", 25);  // 明らかに定義されていないメソッド名

// 出力:
// 存在しないメソッド「someUndefinedMethod」が呼ばれました!
// 渡された引数: さいとう, 25
class Person { public function __call($method, $arguments) { … } } 未定義メソッドの呼び出し __call()が自動実行 1. 定義されていないメソッドが呼ばれると… 2. 自動的に__call()マジックメソッドが実行されます

__invoke() 問5

class Hoge {
    public function __invoke() {
        var_dump($this);  // このオブジェクトの状態を出力
        return 'string';
    }
}

// 1. オブジェクトの作成
$obj = new Hoge();
// この時点でのオブジェクトの状態:
// - Hogeクラスのインスタンス
// - プロパティは0個(空)
// - __invoke()メソッドを持っている

// 2. オブジェクトを関数として呼び出し
$r = $obj();
// ここで何が起きているか:
// - $objを関数として呼び出す($obj())
// - 自動的に__invoke()メソッドが実行される
// - var_dump($this)が実行され、オブジェクトの状態が表示される
// - 'string'が返され、$rに代入される

// 3. 結果の出力
var_dump($r);
// $rには'string'が格納されている

オーバーロードとは