1. 程式人生 > 實用技巧 >PHP中interface的用處

PHP中interface的用處

確實,PHP 介面是有它的目的的。 它們是契約,是給其他開發人員的說明手冊。然而,還是很難理解介面有什麼用。

基礎

介面是抽象的類,無法直接例項化,但是可被實現。 這是一個基本的例
interface MyInterface {
public function setName(string $name);
public function getName();
}
 
class MyClass implements MyInterface {
private $name;
 
public function setName(string $name) {
$this->name = $name
; } public function getName() { return $this->name; } }
MyClass 必須實現 setName() 和 getName() 方法。如果你不照做,你就會遇到致命錯誤。
Fatal error: Class MyClass contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (MyInterface::setName, MyInterface::getName)
此外,介面中定義的方法的訪問性必須為公開的,並且介面中不能定義類成員。

原因

開發者使用介面來描述一個或者一組類的共同行為。 但是為什麼只負責封裝實現而不負責處理每個類的詳細資訊呢? 為了解耦! 介面允許你在不更改詳細資訊的情況下更改實現,也就是你使用此實現的方式。

更多高階示例

任何快取系統都需要以下功能
  • 儲存 / 設定快取中的內容
  • 獲取快取中的內容
  • 刪除快取中的內容
基於此,我們可以建立如下的快取介面
interface CacheInterface {
public function set(string $key, $val);
public function get(string $key);
public
function delete(string $key); }
以這種方式,就可以讓開發者知道需要實現快取介面,具體怎麼實現,我們不需要知道。結果就是我們可以在不修改使用方式的情況下方便地切換快取系統 因此,在不改變快取系統在專案中的使用方式的情況下更改快取系統是很容易的。

Symfony 示例

我們來看剛才例子的具體應用。對於 Symfony 而言,如果你想要實現任何快取系統,最佳實踐就是按照下面的方式來做
use Symfony\Contracts\Cache\CacheInterface;
 
class MyClass {
private $cache;
public function __construct(CacheInterface $cache)
{
$this->cache = $cache;
}
}
通過依賴注入,將快取介面注入到我們的類中。下次我們修改快取系統時,MyClass 類不需要做任何的改變。

多實現 VS 多繼承

PHP 不支援多繼承,下面這種方式是不可能的
class MyClass extends ClassX, ClassY {}
之所以不允許這樣做部分原因是由於 Diamond 問題. 不過,你可以這麼做
class ClassY extends ClassX {}
class MyClass extends ClassY {}
但是 ClassX 和 ClassY 可能處理不同的事情,因此使用繼承沒有任何意義。 如果你想要執行多種行為,那麼你可以多個介面
class MyClass implements InterfaceX, InterfaceY {}
換句話說,你可以讓一些類共享一部分功能而不是共享一個父類。

總結

PHP 介面是類的方法模板,這對於解耦實現及使用是非常有幫助的。 當你需要保持靈活性並確保所有開發人員都遵循一組規則時,此功能特別有用。