【オブジェクト指向入門】インタフェース, 継承, トレイト

PHPでオブジェクト指向プログラミングする際の基本構文をまとめてます。インタフェース、継承、トレイトなど取り上げます。

メソッド呼出し、プロパティアクセス

メソッド呼出しとプロパティへのアクセスはアロー演算子(->)で行います。

class Animal {
  public $name;
   
  public function walk() {
   
  }
}
 
$animal = new Animal();
$animal->name = 'ぺぺ';  //プロパティアクセス
$animal->walk();         //メソッド呼出し

プロパティには、アクセス修飾子をつけることができます。

アクセス修飾子 概要
public 外側から呼び出し可能
private 自クラスのみ呼び出し可能
protected 自クラスと継承クラスのみ呼び出し可能

クラスプロパティ、クラスメソッド、クラス内の定数

クラスメソッド、クラスプロパティはstaticで定義します。
クラス内の定数はconstで定義します。

class Animal {
  const RED   = 0x01;
  const BLUE  = 0x02;
  const GREEN = 0x04;
  const PINK  = 0x08;
   
  public static $cnt = 0;
   
  public static function cntup() {
    self::$cnt++;    //selfは自分自身のクラスを指し示す。
  }
}
 
Animal::cntup();     //クラスメソッドを呼び出す
echo Animal::$cnt;   //クラスプロパティにアクセス
echo Animal::RED;    //クラス定数にアクセス

コンストラクタ、デストラクタ

newでオブジェクトを生成すると、自動的に__constructが実行されます。

class Animal {
  private $name;
   
  public function __construct($name){
    $this->name = $name;
  }
 
  public function __destruct(){
 
  }
}
 
$animal = new Animal('ペペ');

extends|継承(is-a関係)

class Animal {
  public $name;
   
  //finalをつけると継承された派生クラスでオーバライドできなくなる。
  public final function getName(){  
    return $this->name;
  }
}
 
class Dog extends Animal {
 
}

abstract|抽象クラス

abstract class Animal {
  abstract public function walk();
}
 
class Dog extends Animal {
  //abstractメソッドを実装しないとエラーとなる。
  public function walk() {
   
  }
}

interface|定義だけ記述

インタフェースには、定義だけ記述します。複数のインタフェースを実装できます。

interface a
{
    public function foo();
}
 
interface b
{
    public function bar();
}
 
class c implements a, b
{
    public function foo(){
     
    }
     
    public function bar(){
     
    }
}

トレイト

トレイトは、コードの再利用を高める仕組みです。

PHPの継承(extends)は、複数のクラスを継承(多重継承)できません。また、インタフェースは、メソッドの定義しかできず、ロジックを記述できません。

トレイトは、ロジックを記述できます。さらに、トレイトを利用するクラスは、複数のトレイトを取り込むことができます。

trait XXXX
{
    // メソッド
}
 
trait YYYY
{
    // メソッド
}
 
 
class ZZZZ
{
    use XXXX, YYYY;
 
    // メソッド
}

オーバーライドした場合、以下の優先順位で利用されます。

現在のクラス > trait > 継承元クラス

再利用を高めることはできますが、暗黙的な依存関係ができてしまい、コードの可読性が下がるとも言われています。