前言
1.這篇文章僅限于對php的面向對象進行說明,其他語言的情況不再考慮之列。
2.本人學生,難免有不足之處,希望各位大神指出。
正文
要理解接口,就要先理解面向對象編程的含義。在php這一門語言中,面向對象編程可以理解為將一個大的復雜的程序,拆分為小的,可以任意組合的部分,然后最終組合起來形成可運行程序的過程。在這樣一種過程中,每一個小的模塊擁有自己的方法和屬性,只有少數的方法和屬性是外部可見的,對于大多數的屬性,往往只是提供get
和set
方法對其進行獲得和修改,而不直接在外部進行調用。這就好比人去開車,人只知道怎么使用方向盤、變速器和剎車油門,人不可能直接去轉動發(fā)動機讓車動起來。
正確理解接口
如果說能夠理解上面的人開車的例子,那么理解接口就容易了。接口實際上指的是一個類暴露在外部的可以使用的內容,這個內容包括了可以調用的方法和屬性。而書寫接口就是告訴別人我寫的這個類怎么用,有哪些可以使用的方法和可以調用的屬性。把車這個類寫一個接口就可能有
interface car
{
// 當前速度
public $currentSpeed;
// 方向盤
public function wheel($direction);
// 換檔
public function shift($shift);
// 油門
public function speedUp();
// 剎車
public function slowDown();
}```
實際上在寫接口的時候,所有的屬性和方法以及常量都有一個特點,它們都是`public`的,也就是說它們可以被外部訪問,這也恰恰符合了接口的理解,接口是外部可訪問的內容的集合。對于`protected`和`private`這些關鍵字修飾的方法屬性,外部不可訪問,也就沒有在接口中書寫的意義,自然你在接口中寫入這些內容會讓程序崩潰。如果用剛才車的例子來解釋就是,我們只關心車怎么開(類如何使用),而車由什么組成(類的功能如何實現)我們并不關心。
***
####正確書寫接口
但是接口是不是寫的如同上面那樣就可以了呢?答案是否定的,僅僅告訴別人我的方法的名字和它所需要的參數遠遠不夠。這就好比于給了別人一個按鈕,卻不告訴別人按下去的后果。php是一門弱語言,在7.0.*之前的版本沒有返回值類型的檢查,所以為了兼容我們一般用注釋的方式補全這一點缺陷
interface car
{
// 獲得當前速度
// 返回一個浮點數表示速度
public $currentSpeed;
// 方向盤 改變車的行駛方向
// 0左,1右,返回空值
public function wheel($direction);
// 換檔 改變速度倍率
// 參數為1-5的整數,返回為空
public function shift($shift); //
// 油門 進行加速
// 返回為空
public function speedUp();
// 剎車 進行減速
// 返回為空
public function slowDown();
}```
現在這個接口就完全多了。
總結
使用接口的時候,要充分理解接口的含義,不要僅僅為了寫一個接口而寫一個接口,這樣沒有意義。最好的辦法就是把書寫接口當作寫一份產品說明書,這樣寫出來的接口才真正有用,后期代碼的重用率才更高。