【PHP】クラスの継承とfinalキーワード、abstractキーワードの使い方、またstaticとselfとparentの違い

PHP

PHPのクラスの継承を紹介します。
クラスの継承を行うことで、よりコードの再利用性を高めることができます。
finalキーワード、abstractキーワードの使い方、またstaticとselfとparentの違いを紹介します。

クラス継承

<?php
// 元となるクラス
class Animal
{
    // protectedはAnimalクラスかAnimalクラスを継承したクラスからアクセスできる
    protected $name;
    public $age;
    public const LIKE = 'Eating';

    function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }

    function hello() {
        echo 'hello, ' . $this->name;
        return $this;
    }

    static function bye() {
        echo 'bye';
    }
}

$cat = new Animal('cat', 10);
$cat->hello();
// hello, cat

// Animalクラスを継承
class Cat extends Animal {
}
$cat2 = new Cat('cat2', 8);
$cat2->hello();
// hello, cat2

クラスを継承するには、 class 継承するクラス名 extends 継承元のクラス名 {}という記述をします。
継承できると、中身がなくともAnimalのクラスに登録されているメソッドやプロパティを使用することができます。

継承したクラスで機能を追加する

<?php 
// Animalクラスを継承
class Cat extends Animal {

    public static $LIKE = 'sleeping';

    function hello() {
        echo 'hellllooo' . $this->name;
    }
    function sayLike() {
        echo 'I like ' . static::$LIKE . '.';
    }
}
$cat2 = new Cat('cat2', 8);
$cat2->hello();
$cat2->sayLike();
// hellllooo, cat2
// I like sleeping.

上のようにhello()について、継承したCatに定義がある場合はそれを優先して適用し、ない場合は継承元にそのメソッドを探しに行きます。
protectedはAnimalクラスかAnimalクラスを継承したクラスからアクセスできます。
privateとすると、$nameへのアクセスは自クラス、つまりAnimalクラスでアクセスできないためエラーとなります。

メソッドだけでなく、プロパティも上書きすることができます。

finalキーワードで継承先で変更不可にする

<?php 
// Animalクラスを継承
class Cat extends Animal {

    public static $LIKE = 'sleeping';

    final function hello() {
        echo 'hellllooo' . $this->name;
    }
    function sayLike() {
        echo 'I like ' . static::$LIKE . '.';
    }
}
$cat2 = new Cat('cat2', 8);
$cat2->hello();
$cat2->sayLike();
// hellllooo, cat2
// I like sleeping.

finalキーワードを使うことで継承先で変更ができないようにすることができます。
上の場合、Catクラスをさらに継承したクラスにて
hello()メソッドを上書き、つまりオーバーライドすることはできなくなります。

abstractキーワードで継承先で必ず宣言させる

<?php 
// Animalクラスを継承
// abstractを使う場合は、classの前にもabstractをかく
abstract class Cat extends Animal {

    public static $LIKE = 'sleeping';

    // abstractのメソッド
    abstract function hello();

    function sayLike() {
        echo 'I like ' . static::$LIKE . '.';
    }
}
$cat2 = new Cat('cat2', 8);
$cat2->hello();
$cat2->sayLike();
// hellllooo, cat2
// I like sleeping.

abstractキーワードで継承先で必ず宣言させることができます。
abstractキーワードのあるクラスは、直接呼び出すことができません。
必ず継承させて使うことになります。
abstractを使う場合、メソッドの前にabstractを記述するとともに、クラス自体にもabstractを記述する必要があります。

abstractを使うことで、開発者間でメソッド名を共通化させることができたり、
このメソッドがあることが前提にプログラムを組むオブジェクト指向型のプログラミングが可能になります。

staticとselfとparentの違い

<?php 
// Animalクラスを継承
class Cat extends Animal {
    function __construct($name, $age)
    {
        // parentで親のコンストラクタ関数を呼び出すことができる
        parent::__construct($name, $age);
        $this->name = $name;
        $this->age = $age;
    }
}

parentは、継承元のクラスの静的プロパティや静的メソッドを取得しにいきます。
parentで親のコンストラクタ関数を呼び出すことができます。

staticとすることで、静的プロパティや静的メソッドを呼び出すことができます。
selfとしても同じです。
staticとselfの違いは、Catという継承したクラスで使う場合は違いはなく、継承元のAnimalで使用した場合に違いがでてきます。
staticの場合は、継承元まで探しにいくのに対し、selfの場合は自クラスのものを使います。
使い分けの際に注意しましょう。

PHP

Posted by devsakaso