確實,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 介面是類的方法模板,這對于解耦實作及使用是非常有幫助的,
當你需要保持靈活性并確保所有開發人員都遵循一組規則時,此功能特別有用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/38644.html
標籤:PHP
上一篇:php流程控制陳述句
