Abstract 可以用來定義 Abstract 類、一般方法名稱及參數,Abstract 方法。

一般的方法可以實作邏輯。

如果是 Abstract 方法,則僅作描述,不實作邏輯。邏輯會保留到某個類別繼承(extends)時,來實作(強制)。

透過抽象,可以讓我們定義好規則以及實作一些方法,讓其他類別擴充時,可遵照規則實作,以及直接可使用這些方法。

例如,

首先,這邊我們定義了一個抽象的 Factory

其中再定義了一些抽象的方法, addPrimaryToppings 與 intro

接著,在 Tea 類別繼承了這個 Factory ,可同時擁有 Factory 原先定義的方法,以及必須強制實作的抽象方法。


<?php

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

    public function make()
    {
        return $this
            ->addHotWater()
            ->addSugar()
            ->addPrimaryToppings()
            ->addMilk();
    }
    
    //一般方法
    protected  function  addHotWater()
    {
        var_dump('Pour Hot water into cup');
        return $this;
    }
    
    protected  function addSugar()
    {
        var_dump('Add proper amount of sugar');
        return $this;
    }
    
    protected function addMilk()
    {
        var_dump('Add proper amount of Milk');
        return $this;
    }
    
    //Abstract 方法
    protected abstract function addPrimaryToppings();

    protected abstract public function intro() : string;
}

class Tea extends Factory
{
    public function addPrimaryToppings()
    {
        var_dump('Add proper amount of tea');
        return $this;
    }


	public function intro() : string {
		return "This is $this->name!";
	}
}

繼承抽象類別

$tea = new Tea("Tea");
echo $tea->intro();
$tea->make();

class Coffee extends Template
{
    public function addPrimaryToppings()
    {
        var_dump('Add proper amount of Coffee');
        return $this;
    }


	public function intro() : string {
		return "This is $this->name!";
	}
}

$coffee = new Coffee("Coffee");
echo $coffee->intro();
$coffee->make();

參考: https://medium.com/better-programming/understanding-use-of-interface-and-abstract-class-9a82f5f15837 https://www.w3schools.com/php/php_oop_classes_abstract.asp