PHP Interface 介面

Modern PHP 作者說學習如何讓程式碼做為介面改變了我做為PHP程式設計師的生活。 介面是一個介於兩個PHP物件之中的合約,讓另一個物件知道這個物件可以做什麼,賦予了第三方程式碼互動的能力。 我們不需要知道第三方如何實作這個介面,只要知道它確實做了。

Interface 介面

<?php
interface a
{
    public function foo();
}

class b implements a
{
    public function foo()
    {
        // do something
    }
}

範例

diagram.png

假如說有一位老師要出作業,作業規定要有名字標題內容。 有一個收作業到講桌上的方法addHomework() 裡面的參數$homework規定是要符合 interface HomeworkRule 的物件

class Teacher
{
    protected $table = [];

    public function addHomework(HomeworkRule $homework)
    {
        $this->table[] = [
            'name'    => $homework->getName(),
            'title'   => $homework->getTitle(),
            'body' => $homework->getBody()
        ];
    }

    public function getHomework()
    {
        return $this->table;
    }
}

定義 interface HomeworkRule

interface HomeworkRule
{
    public function getName();
    public function getTitle();
    public function getBody();
}

Marry 寫作業

class Marry implements HomeworkRule
{
    public function getName()
    {
        return 'Marry';
    }

    public function getTitle()
    {
        return 'My Friend';
    }

    public function getBody()
    {
        return 'I have an ugly friend - Tom';
    }
}

Tom 寫作業

class Tom implements HomeworkRule
{
    public function getName()
    {
        return $this->askFather('name');
    }

    public function getTitle()
    {
        return $this->askFather('title');
    }

    public function getBody()
    {
        return $this->askFather('body');
    }

    private function askFather($question)
    {
        $ans = '';
        switch ($question) {
            case 'name':
                $ans = 'Tom';
                break;
            case 'title':
                $ans = 'My Father';
                break;
            case 'body':
                $ans = 'My father is handsome';
                break;
        }
        return $ans;
    }
}

老師收作業

$teacher = new Teacher();
$teacher->addHomework(new Marry());
$teacher->addHomework(new Tom());
var_dump($teacher->getHomework());

Conclusion

兩個類別除了interface規定的相同方法之外,沒有其他共同的地方, 只需要知道知道實作了interface的方法,並不需要知道其他人怎麼實作, 達到互動無縫接軌的能力。