確實,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 而言,若是你想要實現任何緩存系統,最佳實踐就是按照下面的方式來作
use Symfony\Contracts\Cache\CacheInterface; class MyClass { private $cache; public function __construct(CacheInterface $cache) { $this->cache = $cache; } }
經過依賴注入,將緩存接口注入到咱們的類中。下次咱們修改緩存系統時,MyClass 類不須要作任何的改變。
PHP 不支持多繼承,下面這種方式是不可能的
class MyClass extends ClassX, ClassY {}
之因此不容許這樣作部分緣由是因爲 Diamond 問題.
不過,你能夠這麼作
class ClassY extends ClassX {} class MyClass extends ClassY {}
可是 ClassX
和 ClassY
可能處理不一樣的事情,所以使用繼承沒有任何意義。
若是你想要執行多種行爲,那麼你能夠多個接口
class MyClass implements InterfaceX, InterfaceY {}
換句話說,你可讓一些類共享一部分功能而不是共享一個父類。
PHP 接口是類的方法模板,這對於解耦實現及使用是很是有幫助的。
當你須要保持靈活性並確保全部開發人員都遵循一組規則時,此功能特別有用。
更多學習內容請訪問: