https://www.php.net/manual/ja/language.oop5.basic.php
まずはPHP8初級試験でも出題されている範囲の、基本的な書式をおさらいしておきましょう。
クラスの基礎
クラスは、class
キーワードを使って定義します。
定義されたクラスは、new
キーワードによってオブジェクトを作成することができます。
また、new
のタイミングで動く「コンストラクタ」を定義する事ができます。
クラスには「定数」「変数(プロパティ)」「関数(メソッド)」を定義する事ができます。
定数、プロパティ、メソッドとも「アクセス権」を指定する事ができます。指定しない場合のデフォルトはすべて public
となります。
アクセス権
https://www.php.net/manual/ja/language.oop5.visibility.php
「定数」「変数(プロパティ)」「関数(メソッド)」ともに「アクセス権」を指定します アクセス権には private
、protected
、public
、があります。private
は「宣言されているクラスからのみアクセス可能」、protected
は「宣言されているクラス、またはその継承先のクラスからアクセス可能」、public
は「どこからでもアクセス可能」になります。
「定数」「変数(プロパティ)」「関数(メソッド)」
「定数」「変数(プロパティ)」「関数(メソッド)」の基本的な書き方を理解しておきましょう。
特に「メソッドの中で自オブジェクトのプロパティにアクセスをする時」は $this
を使うことを理解しておきましょう。
また、プロパティは「動的なプロパティ(存在しないプロパティに代入しようとすると、そのプロパティが動的に作成される)」についても理解しておきましょう。
ただし、PHP 8.2以降は「推奨されなくなる」ので注意が必要です(非推奨については試験範囲対象外)。
コンストラクタとデストラクタ
https://www.php.net/manual/ja/language.oop5.decon.php
コンストラクタとデストラクタの書き方、動くタイミングも理解しておきましょう。
継承とインタフェースと仮想化とトレイト
クラスは、継承してサブクラスを定義する事ができます。
また、「抽象化クラス(抽象化メソッド)」や「インタフェース」、コードを再利用する手段の1つとして「トレイト」があります。
継承、抽象化クラス、インタフェース、トレイトのそれぞれについて、基本的な書き方や使い方について理解しておきましょう。
クラスファイルの読み込みとオートローディング
クラスは「クラス定義毎に別々のPHPソースファイルに定義される」事が多く、require_once()
によってファイルを読み込みますが、オートローディングの仕組みによって「自動的に読み込む」事も可能です。require_once()
( とrequire()
、include()
、include_once()
)の挙動を理解しておきましょう。
また、オートローディングについては「spl_autoload_register()
関数で任意のオートローダを(複数)登録できる」事くらいは理解しておきましょう。
マジックメソッド
コンストラクタやデストラクタも実はそうなのですが、PHPには「マジックメソッド」というものがあります。
ここではいったん「オブジェクトに対してある操作をすると自動で動いてくれるメソッド」である、という程度に理解しておきましょう。
また、コンストラクタ(やデストラクタなど、マジックメソッド全般)はPHPでは「メソッド」の扱いであるため、(推奨されるかどうかはともかくとして)「メソッドとしてcallする事も可能である」事は理解しておきましょう。
名前空間
クラスとは厳密には「少し違う」ものですが、名前空間についても基本的な所は理解しておきましょう。
名前空間は「他の人や会社(サードパーティ)が作ったクラス等と自分が作ったクラス等で、名前を衝突しないようにする」ため、等に使われます。
基本的な「名前空間の定義の仕方」「名前空間の付いたクラスの使い方」について、理解しておきましょう。
staticキーワード
また、staticキーワードについても理解しておきましょう。
static プロパティはオブジェクトを生成せずに使います。「静的プロパティ」と呼ばれる事もあります。
static メソッドもオブジェクトを生成せずにコールすることができます。「静的メソッド」と呼ばれる事もあります。
どちらも「:: (スコープ定義演算子) を使ってコール/アクセスできます。
staticメソッドはオブジェクト演算子 (->) でもコールできますが、staticプロパティはオブジェクト演算子 (->) からはアクセスできません。
このコラムに関連するコードはこちらになります
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/018_1.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/018_2.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/018_3.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/018_3_TestClass.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/018_4.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/018_5_namespace.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/018_5_use.php
https://github.com/php-engineer-examination/php8_column_expert/blob/main/src/018_6.php