【PHPデザインパターン】予備知識(アクセス権・抽象と実装・スコープ定義演算子・static宣言・コンストラクタ)
ゆるふわだった知識をまとめました。
デザインパターンは「振る舞いを保証する」という観点から、これらの特性がフル活用されています!
アクセス権
- プロパティ、メソッド、定数に以下のキーワードをつけることにより設定できる。
- 明示しない場合は
public
となる。
public
- どこからでもアクセス可能。
protected
- 定義したクラス自身、そのクラスを継承したクラス、および親クラスからのみアクセス可能。
private
- 定義したクラスからのみアクセス可能。
親クラスでprivate宣言したプロパティを継承先で使う場合
public
となる。親クラスのメソッドを通じてプロパティのセットや呼び出しができます。
抽象と実装
abstract
-
継承(extends)
が使われる。
- 親クラスで
abstractと宣言された全てのメソッド(抽象メソッド)
は、継承クラスで定義しなければならない。
- 親クラスで抽象メソッドを実装することはできない。(外観を定義するだけ。)
- 親クラスの抽象メソッドで定義したアクセス権や引数は、継承クラスに影響を与える。
interface
-
imprements演算子
を使って実装できる。(extendsで継承することもできるらしい・・・)
- 実装したクラスでは、
インターフェイスに含まれる全てのメソッド
を実装する必要がある。
- インターフェイス内では、メソッドの実装は全く定義されていない。
- インターフェイス内で宣言される全てのメソッドは、
public
でなければならない。
- クラスは複数のインターフェイスを実装することができる。
継承(extends)
が使われる。abstractと宣言された全てのメソッド(抽象メソッド)
は、継承クラスで定義しなければならない。imprements演算子
を使って実装できる。(extendsで継承することもできるらしい・・・)インターフェイスに含まれる全てのメソッド
を実装する必要がある。public
でなければならない。extendsとimprementsは、同時に使用することもできます。
DisplaySourceFileAdapter.php
class DisplaySourceFileAdapter extends MyShowFile implements DisplaySourceFile
スコープ定義演算子 (::)
-
クラス名::メソッド名やプロパティ名
と明示することにより、メソッドやプロパティの属するスコープを定義することができる。
- クラス名を直に指定することもできる。
php.net〜スコープ定義演算子 (::)
PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜
self
- スコープは、selfが記載されたクラスに属する。(自分自身のクラスを意味する。)
parent
- スコープは、parentが記載されたクラスの親クラスに属する。
static
スコープ定義演算子としてのstatic
- 直近の
非転送コール
のクラス名を保存する。(??)
- スコープは、実行時に最初にコールされたクラスに属する。
- 親クラスで
static::
が使用されたメソッドを継承クラスでコールすると、そのスコープは継承クラスに属する。
クラス名::メソッド名やプロパティ名
と明示することにより、メソッドやプロパティの属するスコープを定義することができる。php.net〜スコープ定義演算子 (::)
PHPを愛する試み 〜self:: parent:: static:: および遅延静的束縛〜
非転送コール
のクラス名を保存する。(??)static::
が使用されたメソッドを継承クラスでコールすると、そのスコープは継承クラスに属する。公式サイトの例がわかりやすかったです。
selfと比較してみると良さそうです。
staticキーワード
- staticとして宣言することで、クラスのインスタンス化の必要なしにアクセスすることができる。
staticなメソッド
- オブジェクトのインスタンスを生成せずにコールすることができる。
- インスタンス化されたクラスオブジェクトからアクセスすることができる。
- static宣言したメソッドの中では、疑似変数
$this
を使用することはできない。(selfキーワードを使用する。)
staticなプロパティ
- インスタンス化されたクラスオブジェクトからアクセスすることができない。(矢印演算子(->)でアクセスすることができない。)
コンストラクタ
- 新たにオブジェクトが生成される度にコールされるメソッド。
- オブジェクトを使用する前に必要な
初期化
を行うことができる。
- 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが暗黙の内にコールされることはない。(
parent::__construct()
を記述する必要がある。)
- 子クラスでコンストラクタを定義していない場合は、親クラスのコンストラクタを継承する。
- 親クラスのコンストラクタが
private宣言
されている場合は、子クラスでは使用できない。
$this
を使用することはできない。(selfキーワードを使用する。)- 新たにオブジェクトが生成される度にコールされるメソッド。
- オブジェクトを使用する前に必要な
初期化
を行うことができる。 - 子クラスがコンストラクタを有している場合、親クラスのコンストラクタが暗黙の内にコールされることはない。(
parent::__construct()
を記述する必要がある。) - 子クラスでコンストラクタを定義していない場合は、親クラスのコンストラクタを継承する。
- 親クラスのコンストラクタが
private宣言
されている場合は、子クラスでは使用できない。
Author And Source
この問題について(【PHPデザインパターン】予備知識(アクセス権・抽象と実装・スコープ定義演算子・static宣言・コンストラクタ)), 我々は、より多くの情報をここで見つけました https://qiita.com/yukibe/items/24f9f14f324085aac5b1著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .