【プログラミング】オブジェクト指向についてまとめ〜静的メンバ・クラス定数・抽象クラス。インターフェイス・ポリモーフィズム〜

【プログラミング】オブジェクト指向についてまとめ〜静的メンバ・クラス定数・抽象クラス。インターフェイス・ポリモーフィズム〜

2020年5月28日
プログラミング

前回までにオブジェクト指向の基本的なことについてまとめました。
今回は、その続きになります。

静的メンバ

静的メンバとは、インスタンスを生成しなくてもアクセス可能なメンバのことです。…これだけだとなんのこっちゃ。意味がわからん。って感じですね。

通常クラスのプロパティやメソッドへのアクセスはインスタンスを生成をしないとアクセスできないようになっています。※プロパティやメソッドのことをマルッと「メンバ」と言います。

でも、いちいちインスタンスの生成をしていたらめんどくさいですよね。また、インスタンスを生成する時にはクラスを丸々コピーして使っているので、メモリの領域の確保が必要になります。=使うごとにどんどん重くなってしまうということです。

なので、いちいち生成せずとも静的メンバを使って効率的にクラスのメンバを使おう!というものです。
実際のコードは以下です。

  // 静的メンバの使い方

  // 定義方法
  public static プロパティ名
  public static function メソッド名

  // クラス外での呼び出し方法
  クラス名::$プロパティ名
  クラス名::メソッド名()

  // クラス内での呼び出し方法
  self::$プロパティ名
  self::メソッド名()
  // 履歴管理クラスを新たに作る
  class History{
    // staticがついているので静的メンバを定義している
    public static function set($str){
      // セッションhistoryが作られてなければ作る
      if(empty($_SESSION['history'])) $_SESSION['history'] = '';
      $_SESSION['history'] .= $str.'<br>';
    }
    public static function clear(){
      unset($_SESSION['history']);
    }
  }

  // 使用する時
  History::set('ゲームスタート!');

クラス定数

クラス定数とは、クラス内に定義する定数です。difineを使用した定数はグローバル定数と変わらないけれども、「そのクラスに属したプロパティの定数だ」という意味が伝わります。

主にクラス内の設定値に使用します。静的メンバと同じ扱いになります。

  // クラス定数の使い方

  // 定義方法
  const 定数名 = 値

  // クラス外での呼び出し方法
  クラス名::定数名

  // クラス内での呼び出し方法
  self::定数名
  // 性別クラスを新たに作る
  class Sex {
    const MAN = 1;
    const WOMAN = 2;
  }

  class Monster{ 
    
    protected $name; 
    protected $hp;
    protected $attack;

    // 中略〜〜〜〜〜

    public function seyCry(){
      switch ($this->sex){
        case Sex::MAN :
          History::set('ぐぉお!');
          break;
        case Sex::WOMAN :
          History::set('きゃっ!');
          break;
      }
    }
  }

  //インスタンス生成
  $monster[] = new Monster('スライム',Sex::MAN, 100,mt_rand(10,30));

抽象クラス

抽象クラスは直接インスタンスの生成できない、必ず継承して使用するクラスです。
クラスの大元になる(クラスで定義しているものをさらに共通化して抜き出した)クラス、という考え方をします。
抽象クラスには抽象メソッドが定義できます。抽象メソッドとは、処理内容を持たずに名前だけ定義されたメソッドです。
抽象メソッドは継承先のクラスで必ずオーバーライドしないとエラーになってしまうという特徴があります。

  // 抽象クラス
  abstract class クラス名{
    // アクセス権は必ずpublicになる
    abstract public function メソッド名(); 
  }

インターフェイス

インターフェイスとは、抽象メソッドのみ定義できるクラスです。
インターフェイスの特徴として以下の点が挙げられます。

  • 定義できるのは抽象メソッドのみ
  • 抽象メソッドだが、abstractは不要
  • アクセス装飾子はpublicしか使えない
  • 直接インスタンスの生成はできない
  • インターフェイスは多重継承ができる
interface クラス名{
    public function メソッド名();
}

class 継承クラス名 implements インターフェイス名1,インターフェイス名2...

ポリモーフィズム

ポリモーフィズムは直訳すると「多態性」という意味であり、異なる動作を同じ操作で実現することです。
PHPの場合、クラスは異なっても同じ名前のメソッドでいろんな動きを実現させることを言います。
ゲームで例えると、自分が操作するのは「ボタンを押す」だけで、キャラクターが攻撃したり防御したりできますよね。そういった「同じ動き」で「異なる動作」を実現させることをポリモーフィズムと言います。

コードはこちらのサイトの方がわかりやすかったので割愛します。
https://havelog.ayumusato.com/develop/php/e166-php-interface-abstract.html

これでざっくりとPHPのオブジェクト指向についてまとめられました。
概念なので理解するのはまだまだ難しいですが、基本的なことを押さえられたと思います。