参考サイト
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準上級試験 出題範囲
- PHP基礎
- 変数とデータ型
- 制御構文
- 関数
- 名前空間
- オブジェクト指向
- クラスとオブジェクト
- 継承
- インターフェース
- トレイト
- データベース
- PDO基礎
- 基本的なSQL
- トランザクション
- セキュリティ
- XSS対策
- CSRF対策
- パスワード管理
- Web基礎
- HTTP基礎
- REST API
- JSON処理
PHP基礎
error_reporting()
関数
スクリプト実行中に発生するエラーや警告をどの程度表示・ログ出力するかを制御する仕組み
代表的なエラーレベル一覧
エラーレベル | 値 | 意味・概要 |
---|---|---|
E_ERROR | 1 | 致命的な実行時エラー。即座にスクリプトの実行が停止するようなエラー。 |
E_WARNING | 2 | 警告。スクリプトの実行は続行されるが、修正が必要な可能性がある状況。 |
E_PARSE | 4 | コンパイル時パースエラー(文法エラー)。通常はスクリプト自体が動かない。 |
E_NOTICE | 8 | 注意。不正確な使い方かもしれないが、致命的ではない場面で発生。 |
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
名前空間とは:
- ファイルやクラスを整理する仕組み
- フォルダ構造をプログラム上で表現する方法
「PHPMailer」の場合:
バックスラッシュ(\)の使用について
バックスラッシュを使う主なケース:
- PHPの標準クラスを使用する時(例:\DateTime)
- 違う名前空間のクラスを使用する時
- 現在の名前空間と異なる場所にあるクラスを指定する時
オブジェクト指向
インスタンスメソッド
$foo = new Foo(); // まずインスタンス生成
$result = $foo->myMethod(2, 3); // インスタンス経由で呼び出し
this
static
メソッド
「static
メソッド」は、インスタンスを生成せずに 呼び出せます。
クラス名::メソッド名(引数...) // で直接コール。
static メソッドはオブジェクトのインスタンスを生成せずにコールするため、疑似変数 $this は、 static として宣言されたメソッドの内部から利用することはできない。(問3)
self
self::は自クラスを表し、$thisは自身のオブジェクトを表す
self
とstatic
の違い:static
は、実行時のクラスコンテキストに基づいて参照されるため、継承されたクラスでも柔軟に対応できます。一方、self
は定義時のクラスを指すため、継承時の柔軟性がありません。
継承
parent::の目的
親クラスの機能を子クラスで「再利用」するためのキーワードです(親クラスのメソッドを子クラスでオーバーライド(再定義)した場合)
インターフェイス
トレイト
抽象メソッドとは
- abstractキーワードを使用して宣言
abstract class Animal {
// 抽象メソッド - 実装を持たない
abstract public function makeSound();
// 通常のメソッド - 実装を持つ
public function sleep() {
echo "Zzz...";
}
}
class Dog extends Animal {
// 抽象メソッドの実装が必須
public function makeSound() {
echo "Woof!";
}
}
アクセス修飾子
アクセス修飾子は、クラスのプロパティやメソッドの可視性(アクセス範囲)を制御するキーワードです。
宣言の前に使用します
アクセス修飾子を指定しない場合、 public
コンストラクタは「最初の設定をする特別な関数」
- 新しいものを作るときの「最初の設定」
- 必ず必要な情報を設定できる
- クラスから実体(インスタンス)を作る時に自動的に動く
子クラスで新しいコンストラクタを定義すると、親のコンストラクタは自動で呼ばれない 問4
子クラスで新しいコンストラクタを定義した場合コンストラクタを継承する場合でもparent::__construct()
の呼び出しが必要です。
デストラクタとは?
デストラクタは、オブジェクトが破棄(削除)される時に自動的に呼び出されるメソッドです。 PHPでは __destruct()
という名前で定義します。
クラス継承において親クラスのデストラクタは自動的に呼び出されます。問4
マジックメソッドとは
__call()
問4
特定の状況下で自動的に呼び出されます。マジックメソッドは、すべて名前が二重のアンダースコア(__
)で始まるのが特徴です。
メソッド名 | 役割 | 使用例・説明 |
---|---|---|
__construct() | クラスのインスタンスが生成される際に自動的に呼び出されるコンストラクタ。 | オブジェクトの初期化処理を行う。php<br>public function __construct($name) {<br> $this->name = $name;<br>} |
__destruct() | クラスのインスタンスが破棄される際に自動的に呼び出されるデストラクタ。 | リソースの解放や終了処理を行う。php<br>public function __destruct() {<br> echo "オブジェクトが破棄されました。";<br>} |
__get($property) | 存在しないプロパティにアクセスしようとしたときに呼び出される。 | 動的にプロパティを取得する。php<br>public function __get($name) {<br> return $this->data[$name] ?? null;<br>} |
__set($property, $value) | 存在しないプロパティに値を設定しようとしたときに呼び出される。 | 動的にプロパティを設定する。php<br>public function __set($name, $value) {<br> $this->data[$name] = $value;<br>} |
__call($method, $arguments) | 存在しないメソッドを呼び出そうとしたときに呼び出される。 | 動的にメソッドを処理する。php<br>public function __call($name, $args) {<br> echo "メソッド {$name} は存在しません。";<br>} |
__toString() | オブジェクトを文字列として扱おうとしたときに呼び出される。 | オブジェクトを文字列に変換する際の挙動を定義。php<br>public function __toString() {<br> return "オブジェクトの文字列表現";<br>} |
__invoke() | オブジェクトを関数として呼び出したときに呼び出される。 | オブジェクトを関数のように使用する。php<br>public function __invoke($x) {<br> return $x * 2;<br>} |
__clone() | オブジェクトがクローンされたときに呼び出される。 | クローン時のカスタム処理を実装。php<br>public function __clone() {<br> $this->property = "クローンされた値";<br>} |
__sleep() | serialize() 関数が呼び出されたときに呼び出される。 | オブジェクトのシリアライズ前に実行する処理を定義。php<br>public function __sleep() {<br> return ['property1', 'property2'];<br>} |
__wakeup() | unserialize() 関数が呼び出されたときに呼び出される。 | オブジェクトのアンシリアライズ後に実行する処理を定義。php<br>public function __wakeup() {<br> // 再接続などの処理<br>} |
__serialize() | PHP 7.4以降で serialize() が呼び出されたときに使用される。 | オブジェクトのシリアライズ方法をカスタマイズ。php<br>public function __serialize() {<br> return ['property1' => $this->prop1];<br>} |
__unserialize() | PHP 7.4以降で unserialize() が呼び出されたときに使用される。 | オブジェクトのアンシリアライズ方法をカスタマイズ。php<br>public function __unserialize($data) {<br> $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