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

Interface 介面

  • 定義 class 必須實作哪些方法,不需要知道實作的內容

  • interface 內方法必須為 public

  • 實作 interface 時使用 implements

  • 一個檔案一個 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的方法,並不需要知道其他人怎麼實作,
達到互動無縫接軌的能力。