🦝

作成中)PHPのオブジェクト指向プログラミングで利用する概念

2022/06/29に公開

PHPのオブジェクト指向プログラミングで利用する概念をまとめる。

インスタンス化されたときの初期化処理を行う:コンストラクタ

クラスがインスタンス化されるときに呼び出される。プロパティ値を初期化するために利用される。
引数を受け取ることができ、呼び出し側は定義された数の引数を渡さなければインスタンス化できない。呼び出し側がプロパティ値をセットし忘れてしまう心配が無くなる。

public function __construct(引数1, 引数2...)

クラス固有の定数を持たせる:オブジェクト定数

// オブジェクト定数を定義する(privateの場合)
private const [オブジェクト定数名] = [];

// 自クラスのオブジェクト定数にアクセスする
self::[オブジェクト定数名]

// 任意のクラスを参照するとき
[クラス名]::[オブジェクト定数名]

インスタンスの状態に左右されないメソッド:静的メソッド

インスタンスごとの状態(プロパティの値)に左右されず、引数の値に応じて一定の戻り値を返すメソッド。
インスタンスではなくクラスの持ち物として扱われるため、インスタンス化せずに呼び出す必要がある。(インスタンスメソッドは、インスタンスの持ち物として扱われるため、インスタンス化しなければ呼び出せない。インスタンスメソッドの戻り値はプロパティ値に左右されて変わるため)

// 静的メソッドを定義する(privateの場合)
private static funciton [メソッド名](引数1, 引数2...)

// 自クラスの静的メソッドをコールする
self::[静的メソッド名]

// 任意のクラスをコールするとき
[クラス名]::[静的メソッド名]

プログラム処理全体でクラスの1つの状態を共有する:静的プロパティ

プログラム全体でクラスの1つの状態(プロパティ値)を共有したい場合に使う。
クラスをインスタンス化せずに同じプロパティ値を共有できる。

// 静的プロパティを定義する(privateの場合)
private static [$静的プロパティ名];

// 自クラスの静的プロパティにアクセスする
self::[$静的プロパティ名]

// 任意のクラスにアクセスするとき
[クラス名]::[$静的プロパティ名]

静的メソッド・プロパティは自クラスのインスタンスメソッド・プロパティにアクセスできない

逆も然り。

抽象クラスと継承

2つ以上のクラスを同じ共通概念でまとめたいときに使う。
例:デジタル時計とアナログ時計は、同じ時計である。
「時計」という抽象クラス・メソッドを作成し、それをデジタル時計・アナログ時計に継承させる。
この場合に親クラスの「時計」をスーパークラス、子クラスのデジタル時計・アナログ時計をサブクラスと呼ぶ。

抽象クラス・メソッドを定義する:abstract

// 抽象クラスClock・メソッドshowを定義
abstract class Clock
{
	abstract public function show();
}

スーパークラスを継承する:extends

class DigitalClock extends Clock
{
}

なお、複数のスーパークラスを同時に継承する多重継承はPHPでは文法エラーとなる。複数の階層に分けて継承することは可能。

スーパークラスのメソッドを上書きする:オーバーライド

サブクラス特有の処理実装の際、スーパークラスが持つメソッドをサブクラスで上書き・拡張すること。

スーパークラスのメソッドを呼び出す:parent

オーバーライド前のメソッドを呼び出したいときに使う。

parent::[メソッド名](引数)

スーパークラスのコンストラクタを呼び出す

parent::__construct(引数)

継承またはオーバーライドをさせない:final

オーバーライドさせたくないメソッドを保護する。

final public finction show()
{
	// ここにメソッドを書く
}

インターフェースと実装:クラスのメソッド定義を約束させる

自転車と自動車は「走る」(というメソッド)は共通するが、内部の作りは全く違う。
このように、できること(メソッド・引数・戻り値)のみが同じで、中身が異なる2つ以上のクラスを統一的に扱うために使うのがインターフェース。

  1. インターフェースには抽象メソッドと定数しか定義できない。
  2. インターフェースにはpublicメソッドしか定義できない。
  3. 複数のインターフェースを同時に実装できる。

継承とインターフェースの違い

継承は、スーパークラスが持つ機能をサブクラスに拡張させる。
インターフェースは実装クラスに対してルールに従っていることを約束・担保させるために使う。インターフェースには処理を書くことができない。

インターフェースを使う場合は「継承」ではなく「実装」という表現を使う。

Discussion