【PHPデザインパターン】予備知識(アクセス権・抽象と実装・スコープ定義演算子・static宣言・コンストラクタ)


ゆるふわだった知識をまとめました。

デザインパターンは「振る舞いを保証する」という観点から、これらの特性がフル活用されています!

アクセス権

  • プロパティ、メソッド、定数に以下のキーワードをつけることにより設定できる。
  • 明示しない場合はpublicとなる。

php.net〜PHP: アクセス権

public

  • どこからでもアクセス可能。

protected

  • 定義したクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセス可能。

private

  • 定義したクラスからのみアクセス可能。

親クラスでprivate宣言したプロパティを継承先で使う場合

親クラスのメソッドを通じてプロパティのセットや呼び出しができます。

[PHP] そのプロパティ、privateに出来ませんか?~プロパティを private にする

抽象と実装

abstract

  • 継承(extends)が使われる。
  • 親クラスでabstractと宣言された全てのメソッド(抽象メソッド)は、継承クラスで定義しなければならない。
  • 親クラスで抽象メソッドを実装することはできない。(外観を定義するだけ。)
  • 親クラスの抽象メソッドで定義したアクセス権や引数は、継承クラスに影響を与える。

php.net〜クラスの抽象化

interface

  • imprements演算子を使って実装できる。(extendsで継承することもできるらしい・・・)
  • 実装したクラスでは、インターフェイスに含まれる全てのメソッドを実装する必要がある。
  • インターフェイス内では、メソッドの実装は全く定義されていない。
  • インターフェイス内で宣言される全てのメソッドは、publicでなければならない。
  • クラスは複数のインターフェイスを実装することができる。

php.net〜オブジェクト インターフェイス

extendsとimprementsは、同時に使用することもできます。

前回記事〜【PHPデザインパターン】03_Adapter~APIを変更する

DisplaySourceFileAdapter.php
class DisplaySourceFileAdapter extends MyShowFile implements DisplaySourceFile

スコープ定義演算子 (::)

  • クラス名::メソッド名やプロパティ名と明示することにより、メソッドやプロパティの属するスコープを定義することができる。
  • クラス名を直に指定することもできる。

php.net〜スコープ定義演算子 (::)
PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜

self

  • スコープは、selfが記載されたクラスに属する。(自分自身のクラスを意味する。)

parent

  • スコープは、parentが記載されたクラスの親クラスに属する。

static

スコープ定義演算子としてのstatic

  • 直近の非転送コールのクラス名を保存する。(??)
  • スコープは、実行時に最初にコールされたクラスに属する。
  • 親クラスでstatic::が使用されたメソッドを継承クラスでコールすると、そのスコープは継承クラスに属する。

公式サイトの例がわかりやすかったです。
selfと比較してみると良さそうです。

php.net〜遅延静的束縛 (Late Static Bindings)

staticキーワード

  • staticとして宣言することで、クラスのインスタンス化の必要なしにアクセスすることができる。

php.net〜static キーワード

staticなメソッド

  • オブジェクトのインスタンスを生成せずにコールすることができる。
  • インスタンス化されたクラスオブジェクトからアクセスすることができる。
  • static宣言したメソッドの中では、疑似変数$thisを使用することはできない。(selfキーワードを使用する。)

staticなプロパティ

  • インスタンス化されたクラスオブジェクトからアクセスすることができない。(矢印演算子(->)でアクセスすることができない。)

コンストラクタ

  • 新たにオブジェクトが生成される度にコールされるメソッド。
  • オブジェクトを使用する前に必要な初期化を行うことができる。
  • 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが暗黙の内にコールされることはない。(parent::__construct()を記述する必要がある。)
  • 子クラスでコンストラクタを定義していない場合は、親クラスのコンストラクタを継承する。
  • 親クラスのコンストラクタがprivate宣言されている場合は、子クラスでは使用できない。

php.net〜コンストラクタとデストラクタ