詳細(xì)解讀PHP中接口的應(yīng)用
接口
PHP類是單繼承,也就是不支持多繼承,當(dāng)一個(gè)類需要多個(gè)類的功能時(shí),繼承就無(wú)能為力了,為此PHP引入了接口技術(shù)
如果一個(gè)抽象類里面的所有方法都是抽象方法,且沒(méi)有聲明變量,而且接口里面所有的成員都是public權(quán)限的,那么這種特殊的抽象類就叫接口
接口使用interface關(guān)鍵字定義,并使用implements來(lái)實(shí)現(xiàn)接口的方法,且必須完全實(shí)現(xiàn)
實(shí)現(xiàn)一個(gè)接口
下面給出PHP接口實(shí)現(xiàn)的一個(gè)實(shí)際例子,在此創(chuàng)建并實(shí)現(xiàn)了一個(gè)名為IPillage的接口,IPillage接口如下:
interface IPillage
{
function emptyBakAccount();
function burnDocument();
}
然后通過(guò)Executive類實(shí)現(xiàn)此接口:
class Executive extends Employee implements IPillage
{
private $totalStockOptions;
function emptyBankAccount()
{
echo "Call CFO and ask to transfer funds to Swiss bank account.";
}
function burnDocuments()
{
echo "Torch the office suite.";
}
}
因?yàn)楣局兴屑?jí)別的人都能進(jìn)行侵占,所以可以有Assistant類實(shí)現(xiàn)此接口:
class Assistant extends Employee implements IPillage
{
function takeMome()
{
echo "Taking memo...";
}
function emptyBankAccount()
{
echo "Go on shopping spree with office credit card.";
}
function burnDocuments()
{
echo "Start small fire in the trash can.";
}
}
可以看到,接口特別有用。因?yàn)?,雖然它們定義了發(fā)生某一行為需要多少個(gè)方法,以及各個(gè)方法的名字,但接口允許不同的類,以不同的方式來(lái)實(shí)現(xiàn)這些方法。在這個(gè)例子中,對(duì)于燒文件的方法,Assistdnt類只是把文件在垃圾筒里燒掉,而Executive類則通過(guò)更過(guò)分的方式來(lái)做到(將它的辦公室燒掉)。
實(shí)現(xiàn)多個(gè)接口
如果我們?cè)试S外來(lái)承包商侵占公司是不公平的,畢竟公司是在所有全職員工的努力之下建立的。就是說(shuō),怎樣為員工提供工作和侵占公司的功能,而限制承包商只能完成所需的任務(wù)呢?解決的辦法是將這些任務(wù)分成幾項(xiàng)任務(wù),然后實(shí)現(xiàn)必要的多個(gè)接口。PHPS 支持這個(gè)特性??紤]如下例子:
<?php
interface IEmployee{...}
interface IDeveloper{...}
interface IPillage{...}
class Employee implements IEmployee,IDeveloper,iPillage {
...
}
class Contractor implements IEmployee,IDeveloper {
...
}
?>
抽象類和接口的區(qū)別
接口是一個(gè)特殊的抽象類,也可以看作是一個(gè)模型的規(guī)范。接口與抽象類大致區(qū)別如下:
一個(gè)子類如果implements一個(gè)接口,就必須實(shí)現(xiàn)接口中的所有方法(不管是否需要);如果繼承一個(gè)抽象類,只需要實(shí)現(xiàn)需要的方法即可
如果一個(gè)接口中定義的方法名改變了,那么所有實(shí)現(xiàn)此接口的子類需要同步更新方法名;而抽象類中如果方法名改變了,其子類對(duì)應(yīng)的方法名將不受影響,只是變成了一個(gè)新的方法而已
抽象類只能單繼承,當(dāng)一個(gè)子類需要實(shí)現(xiàn)的功能需要繼承多個(gè)父類時(shí),就必須使用接口
代碼示例
<?php
/**
* 聲明接口Demo
* @author wzy
*
*/
interface Demo
{
const NAME = "wangzhengyi";
const AGE = 25;
function fun1 (); // 聲明方法默認(rèn)是public abstract
function fun2 ();
}
/**
* 聲明接口的繼承Demo2
*
* @author wzy
*
*/
interface Demo2 extends Demo
{
function fun3 ();
function fun4 ();
}
/**
* 聲明接口Demo3
*
* @author wzy
*
*/
interface Demo3
{
function fun5 ();
function fun6 ();
}
/**
* 聲明父類ParentClass
*
* @author wzy
*
*/
class ParentClass
{
function fun7 ();
}
/**
* 子類必須實(shí)現(xiàn)接口中所有的方法
*
* @author wzy
*
*/
class ChildClass extends ParentClass implements Demo2, Demo3
{
function fun1 ();
function fun2 ();
function fun3 ();
function fun4 ();
function fun5 ();
function fun6 ();
}
相關(guān)文章
微信公眾平臺(tái)開發(fā)教程④ ThinkPHP框架下微信支付功能圖文詳解
這篇文章主要介紹了微信公眾平臺(tái)開發(fā)ThinkPHP框架下微信支付功能,結(jié)合圖文形式詳細(xì)分析了基于thinkPHP框架的微信支付功能實(shí)現(xiàn)步驟、操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2019-04-04
thinkphp中的多表關(guān)聯(lián)查詢的實(shí)例詳解
這篇文章主要介紹了thinkphp中的多表關(guān)聯(lián)查詢的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10
WordPress中轉(zhuǎn)義HTML與過(guò)濾鏈接的相關(guān)PHP函數(shù)使用解析
這篇文章主要介紹了WordPress中轉(zhuǎn)義Html與過(guò)濾鏈接的相關(guān)函數(shù)使用解析,分別為esc_html()函數(shù)和esc_url()函數(shù)的用法,需要的朋友可以參考下2015-12-12
PHP在線調(diào)試執(zhí)行的實(shí)現(xiàn)方法(附demo源碼)
這篇文章主要介紹了PHP在線調(diào)試執(zhí)行的實(shí)現(xiàn)方法,實(shí)例分析了PHP實(shí)現(xiàn)在線調(diào)試運(yùn)行的原理,步驟與具體實(shí)現(xiàn)代碼,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2016-04-04
PHP實(shí)現(xiàn)數(shù)組根據(jù)某個(gè)字段進(jìn)行水平合并,橫向合并案例分析
這篇文章主要介紹了PHP實(shí)現(xiàn)數(shù)組根據(jù)某個(gè)字段進(jìn)行水平合并,橫向合并,結(jié)合具體案例形式分析了php數(shù)組遍歷、合并等相關(guān)操作技巧,需要的朋友可以參考下2019-10-10

