溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP面向?qū)ο笾薪涌诘亩x和作用以及實(shí)現(xiàn)

發(fā)布時(shí)間:2020-05-26 13:43:19 來(lái)源:億速云 閱讀:589 作者:鴿子 欄目:編程語(yǔ)言

(一)、PHP中接口的定義(What)

定義:接口就是把不同類的 共同行為 進(jìn)行了定義,然后在不同的類里面實(shí)現(xiàn)不同的功能

   或者我們可以理解成它是對(duì)事物的一種統(tǒng)一規(guī)范,它規(guī)定了某個(gè)事物必須有哪些行為,比如人這個(gè)接口,它就規(guī)定了人必須要具備的一些方法,比如吃、喝、拉、撒、走路說(shuō)話、眨眼睛睡覺(jué)、思考等,缺少任何一個(gè)行為都不是一個(gè)正常的人了

(二)、PHP中接口的作用(Why)

作用:

1、規(guī)范代碼:定義接口有利于代碼的規(guī)范:特別是對(duì)于一些大型項(xiàng)目而言,有了統(tǒng)一的接口后,一方面開發(fā)人員能有一個(gè)清晰的認(rèn)識(shí),一看接口就知道他們具體要實(shí)現(xiàn)哪些業(yè)務(wù);同時(shí)也能防止由于開發(fā)人員隨意命名而導(dǎo)致的命名不清晰和代碼混亂,影響開發(fā)效率。

  2、提高的代碼的可維護(hù)性:比如你要做一個(gè)分銷商城程序,其中里面有一個(gè)分銷類,主要負(fù)責(zé)分銷功能,剛開始的時(shí)候你可能會(huì)把你剛開始想到的一些分銷功能都封裝到這個(gè)分銷類里面??墒请S著時(shí)間的推移,你之后可能會(huì)發(fā)現(xiàn)現(xiàn)有的類已經(jīng)不能夠滿足你的新的需求,然后你就需要重新設(shè)計(jì)這個(gè)類,但是最壞的情況是你會(huì)發(fā)現(xiàn)此刻這個(gè)類好像根本就沒(méi)什么用了,但是代碼的其他地方有可能還會(huì)引用這個(gè)類,如果完全去修改,會(huì)導(dǎo)致非常麻煩。但是如果一開始你把它定義成一個(gè)接口,把分銷的一些主要功能放在接口里,然后再另外定義一個(gè)分銷類時(shí)去具體的實(shí)現(xiàn)這些接口,然后你只需要用這個(gè)接口去引用已經(jīng)實(shí)現(xiàn)這個(gè)接口的相關(guān)的類就可以了,就算以后要換的話只不過(guò)是引用另一個(gè)類而已,這樣就可以提高代碼的可維護(hù)性和可拓展性。

  3、讓代碼更具備高內(nèi)聚,低耦合的原則

(三)、PHP中接口的使用場(chǎng)景(Where)

場(chǎng)景:結(jié)合它的作用,使用場(chǎng)景基本上如下

1、如果為了保證一個(gè)類更具規(guī)范性,我們可以為這個(gè)類定義一個(gè)接口,那么所有繼承這個(gè)接口的所有類,都必須要實(shí)現(xiàn)接口里定義的方法

2、如果希望提高代碼的可維護(hù)性,可重用性和可擴(kuò)展性,我們也可以考慮它,特別是在參與開發(fā)大型項(xiàng)目的時(shí)候,一定要先考慮好,哪些接口需要先定義好,這樣就等同于先把規(guī)范確定好了,規(guī)范確定好了,分工合作的時(shí)候,效率才會(huì)提升

(四)、了解PHP中接口的具體實(shí)現(xiàn)(How)

總結(jié):

1、接口的定義 interface 接口名稱{  }

2、接口里面的方法 是沒(méi)有{},也就是說(shuō)里面的方法是沒(méi)有具體的實(shí)現(xiàn)部分

3、類實(shí)現(xiàn)接口的定義 通過(guò)關(guān)鍵字implements,比如 class A implements 接口{}

4、類一旦要實(shí)現(xiàn)某個(gè)接口,就必須要實(shí)現(xiàn)接口定義好的所有方法

5、接口不能被實(shí)例化

6、通過(guò)instanceof 來(lái)判斷某個(gè)類的實(shí)例是不是實(shí)現(xiàn)了一個(gè)接口,比如A對(duì)象實(shí)例 instanceof B接口

如果返回true,就表示A對(duì)象實(shí)例對(duì)應(yīng)的類 是實(shí)現(xiàn)了B接口

7、通過(guò)extends可以讓一個(gè)接口 繼承 另外一個(gè)接口

8、當(dāng)一個(gè)類要實(shí)現(xiàn)一個(gè)子接口時(shí),它不僅要實(shí)現(xiàn)子接口里面的方法,同時(shí)也要實(shí)現(xiàn)父接口的所有方法

每個(gè)總結(jié)都是通過(guò)實(shí)踐得來(lái)的,下面我們一一來(lái)通過(guò)具體的代碼來(lái)演示上面的總結(jié)

(五)、具體代碼

1、案例一

實(shí)踐目標(biāo):

1、接口的定義 interface 接口名稱{  }

2、接口里面的方法 是沒(méi)有{},也就是說(shuō)里面的方法是沒(méi)有具體的實(shí)現(xiàn)部分

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

