31. クラスの継承

継承とは

サブクラスとスーパークラス

既存クラスの機能を引き継いで、新しいクラスを作成する方法を継承(inheritance) といいます。元となるクラスのことをスーパークラスといい、引き継ぐ新しい子クラスをサブクラスといいます。サブクラスはスーパークラスのメソッドが引き継げます。

継承の例

つぎの例は、スーパークラス「キャラクター」を継承して「ウィザード」「ウォリアー」を定義したものです。スーパークラスの機能がそのままで、データを設定したり、新たに機能を追加できます。

  • サブクラスは、スーパークラスからプロパティやメソッドを引き継ぐ
  • サブクラスは、新たにプロパティやメソッドを定義できる
  • サブクラスは、スーパークラスのプロパティやメソッドを上書きできる

継承の方法

ファイル構成

models/
      ├── Animal.php
      ├── Cat.php
      └── Dog.php
animal_play.php

extends

サブクラス(子クラス)がスーパークラス(親クラス)を継承するには、extendsを利用します。サブクラスが継承すると、スーパークラスの機能を利用できます。

修飾子 class サブクラス extends スーパークラス {

}

スーパークラスの修正

スーパークラスを継承すると、スーパークラスのメソッドやプロパティをサブクラスでそのまま利用できます。

メソッドの追加

スーパークラス「Animal」に、cry() メソッドを追加します。

Animal.php
<?php
class Animal
{
    public $name;
    public $crying;

    public function cry()
    {
        echo $this->crying;
        echo PHP_EOL;
    }

    public function speak($message)
    {
        echo $message;
        echo PHP_EOL;
    }

    public function  run()
    {
        echo "「{$this->name}」が走った。";
        echo PHP_EOL;
    }
}

サブクラスの作成

「Cat」クラスと「Dog」クラス作成し、「Animal」クラスを継承します。

Cat.php
require_once 'Animal.php';

class Cat extends Animal
{

}
Dog.php
require_once 'Animal.php';

class Dog extends Animal
{

}

プロパティの設定

「Cat」クラスの「crying」プロパティに「にゃー!」、「Dog」クラスの「crying」プロパティに「わん!」と設定します。

Cat.php
<?php
require_once 'Animal.php';

class Cat extends Animal
{
    public $crying = 'にゃー!';
}
Dog.php
<?php
require_once 'Animal.php';

class Dog extends Animal
{
    public $crying = 'わん!';
}

サブクラスの実行

「animal_play.php」を作成し、CatとDogインスタンスで cry() を実行してみましょう。

<?php
require_once 'Cat.php';
require_once 'Dog.php';

$cat = new Cat();
$cat->cry();

$dog = new Dog();
$dog->cry();
結果

このように、Cat や Dog クラスは、Animal クラスの cry() を利用できます。

にゃー!
わん!

コンストラクタ

コンストラクタは、クラスインスタンスが生成時に自動的に呼び出されるメソッドです。PHP のコンストラクタは、__construct() で記述します。

class クラス名
{
    function __construct(変数1, 変数2, ...)
    {
        //処理
    }
}

コンストラクタの追加

Animal クラスにコンストラクタを追加し、引数をクラスプロパティ $name に代入します。

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

コンストラクタの利用

「animal_play.php」にコンストラクタの引数を設定し、run() を実行してみましょう。

<?php
require_once 'Cat.php';
require_once 'Dog.php';

$cat = new Cat('ミケ');
$cat->cry();
$cat->run();

$dog = new Dog('ぽち');
$dog->cry();
$dog->run();
結果
にゃー!
「ミケ」が走った。
わん!
「ぽち」が走った。

サブクラスのクラスメソッド

Animal クラスに共通のメソッドを実装しましたが、Cat、Dog クラスに独自のメソッドを追加してみます。

Cat.php
function escape()
{
    echo "「{$this->name}」が逃げた!";
    echo PHP_EOL;
}
Dog.php
function follow()
{
    echo "「{$this->name}」が寄ってきた!";
    echo PHP_EOL;
}

クラスメソッドを実行する

Cat と Dog クラスに実装したクラスメソッドをそれぞれ実行してみましょう。

<?php
require_once 'Cat.php';
require_once 'Dog.php';

$cat = new Cat('ミケ');
$cat->cry();
$cat->run();
//独自メソッド
$cat->escape();

$dog = new Dog('ぽち');
$dog->cry();
$dog->run();
//独自メソッド
$dog->follow();

実行結果

にゃー!
「ミケ」が走った。
「ミケ」が逃げた!
わん!
「ぽち」が走った。
「ぽち」が寄ってきた!

実行できないクラスメソッド

このように親クラスを継承しながら、子クラスに追加処理を実装できます。よて、Cat クラスは follow()、 Dog クラスは escape() はクラスにないので実行することはできません。

$cat->follow(); //実行できない
$dog->escape(); //実行できない

PHP超入門