【PHP】クラスの継承についてくわしく解説

【PHP】クラスの継承についてくわしく解説

目次

クラスの継承とは?

クラスの継承とは、あるクラス(親クラス)のプロパティやメソッドを別のクラス(子クラス)が引き継ぐ仕組みです。これにより、コードの再利用性を高め、オブジェクト指向プログラミングをより効率的に行うことができます。

基本的な継承の書き方

PHPでは extends キーワードを使ってクラスを継承できます。

class Animal {
    public function makeSound() {
        echo "何かの音を出します。\n";
    }
}

class Dog extends Animal {
    public function bark() {
        echo "ワンワン!\n";
    }
}

$dog = new Dog();
$dog->makeSound(); // "何かの音を出します。"
$dog->bark();      // "ワンワン!"

メソッドのオーバーライド

子クラスは親クラスのメソッドを上書き(オーバーライド)できます。

class Cat extends Animal {
    public function makeSound() {
        echo "ニャーニャー!\n";
    }
}

$cat = new Cat();
$cat->makeSound(); // "ニャーニャー!"

親クラスのメソッド・プロパティの利用

親クラスのメソッドを子クラスで利用するには parent:: を使います。

class Bird extends Animal {
    public function makeSound() {
        parent::makeSound();
        echo "チュンチュン!\n";
    }
}

$bird = new Bird();
$bird->makeSound();
// "何かの音を出します。"
// "チュンチュン!"

コンストラクタの継承

親クラスのコンストラクタを子クラスで使うには parent::__construct() を使います。

class Person {
    protected $name;
    
    public function __construct($name) {
        $this->name = $name;
    }

    public function introduce() {
        echo "私は{$this->name}です。\n";
    }
}

class Student extends Person {
    private $grade;
    
    public function __construct($name, $grade) {
        parent::__construct($name);
        $this->grade = $grade;
    }

    public function introduce() {
        parent::introduce();
        echo "学年は{$this->grade}です。\n";
    }
}

$student = new Student("太郎", 3);
$student->introduce();
// "私は太郎です。"
// "学年は3です。"

finalキーワードによる継承の制限

final を使うと、クラスやメソッドの継承を禁止できます。

final class Vehicle {
    public function move() {
        echo "移動します。\n";
    }
}

// 以下はエラー
// class Car extends Vehicle {}

class Base {
    final public function process() {
        echo "処理中...\n";
    }
}

class Derived extends Base {
    // 以下はエラー
    // public function process() {}
}

protectedとprivateの違い

protected は子クラスからアクセスできますが、private はできません。

class ParentClass {
    protected $data = "protected data";
    private $secret = "private data";
}

class ChildClass extends ParentClass {
    public function showData() {
        echo $this->data;  // OK
        // echo $this->secret; // エラー
    }
}

抽象クラス(abstract class)

抽象クラスは、インスタンス化できず、継承して使うクラスです。

abstract class Shape {
    abstract public function getArea();
}

class Square extends Shape {
    private $side;

    public function __construct($side) {
        $this->side = $side;
    }

    public function getArea() {
        return $this->side * $this->side;
    }
}

$square = new Square(4);
echo $square->getArea(); // 16

インターフェース(interface)

インターフェースは、クラスが実装すべきメソッドを定義します。

interface Logger {
    public function log($message);
}

class FileLogger implements Logger {
    public function log($message) {
        echo "Logging to file: $message\n";
    }
}

トレイト(trait)

PHPは多重継承ができませんが、trait を使ってコードを再利用できます。

trait LoggerTrait {
    public function log($message) {
        echo "[LOG] $message\n";
    }
}

class User {
    use LoggerTrait;
}

$user = new User();
$user->log("ユーザー作成");

多重継承を実現する方法

trait を使うことで多重継承のような動作を実現できます。

継承を活用した実用例

実際に継承を使うシナリオを紹介します。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です