【 PHP 】PHP8に入門してみた 200日目 PHPの基本 ( オブジェクト指向 継承 )

PHP8技術者認定初級試験 が始まるようなので 試験に向けて (できるだけ)勉強しようと思います! 使用する書籍は独習PHP 第4版(山田 祥寛)|翔泳社の本 (shoeisha.co.jp) となります。

オブジェクト指向

継承

PHPの継承は単一継承です。extendsキーワードを使って親クラスのメソッドを呼び出せます。

class Person {
    protected $name;

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

    public function greet() {
        return "Hello, my name is " . $this->name . ".";
    }
}

class Student extends Person {
    public function study() {
        return $this->name . " is studying.";
    }
}

$person = new Person("Alice");
echo $person->greet(); // "Hello, my name is Alice."

$student = new Student("Bob");
echo $student->greet(); // "Hello, my name is Bob."
echo $student->study(); // "Bob is studying."

 

PHP8における継承の特徴をまとめておきました。

  1. ::class 構文での親クラスの名前を取得
    ::class 構文を使用して親クラスのクラス名を取得することができます。
    これにより、文字列を使用する代わりに、型ヒントやinstanceof演算子などの機能を使用できます。
    これはいつ使う機能なのでしょうかね🤔

    class Animal {
        public function speak() {
            echo "Animal speaking\n";
        }
    }
    
    class Dog extends Animal {
        public function speak() {
            echo "Dog barking\n";
        }
    }
    
    echo Animal::class . "\n"; // 出力: Animal
    echo Dog::class . "\n"; // 出力: Dog
    
  2. finalクラスの継承禁止
    finalクラスを継承できないようにすることができます。
    これにより、クラスの機能を制限して、コードの安全性を向上させることができます。Javaにもありますよね!

    final class Animal {
        public function speak() {
            echo "Animal speaking\n";
        }
    }
    
    // 以下のクラス定義は、上記のAnimalクラスを継承しようとするためエラーが発生します。
    // Fatal error: Class Cat may not inherit from final class (Animal)
    class Cat extends Animal {
        public function speak() {
            echo "Cat meowing\n";
        }
    }

    上記のコードでは、 Animal クラスが final キーワードで宣言されているため、Cat クラスが Animal クラスを継承することができません。
    これにより、Animal クラスの機能を制限し、コードの安全性を向上させることができます。

  3. コンストラクタのプロパティ宣言
    コンストラクタでプロパティを宣言することができます。
    これにより、コードの可読性を向上させ、同じ機能を持つコンストラクタを簡単に作成できるようになるようです。
    以前にも学習しましたね・・・しかし逆に可読性がやメンテナンス性が下がるような気も。

    class Person {
        public function __construct(
            public string $name,
            public int $age
        ) {}
    }
    
    $person = new Person("John", 30);
    echo $person->name . " is " . $person->age . " years old.\n";

 

PHPPHP

Posted by raika@blog