PHP物件導向之介面詳解(程式碼範例)

2020-07-16 10:05:52

本文目標:

1、了解PHP中介面的定義

2、了解PHP中介面的作用

3、了解PHP中介面的使用場景

4、了解PHP中介面的具體實現

還是承襲之前一貫的學習思路,我們學習一個知識,還是根據3w1h的思路來學習

(一)、了解PHP中介面的定義(What)

定義:介面就是把不同類的 共同行為 進行了定義,然後在不同的類裡面實現不同的功能

或者我們可以理解成它是對事物的一種統一規範,它規定了某個事物必須有哪些行為,比如人這個介面,它就規定了人必須要具備的一些方法,比如吃、喝、拉、撒、走路說話眨眼睛睡覺思考等,缺少任何一個行為都不是一個正常的人了

(二)、了解PHP中介面的作用(Why)

作用:

1、規範程式碼:定義介面有利於程式碼的規範:特別是對於一些大型專案而言,有了統一的介面後,一方面開發人員能有一個清晰的認識,一看介面就知道他們具體要實現哪些業務;同時也能防止由於開發人員隨意命名而導致的命名不清晰和程式碼混亂,影響開發效率。

2、提高的程式碼的可維護性:比如你要做一個分銷商城程式,其中裡面有一個分銷類,主要負責分銷功能,剛開始的時候你可能會把你剛開始想到的一些分銷功能都封裝到這個分銷類裡面。可是隨著時間的推移,你之後可能會發現現有的類已經不能夠滿足你的新的需求,然後你就需要重新設計這個類,但是最壞的情況是你會發現此刻這個類好像根本就沒什麼用了,但是程式碼的其他地方有可能還會參照這個類,如果完全去修改,會導致非常麻煩。但是如果一開始你把它定義成一個介面,把分銷的一些主要功能放在介面裡,然後再另外定義一個分銷類時去具體的實現這些介面,然後你只需要用這個介面去參照已經實現這個介面的相關的類就可以了,就算以後要換的話只不過是參照另一個類而已,這樣就可以提高程式碼的可維護性和可拓展性。

3、讓程式碼更具備高內聚,低耦合的原則

(三)、了解PHP中介面的使用場景(Where)

場景:結合它的作用,使用場景基本上如下

1、如果為了保證一個類更具規範性,我們可以為這個類定義一個介面,那麼所有繼承這個介面的所有類,都必須要實現介面裡定義的方法

2、如果希望提高程式碼的可維護性,可重用性和可延伸性,我們也可以考慮它,特別是在參與開發大型專案的時候,一定要先考慮好,哪些介面需要先定義好,這樣就等同於先把規範確定好了,規範確定好了,分工合作的時候,效率才會提升

(四)、了解PHP中介面的具體實現(How)

總結:

1、介面的定義 interface 介面名稱{ }

2、介面裡面的方法 是沒有{},也就是說裡面的方法是沒有具體的實現部分

3、類實現介面的定義 通過關鍵字implements,比如 class A implements 介面{}

4、類一旦要實現某個介面,就必須要實現介面定義好的所有方法

5、介面不能被範例化

6、通過instanceof 來判斷某個類的範例是不是實現了一個介面,比如A物件範例 instanceof B介面

如果返回true,就表示A物件範例對應的類 是實現了B介面

7、通過extends可以讓一個介面 繼承 另外一個介面

8、當一個類要實現一個子介面時,它不僅要實現子介面裡面的方法,同時也要實現父介面的所有方法

每個總結都是通過實踐得來的,下面我們一一來通過具體的程式碼來演示上面的總結

(五)、具體程式碼

1、案例一

實踐目標:

1、介面的定義 interface 介面名稱{ }

2、介面裡面的方法 是沒有{},也就是說裡面的方法是沒有具體的實現部分

<?php
//介面定義
interface Action{
    public function eat();
    public function walk();
    public function sleep();
}
?>

執行結果:是空白的說明沒有報錯

2、案例二

實踐目標:

1、類要實現一個介面的定義 通過關鍵字implements,比如 class A implements 介面{}

2、類一旦要實現某個介面,就必須要實現介面定義好的所有方法

<?php
//介面定義
interface Action{
    public function eat();
    public function walk();
    public function sleep();
}
//定義實現介面的類
class Monkey implements Action{
    //一旦要實現一個介面,就必須要實現介面裡面的所有方法
    public function eat(){}
    public function walk(){}
    public function sleep(){}
}
$monkey = new Monkey();

?>

沒有實現介面的方法的執行結果為:

