PHPでのオブジェクト指向

概要

  • 生成したインスタンスに後からプロパティやメソッドを追加できる。
  • メソッドを追加する場合、__set関数や__call関数やbindTo()関数を使う。
  • コンストラクタの名前は__constructで固定。
  • コンストラクタの省略記法がある。
    引数に型だけでなくアクセス修飾子をつければ良い。PHP8以降で有効。
  • デストラクタの名前は__destructで固定。アクセス修飾子は必ずpublicにしなければならない。リソースのほとんどがスクリプト終了のタイミングで自動的に破棄されるので、デストラクタを利用する場面は少ない。
  • 静的メソッドやプロパティやクラス定数は次の書式で利用する。
    「クラス名::静的メソッド・プロパティ・クラス定数」
  • 継承はextendsキーワードを使う。
  • オーバーライドの条件。
    1. メソッド名が一致していること。
    2. 仮引数の型は一致しているか、より広い型であること。個数は一致していること。
    3. 戻り値の型は一致しているかより狭い型であること。
    4. アクセス修飾子は一致しているか、より緩いこと。親がprotectなら子のpublicは可能。
    5. privateメソッドをサブクラスでオーバーライドすると、引数・戻り値の型などは一切チェックされない。
  • 親クラスのメソッドやコンストラクタは次の書式で利用する。
    「parent::メソッド名・コンストラクタ名」
  • オーバーライドの禁止はfinal修飾子。
  • 抽象メソッドの定義はabstractキーワードを使う。
    抽象メソッドを持つ抽象クラスは、クラス宣言箇所にもabstractキーワードが必要。
  • インターフェイスの宣言はinterfaceキーワードを利用し、
    クラスへ実装するにはimplementsキーワードを利用する。
    次の制限がある。
    1. 中身を持つメソッドやプロパティは定義できない。
      配置できるのは抽象メソッドと定数のみ。
    2. abstract修飾子は不要。(記載してはいけない)
    3. アクセス修飾子は指定できない。
  • オブジェクトの代入は既定では参照渡し。
  • オブジェクトを値渡ししたい時はclone関数を使う。使用例:$a = clone $b;
  • オブジェクトの比較演算子について
    == / 同じクラスのインスタンスで、同じプロパティと値を持つ場合にtrue。
    === / 同じクラスの同じインスタンスだった場合にtrue。

トレイト

概要

再利用可能なコード(メソッド・プロパティ)をまとめて切り出しておくための仕組み。
型を継承するインターフェイスと、実装を継承するトレイトの違いを認識して、
トレイトを使う際にはインターフェイスと併せて使用するのが作法としては良いらしい。

traitの宣言

trait トレイト名 {
	クラスと同様にプロパティやメソッドを記載。
}

traitブロック配下の構文について

ほぼクラスと同じだが、次の制約がある。

  • 定数は持てない(プロパティ、抽象・静的・インスタンスメソッドのみ可能)
  • クラスの継承、インターフェイスの実装はできない。
  • トレイト自体をインスタンス化することはできない。

traitの利用方法

クラスまたはトレイトの内部でuse文を利用する。
カンマ区切りで列挙することで、複数のトレイトをまとめて取り込むこともできる。

書式:use トレイト名;

名前が衝突した場合

次の優先順位となる。(トレイト同士で名前が衝突した場合はエラーとなる)

  1. 現在のクラスのメンバー
  2. トレイトのメンバー
  3. 親クラスのメンバー

次のように表記することで有効化するメンバを選択できる。
(これでMyTrait2の代わりにMyTrait1::hogeメソッドを利用しなさいという意味になる。)

class Myclass {
    use MyTrait1, MyTrait2 {
        MyTrait1::hoge insteadOf Mytrait2;
    }
}

次のようにメンバに別名を付与することで、名前が衝突する2つのメンバを利用できる。

class MyClass {
    use MyTrait1, MyTrait2 {
        MyTrait1::hoge insteadOf MyTrait2;    // as演算子を使う場合でも、insteadOf文を使わないと衝突が起こりエラーとなる。
        MyTrait2::hoge as foo;
    }
}

$cls = new MyClass();
$cls -> hoge();    // MyTrait1のhoge()が実行される。
$cls -> foo();     // MyTrait2のhoge()が実行される。  

名前空間

  • 名前空間を定義するには、namespace文を使う。
  • namespace文の前に、namespace文や<?php以外の行があってはいけない。
  • 名前空間とフォルダ構造を一致させておくと、オートローダーを実装しやすくなる。
  • バックスラッシュで始まる名前空間は完全修飾名となる。(絶対パスみたいなもの)
  • インポートする時にはuse文を使う。
  • インポート時のuse文はグローバルスコープ、またはnamespaceブロックの直下で呼び出す必要がある。
  • use文は現在のファイルでのみ認識される。呼び出し先には適用されない。
  • use const / use function 文を利用することで、定数や関数をインポートすることができる。
  • as句を付与することで別名をつけることができる。(名前衝突回避のために使う)

Tips

変数 instanceof 型名

変数に入っているインスタンスの型を確認する。

get_class($obj)関数

オブジェクトの元となるクラス名が返される。

get_parent_class($obj)

オブジェクトの元となるクラスの親クラス名が返される。

get_class_methods(クラス名)

指定したクラスのメソッドの一覧を返す。

get_class_vars(クラス名)

指定したクラスのプロパティの一覧を返す。

コメント

タイトルとURLをコピーしました