PHP中抽象类与接口的应用场景
生活随笔
收集整理的這篇文章主要介紹了
PHP中抽象类与接口的应用场景
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
<?php
/***
====筆記部分====
接口的具體語(yǔ)法:
0:以人類為, class Human 是人的草圖
而接口 是零件
可以用多種零件組合出一種新特種來(lái).
1: 如上,接口本身即是抽象的,內(nèi)部聲明的方法 默認(rèn)也是抽象的.
不用加 abstract
2: 一個(gè)類可以一次性實(shí)現(xiàn)多個(gè)接口.
語(yǔ)法用 implements 實(shí)現(xiàn) (把我這幾個(gè)功能實(shí)現(xiàn)了)
class ClassName implements interface1,interface2,interface3 {
}
然后再把接口的功能給實(shí)現(xiàn).
3: 接口也可以繼承, 用extends
4:接口是一堆方法的說(shuō)明,不能加屬性
5:接口就是供組裝成類用的,封閉起來(lái)沒(méi)有意義,因此方法只能是public
***/
interface animal { protected function eat();
}
interface monkey extends animal { public function run(); public function cry();
}
interface wisdom { public function think();
}
interface bird extends animal{ public function fly();
}
/*
// 下面有誤,monkey繼承的aniaml接口,因此必須要把eat()實(shí)現(xiàn)
class Human implements monkey,wisdom { public function run() { echo '走'; } public function cry() { echo '哭'; } public function think() { echo '思考'; }
}
*/
class Human implements monkey,wisdom { public function eat() { echo '吃'; } public function run() { echo '走'; } public function cry() { echo '哭'; } public function think() { echo '思考'; }
}
?>
<?php
//04.php
/***
====筆記部分====
面向?qū)ο蟮囊粋€(gè)觀點(diǎn):
做的越多,越容易犯錯(cuò)
抽象類{就定義類模板}--具體子類實(shí)現(xiàn){china,japan,english}
接口:
***/
// 抽象的數(shù)據(jù)庫(kù)類
/*
創(chuàng)業(yè)做網(wǎng)站
到底用什么數(shù)據(jù)庫(kù)? mysql, oracle,sqlserver,postgresql?
這樣:先開(kāi)發(fā)網(wǎng)站,運(yùn)行再說(shuō).
先弄個(gè)mysql開(kāi)發(fā)著,正式上線了再數(shù)據(jù)庫(kù)也不遲
引來(lái)問(wèn)題:
換數(shù)據(jù)庫(kù),會(huì)不會(huì)以前的代碼又得重寫(xiě)?
答:不必,用抽象類
開(kāi)發(fā)者,開(kāi)發(fā)時(shí),就以db抽象類來(lái)開(kāi)發(fā).
*/
abstract class db { public abstract function connect($h,$u,$p); public abstract function query($sql); public abstract function close();
}
/*
// 下面這個(gè)代碼有誤
// 因?yàn)樽宇悓?shí)現(xiàn)時(shí), connect和抽象類的connect參數(shù)不一致
class mysql extends db { public function connect($h,$h) { return true; } public function query($sql,$conn) { } public function close() { }
}
*/
/*
下面這個(gè)mysql類,嚴(yán)格實(shí)現(xiàn)了db抽象類
試想: 不管上線時(shí),真正用什么數(shù)據(jù)庫(kù)
我只需要再寫(xiě)一份如下類
class oracle extends db {
}
class mssql extends db {
}
class postsql extends db {
}
業(yè)務(wù)邏輯層不用改?
為什么不用改?
因?yàn)槎紝?shí)現(xiàn)的db抽象類.
我開(kāi)發(fā)時(shí),調(diào)用方法不清楚的地方,我就可以參考db抽象類.
反正子類都是嚴(yán)格實(shí)現(xiàn)的抽象類.
*/
class mysql extends db { public function connect($h,$h,$u) { return true; } public function query($sql) { } public function close() { }
}
/*
接口 就更加抽象了
比如一個(gè)社交網(wǎng)站,
關(guān)于用戶的處理是核心應(yīng)用.
登陸
退出
寫(xiě)信
看信
招呼
更換心情
吃飯
罵人
搗亂
示愛(ài)
撩騷
這么多的方法,都是用戶的方法,
自然可以寫(xiě)一個(gè)user類,全包裝起來(lái)
但是,分析用戶一次性使不了這么方法
用戶信息類:{登陸,寫(xiě)信,看信,招呼,更換心情,退出}
用戶娛樂(lè)類:{登陸,罵人,搗亂,示愛(ài),撩騷,退出}
開(kāi)發(fā)網(wǎng)站前,分析出來(lái)這么多方法,
但是,不能都裝在一個(gè)類里,
分成了2個(gè)類,甚至更多.
作用應(yīng)用邏輯的開(kāi)發(fā),這么多的類,這么多的方法,都暈了.
*/
interface UserBase { public function login($u,$p); public function logout();
}
interface UserMsg { public function wirteMsg($to,$title,$content); public function readMsg($from,$title);
}
interface UserFun { public function spit($to); public function showLove($to);
}
/*
作為調(diào)用者, 我不需要了解你的用戶信息類,用戶娛樂(lè)類,
我就可以知道如何調(diào)用這兩個(gè)類
因?yàn)? 這兩個(gè)類 都要實(shí)現(xiàn) 上述接口.
通過(guò)這個(gè)接口,就可以規(guī)范開(kāi)發(fā).
*/
/*
下面這個(gè)類,和接口聲明的參數(shù)不一樣,就報(bào)錯(cuò),
這樣,接口強(qiáng)制統(tǒng)一了類的功能
不管你有幾個(gè)類,一個(gè)類中有幾個(gè)方法
我只知道,方法都是實(shí)現(xiàn)的接口的方法.
*/
class User implements UserBase { public function login($u) { }
}
?>
<?php??? /***?? ====筆記部分====?? 接口的具體語(yǔ)法:?? 0:以人類為,?class?Human?是人的草圖?? 而接口?是零件?? 可以用多種零件組合出一種新特種來(lái).?? 1:?如上,接口本身即是抽象的,內(nèi)部聲明的方法?默認(rèn)也是抽象的.?? 不用加?abstract?? 2:?一個(gè)類可以一次性實(shí)現(xiàn)多個(gè)接口.?? 語(yǔ)法用?implements?實(shí)現(xiàn)?(把我這幾個(gè)功能實(shí)現(xiàn)了)?? class?ClassName?implements?interface1,interface2,interface3?{?? }?? 然后再把接口的功能給實(shí)現(xiàn).?? 3:?接口也可以繼承,?用extends?? 4:接口是一堆方法的說(shuō)明,不能加屬性?? 5:接口就是供組裝成類用的,封閉起來(lái)沒(méi)有意義,因此方法只能是public?? ***/??? interface?animal?{??? ????protected?function?eat();??? }??? interface?monkey?extends?animal?{??? ????public?function?run();??? ????public?function?cry();??? }??? interface?wisdom?{??? ????public?function?think();??? }??? interface?bird?extends?animal{??? ????public?function?fly();??? }??? /*?? //?下面有誤,monkey繼承的aniaml接口,因此必須要把eat()實(shí)現(xiàn)?? class?Human?implements?monkey,wisdom?{?? ????public?function?run()?{?? ????????echo?'走';?? ????}?? ????public?function?cry()?{?? ????????echo?'哭';?? ????}?? ????public?function?think()?{?? ????????echo?'思考';?? ????}?? }?? */??? class?Human?implements?monkey,wisdom?{??? ????public?function?eat()?{??? ????????echo?'吃';??? ????}??? ????public?function?run()?{??? ????????echo?'走';??? ????}??? ????public?function?cry()?{??? ????????echo?'哭';??? ????}??? ????public?function?think()?{??? ????????echo?'思考';??? ????}??? }??? ?>??? <?php??? //04.php??? /***?? ====筆記部分====?? 面向?qū)ο蟮囊粋€(gè)觀點(diǎn):?? 做的越多,越容易犯錯(cuò)?? 抽象類{就定義類模板}--具體子類實(shí)現(xiàn){china,japan,english}?? 接口:?? ***/??? //?抽象的數(shù)據(jù)庫(kù)類??? /*?? 創(chuàng)業(yè)做網(wǎng)站?? 到底用什么數(shù)據(jù)庫(kù)???mysql,?oracle,sqlserver,postgresql??? 這樣:先開(kāi)發(fā)網(wǎng)站,運(yùn)行再說(shuō).?? 先弄個(gè)mysql開(kāi)發(fā)著,正式上線了再數(shù)據(jù)庫(kù)也不遲?? 引來(lái)問(wèn)題:?? 換數(shù)據(jù)庫(kù),會(huì)不會(huì)以前的代碼又得重寫(xiě)??? 答:不必,用抽象類?? 開(kāi)發(fā)者,開(kāi)發(fā)時(shí),就以db抽象類來(lái)開(kāi)發(fā).?? */??? abstract?class?db?{??? ????public?abstract?function?connect($h,$u,$p);??? ????public?abstract?function?query($sql);??? ????public?abstract?function?close();??? }??? /*??? //?下面這個(gè)代碼有誤?? //?因?yàn)樽宇悓?shí)現(xiàn)時(shí),?connect和抽象類的connect參數(shù)不一致?? class?mysql?extends?db?{?? ????public?function?connect($h,$h)?{?? ????????return?true;?? ????}?? ????public?function?query($sql,$conn)?{?? ????}?? ????public?function?close()?{?? ????}?? }?? */??? /*?? 下面這個(gè)mysql類,嚴(yán)格實(shí)現(xiàn)了db抽象類?? 試想:?不管上線時(shí),真正用什么數(shù)據(jù)庫(kù)?? 我只需要再寫(xiě)一份如下類?? class?oracle?extends?db?{?? }?? class?mssql?extends?db?{?? }?? class?postsql?extends?db?{?? }?? 業(yè)務(wù)邏輯層不用改??? 為什么不用改??? 因?yàn)槎紝?shí)現(xiàn)的db抽象類.?? 我開(kāi)發(fā)時(shí),調(diào)用方法不清楚的地方,我就可以參考db抽象類.?? 反正子類都是嚴(yán)格實(shí)現(xiàn)的抽象類.?? */??? class?mysql?extends?db?{??? ????public?function?connect($h,$h,$u)?{??? ????????return?true;??? ????}??? ????public?function?query($sql)?{??? ????}??? ????public?function?close()?{??? ????}??? }??? /*?? 接口?就更加抽象了?? 比如一個(gè)社交網(wǎng)站,?? 關(guān)于用戶的處理是核心應(yīng)用.?? 登陸?? 退出?? 寫(xiě)信?? 看信?? 招呼?? 更換心情?? 吃飯?? 罵人?? 搗亂?? 示愛(ài)?? 撩騷?? 這么多的方法,都是用戶的方法,?? 自然可以寫(xiě)一個(gè)user類,全包裝起來(lái)?? 但是,分析用戶一次性使不了這么方法?? 用戶信息類:{登陸,寫(xiě)信,看信,招呼,更換心情,退出}?? 用戶娛樂(lè)類:{登陸,罵人,搗亂,示愛(ài),撩騷,退出}?? 開(kāi)發(fā)網(wǎng)站前,分析出來(lái)這么多方法,?? 但是,不能都裝在一個(gè)類里,?? 分成了2個(gè)類,甚至更多.?? 作用應(yīng)用邏輯的開(kāi)發(fā),這么多的類,這么多的方法,都暈了.?? */??? interface?UserBase?{??? ????public?function?login($u,$p);??? ????public?function?logout();??? }??? interface?UserMsg?{??? ????public?function?wirteMsg($to,$title,$content);??? ????public?function?readMsg($from,$title);??? }??? interface?UserFun?{??? ????public?function?spit($to);??? ????public?function?showLove($to);??? }??? /*?? 作為調(diào)用者,?我不需要了解你的用戶信息類,用戶娛樂(lè)類,?? 我就可以知道如何調(diào)用這兩個(gè)類?? 因?yàn)??這兩個(gè)類?都要實(shí)現(xiàn)?上述接口.?? 通過(guò)這個(gè)接口,就可以規(guī)范開(kāi)發(fā).?? */??? /*?? 下面這個(gè)類,和接口聲明的參數(shù)不一樣,就報(bào)錯(cuò),?? 這樣,接口強(qiáng)制統(tǒng)一了類的功能?? 不管你有幾個(gè)類,一個(gè)類中有幾個(gè)方法?? 我只知道,方法都是實(shí)現(xiàn)的接口的方法.?? */??? class?User?implements?UserBase?{??? ????public?function?login($u)?{??? ????}??? }??? ?>??
轉(zhuǎn):https://blog.csdn.net/hanliuxinming/article/details/20879965
轉(zhuǎn)載于:https://www.cnblogs.com/jimz/p/9375261.html
總結(jié)
以上是生活随笔為你收集整理的PHP中抽象类与接口的应用场景的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Salesforce 小知识:大量“子记
- 下一篇: php7 加的新特性积累