Fatal error: Class Monkey contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (Action::eat, Action::walk, Action::sleep) in D:E-classclass-codeclassingindex.php on line 11

實現了介面的執行結果為:

空白說明是正確的

3、案例三

實踐目標:

1、介面不能被範例化

<?php
//介面定義
interface Action{
    public function eat();
    public function walk();
    public function sleep();
}
$action = new Action();

?>

執行結果為:

Fatal error: Uncaught Error: Cannot instantiate interface Action in D:E-classclass-codeclassingindex.php:9 Stack trace: #0 {main} thrown in D:E-classclass-codeclassingindex.php on line 9

4、案例四

實踐目標:

1、通過instanceof 來判斷某個類的範例是不是實現了一個介面,比如A物件範例 instance of B介面

如果返回true,就表示A物件範例對應的類 是實現了B介面

<?php
//介面定義
interface Action{
    public function eat();
    public function walk();
    public function sleep();
}
//定義實現介面的類
class Monkey implements Action{
    public function eat(){}
    public function walk(){}
    public function sleep(){}
}
$monkey = new Monkey();
print_r( $monkey instanceof Action );
?>

執行結果為:1

5、案例五

實踐目標:

1、通過extends可以讓一個介面 繼承 另外一個介面

<?php
//介面定義
interface Action{
    public function eat();
    public function walk();
    public function sleep();
}
//介面繼承
interface HigherAction extends Action{
    public function talk();
    public function think();
}

?>

6、案例六

實踐目標:

1、當一個類要實現一個子介面時,它不僅要實現子介面裡面的方法,同時也要實現父介面的所有方法

<?php
//介面定義
interface Action{
    public function eat();
    public function walk();
    public function sleep();
}
//介面繼承
interface HigherAction extends Action{
    public function talk();
    public function think();
}
//定義實現子介面的類
class Human implements HigherAction{
    public function eat(){}
    public function talk(){}
    public function walk(){}
    public function sleep(){}
    public function think(){}
}
$human = new Human();

?>

當Human類只實現HigherAction的2個方法的時候,執行結果為:

Fatal error: Class Human contains 3 abstract methods and must therefore be declared abstract or implement the remaining methods (HigherAction::think, Action::walk, Action::sleep) in D:E-classclass-codeclassingindex.php on line 14

當Human類實現了HigherAction和Action的所有方法的時候,執行結果為:

空白,說明是正確的

(六)、學以致用

問題:分銷系統想必對很多人來說都不陌生,但是分銷系統也有很多種類,比如常見的不違法有2級分銷,稍微有點違法的就是3級分銷,其實還有更多繁雜的分銷系統,但是不管是哪種分銷系統,他們都有類似的方法,我們希望把這些方法做成一個介面,然後具體怎麼實現,就交由2級分銷和3級分銷2個類,怎麼做?

思路分析:

1、先想好分銷的公共方法

2、把這些方法封裝到分銷介面中

3、定義2個類,讓這2個類分別去實現這個分銷介面

具體程式碼:

<?php
//分銷介面定義
interface Commission{
    //獲取會員的直接上級
    public function getParent($uid);
    //獲取會員的當期級別
    public function getLevel($uid);
    //獲取會員的累計佣金
    public function getTotalCommission($uid);
    //獲取會員當期可提現佣金
    public function getCurrCommission($uid);
    //獲取會員的累計提現佣金
    public function getTotalApplyPrice($uid);
}
//2級分銷
class TwoLevelCommission implements Commission{
    //獲取會員的直接上級
    public function getParent($uid){}
    //獲取會員的當期級別
    public function getLevel($uid){}
    //獲取會員的累計佣金
    public function getTotalCommission($uid){}
    //獲取會員當期可提現佣金
    public function getCurrCommission($uid){}
    //獲取會員的累計提現佣金
    public function getTotalApplyPrice($uid){}
}
//3級分銷
class ThreeLevelCommission implements Commission{
    //獲取會員的直接上級
    public function getParent($uid){}
    //獲取會員的當期級別
    public function getLevel($uid){}
    //獲取會員的累計佣金
    public function getTotalCommission($uid){}
    //獲取會員當期可提現佣金
    public function getCurrCommission($uid){}
    //獲取會員的累計提現佣金
    public function getTotalApplyPrice($uid){}
}
?>

(七)、總結

1、本文主要是講了介面的定義和作用以及實現

希望本文能給大家帶來一定的幫助,謝謝!!!

以上就是PHP物件導向之介面詳解(程式碼範例)的詳細內容,更多請關注TW511.COM其它相關文章!