首頁  >  文章  >  後端開發  >  PHP物件導向之介面詳解(程式碼實例)

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

易达
易达原創
2020-05-26 10:12:323435瀏覽

本文目標:

1、了解PHP中介面的定義

2、了解PHP中介面的作用

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

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

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

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

定義:介面就是把不同類別的 <span style="background-color: rgb(255, 0, 0); color: rgb(255, 255, 255); border: 1px solid rgb(0, 0, 0);">共同行為</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">進行了定義,然後在不同的類別裡面實現不同的功能</span>

<span style="color: rgb(0, 0, 0);">#    或我們可以理解成它是對事物的一種統一規範,它規定了某個事物必須有哪些行為,比如人這個接口,它就規定了人必須要具備的一些方法,比如吃、喝、拉、撒、走路<span style="color: rgb(0, 0, 0); font-family: monospace;">、 </span>說話<span style="color: rgb(0, 0, 0); font-family: monospace;">、</span>眨眼睛<span style="color: rgb(0, 0, 0); font-family: monospace;">、</span>睡覺<span style="color: rgb(0, 0, 0); font-family: monospace;">、</span>思考等,缺少任何一個行為都不是一個正常的人了</span>

#(二)、了解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-class\class-code\classing\index.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-class\class-code\classing\index.php:9 Stack trace: #0 {main} thrown in D:\E-class\class-code\classing\index.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-class\class-code\classing\index.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物件導向之介面詳解(程式碼實例)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn