@ PHP

OOP:抽象メソッド

抽象メソッドとは、それ自体が機能を持たない「空のメソッド」のことです。

機能を持たないということは、サブクラスでオーバライドされることを前提としたメソッドと言うことができます。

抽象メソッドを定義するには、abstract 修飾子を指定します。

format

アクセス修飾子 abstract function メソッド名 (データ型 引数,‥‥): 戻り値のデータ型

Pearson クラスは、抽象メソッド show を含む抽象クラスです。抽象メソッドを含むクラスを抽象クラスと言い abstract class として定義します。

root
 ├── Person.php // Person スーパークラス
 ├── Foreigner.php // Foreigner サブクラス
 ├── Japanese.php // Japanese サブクラス
 └── polymo.php // 実行ファイル

Person.php

<?php

abstract class Person
{

    protected $firstName;

    protected $lastName;

    public function __construct(string $firstName, string $lastName)
    {
        $this->firstName = $firstName;
        $this->lastName = $lastName;
    }

    protected abstract function show();

}

Japanese サブクラス・Foreigner サブクラスでは共に show メソッドをオーバライドします。

Japanese.php

<?php
require_once ('Person.php');

class Japanese extends Person
{

    public function show()
    {
        print "氏名:{$this->lastName}{$this->firstName}";
    }

}

Foreigner.php

<?php
require_once ('Person.php');

class Foreigner extends Person
{

    public $middleName;

    public function __construct(string $firstName, string $middleName, string $lastName)
    {
        parent::__construct($firstName, $lastName);
        $this->middleName = $middleName;
    }

    public function show()
    {
        print "氏名:{$this->firstName}・{$this->middleName}・{$this->lastName}";
    }

}

polymo.php では、異なるサブクラスでオーバライドした挙動の異なる同名の show メソッドを実行します。

このように、「同じメソッドで異なる挙動を実現すること」をポリモーフィズム(Polymorphism)と言います。

polymo.php

<?php
require_once ('Japanese.php');
require_once ('Foreigner.php');

$pj = new Japanese('太郎','山田');
$pf = new Foreigner('太郎','クリスティアーノ','山田');

$pj->show();

echo "<br>";

$pf->show();

PHP: クラスの抽象化 – Manual