運(yùn)行結(jié)果:是空白的說(shuō)明沒(méi)有報(bào)錯(cuò)

2、案例二

實(shí)踐目標(biāo):

1、類要實(shí)現(xiàn)一個(gè)接口的定義 通過(guò)關(guān)鍵字implements,比如 class A implements 接口{}

2、類一旦要實(shí)現(xiàn)某個(gè)接口,就必須要實(shí)現(xiàn)接口定義好的所有方法

<?php
//接口定義
interface Action{
    public function eat();
    public function walk();
    public function sleep();
}
//定義實(shí)現(xiàn)接口的類
class Monkey implements Action{
    //一旦要實(shí)現(xiàn)一個(gè)接口,就必須要實(shí)現(xiàn)接口里面的所有方法
    public function eat(){}
    public function walk(){}
    public function sleep(){}
}
$monkey = new Monkey();

?>

沒(méi)有實(shí)現(xiàn)接口的方法的運(yùn)行結(jié)果為:

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

實(shí)現(xiàn)了接口的運(yùn)行結(jié)果為:

空白說(shuō)明是正確的

3、案例三

實(shí)踐目標(biāo):

1、接口不能被實(shí)例化

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

?>

運(yùn)行結(jié)果為:

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、案例四

實(shí)踐目標(biāo):

1、通過(guò)instanceof 來(lái)判斷某個(gè)類的實(shí)例是不是實(shí)現(xiàn)了一個(gè)接口,比如A對(duì)象實(shí)例 instance of B接口

如果返回true,就表示A對(duì)象實(shí)例對(duì)應(yīng)的類 是實(shí)現(xiàn)了B接口

<?php
//接口定義
interface Action{
    public function eat();
    public function walk();
    public function sleep();
}
//定義實(shí)現(xiàn)接口的類
class Monkey implements Action{
    public function eat(){}
    public function walk(){}
    public function sleep(){}
}
$monkey = new Monkey();
print_r( $monkey instanceof Action );
?>

運(yùn)行結(jié)果為:1

5、案例五

實(shí)踐目標(biāo):

1、通過(guò)extends可以讓一個(gè)接口 繼承 另外一個(gè)接口

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

?>

6、案例六

實(shí)踐目標(biāo):

1、當(dāng)一個(gè)類要實(shí)現(xiàn)一個(gè)子接口時(shí),它不僅要實(shí)現(xiàn)子接口里面的方法,同時(shí)也要實(shí)現(xiàn)父接口的所有方法

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

?>

當(dāng)Human類只實(shí)現(xiàn)HigherAction的2個(gè)方法的時(shí)候,運(yùn)行結(jié)果為:

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

當(dāng)Human類實(shí)現(xiàn)了HigherAction和Action的所有方法的時(shí)候,運(yùn)行結(jié)果為:

空白,說(shuō)明是正確的

(六)、學(xué)以致用

問(wèn)題:分銷系統(tǒng)想必對(duì)很多人來(lái)說(shuō)都不陌生,但是分銷系統(tǒng)也有很多種類,比如常見(jiàn)的不違法有2級(jí)分銷,稍微有點(diǎn)違法的就是3級(jí)分銷,其實(shí)還有更多繁雜的分銷系統(tǒng),但是不管是哪種分銷系統(tǒng),他們都有類似的方法,我們希望把這些方法做成一個(gè)接口,然后具體怎么實(shí)現(xiàn),就交由2級(jí)分銷和3級(jí)分銷2個(gè)類,怎么做?

思路分析:

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

2、把這些方法封裝到分銷接口中

3、定義2個(gè)類,讓這2個(gè)類分別去實(shí)現(xiàn)這個(gè)分銷接口

具體代碼:

<?php
//分銷接口定義
interface Commission{
    //獲取會(huì)員的直接上級(jí)
    public function getParent($uid);
    //獲取會(huì)員的當(dāng)期級(jí)別
    public function getLevel($uid);
    //獲取會(huì)員的累計(jì)傭金
    public function getTotalCommission($uid);
    //獲取會(huì)員當(dāng)期可提現(xiàn)傭金
    public function getCurrCommission($uid);
    //獲取會(huì)員的累計(jì)提現(xiàn)傭金
    public function getTotalApplyPrice($uid);
}
//2級(jí)分銷
class TwoLevelCommission implements Commission{
    //獲取會(huì)員的直接上級(jí)
    public function getParent($uid){}
    //獲取會(huì)員的當(dāng)期級(jí)別
    public function getLevel($uid){}
    //獲取會(huì)員的累計(jì)傭金
    public function getTotalCommission($uid){}
    //獲取會(huì)員當(dāng)期可提現(xiàn)傭金
    public function getCurrCommission($uid){}
    //獲取會(huì)員的累計(jì)提現(xiàn)傭金
    public function getTotalApplyPrice($uid){}
}
//3級(jí)分銷
class ThreeLevelCommission implements Commission{
    //獲取會(huì)員的直接上級(jí)
    public function getParent($uid){}
    //獲取會(huì)員的當(dāng)期級(jí)別
    public function getLevel($uid){}
    //獲取會(huì)員的累計(jì)傭金
    public function getTotalCommission($uid){}
    //獲取會(huì)員當(dāng)期可提現(xiàn)傭金
    public function getCurrCommission($uid){}
    //獲取會(huì)員的累計(jì)提現(xiàn)傭金
    public function getTotalApplyPrice($uid){}
}
?>

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI