PHP 的 interface 有什麼用處?

確實,PHP 接口是有它的目的的。node

它們是契約,是給其餘開發人員的說明手冊。然而,仍是很難理解接口有什麼用。緩存

基礎

接口是抽象的類,沒法直接實例化,可是可被實現。架構

這是一個基本的例子學習

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() 方法。若是你不照作,你就會遇到致命錯誤。this

Fatal error: Class MyClass contains 2 abstract methods and must therefore be declared abstract or implement the remaining methods (MyInterface::setName, MyInterface::getName)

此外,接口中定義的方法的訪問性必須爲公開的,而且接口中不能定義類成員。spa

緣由

開發者使用接口來描述一個或者一組類的共同行爲。code

可是爲何只負責封裝實現而不負責處理每一個類的詳細信息呢?symfony

爲了解耦!blog

接口容許你在不更改詳細信息的狀況下更改實現,也就是你使用此實現的方式。繼承

更多高級示例

任何緩存系統都須要如下功能

  • 存儲 / 設置緩存中的內容
  • 獲取緩存中的內容
  • 刪除緩存中的內容

基於此,咱們能夠建立以下的緩存接口

interface CacheInterface {
    public function set(string $key, $val);
    public function get(string $key);
    public function delete(string $key);
}

  

以這種方式,就可讓開發者知道須要實現緩存接口,具體怎麼實現,咱們不須要知道。結果就是咱們能夠在不修改使用方式的狀況下方便地切換緩存系統

As a result, it's easy to change the caching system without changing the way it's used in the project.

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 接口是類的方法模板,這對於解耦實現及使用是很是有幫助的。

當你須要保持靈活性並確保全部開發人員都遵循一組規則時,此功能特別有用。

 

更多學習內容請訪問:

八重櫻:騰訊T3-T4標準精品PHP架構師教程目錄大全,只要你看完保證薪資上升一個臺階(持續更新)

相關文章
相關標籤/搜索