【PHP】クラスのオーバーライドについて

【PHP】クラスのオーバーライドについて

目次

クラスのオーバーライドとは

PHPにおけるクラスのオーバーライド(Override)とは、親クラス(スーパークラス)のメソッドやプロパティを子クラス(サブクラス)で再定義することを指します。 これにより、継承したクラスの動作を変更したり、拡張したりできます。

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

PHPでは、子クラスで親クラスのメソッドを同じ名前で定義するとオーバーライドとなります。


class ParentClass {
    public function greet() {
        echo "こんにちは!";
    }
}

class ChildClass extends ParentClass {
    public function greet() {
        echo "おはようございます!";
    }
}

$obj = new ChildClass();
$obj->greet(); // 出力: おはようございます!

プロパティのオーバーライド

PHPではプロパティのオーバーライドも可能ですが、データ型やアクセス修飾子によっては警告が出ることがあります。


class ParentClass {
    public string $message = "親のメッセージ";
}

class ChildClass extends ParentClass {
    public string $message = "子のメッセージ";
}

$obj = new ChildClass();
echo $obj->message; // 出力: 子のメッセージ

コンストラクタのオーバーライド

コンストラクタもオーバーライドできます。子クラスでコンストラクタを再定義すると、親クラスのコンストラクタは呼ばれません。


class ParentClass {
    public function __construct() {
        echo "親クラスのコンストラクタ\n";
    }
}

class ChildClass extends ParentClass {
    public function __construct() {
        echo "子クラスのコンストラクタ\n";
    }
}

$obj = new ChildClass(); // 出力: 子クラスのコンストラクタ

parentキーワードの活用

子クラスから親クラスのメソッドを呼び出すには、parent:: を使用します。


class ParentClass {
    public function greet() {
        echo "こんにちは!";
    }
}

class ChildClass extends ParentClass {
    public function greet() {
        parent::greet();
        echo " おはようございます!";
    }
}

$obj = new ChildClass();
$obj->greet(); // 出力: こんにちは! おはようございます!

オーバーライドを禁止するfinalキーワード

final を使うと、オーバーライドを禁止できます。


class ParentClass {
    final public function greet() {
        echo "こんにちは!";
    }
}

class ChildClass extends ParentClass {
    // public function greet() { echo "おはようございます!"; } // エラー
}

抽象クラスとオーバーライド

抽象クラスでは、メソッドをオーバーライドすることが前提となっています。


abstract class ParentClass {
    abstract public function greet();
}

class ChildClass extends ParentClass {
    public function greet() {
        echo "おはようございます!";
    }
}

$obj = new ChildClass();
$obj->greet(); // 出力: おはようございます!

インターフェースとオーバーライド

インターフェースのメソッドも実装することでオーバーライドされます。


interface Greeting {
    public function greet();
}

class MyClass implements Greeting {
    public function greet() {
        echo "こんにちは!";
    }
}

$obj = new MyClass();
$obj->greet(); // 出力: こんにちは!

コメントを残す

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