成人免费网站黄色电影一级片_欧美成人在线播放亚洲_日产一区二区三区无码不卡视频_欧美精品_99爱这里只有精品

對(duì)PHP接口的思考

日期:2016-10-25 21:18:00     閱讀:417     文章來(lái)源:源美網(wǎng)絡(luò)     標(biāo)籤:深圳網(wǎng)站建設(shè),php接口

大家好,在這裡【源美設(shè)計(jì)】就和大家一起談下關(guān)於對(duì)PHP接口的思考,我們在PHP的接口自始至終一直在被爭(zhēng)議,有人說(shuō)接口很好,有人說(shuō)接口像雞肋。首先要明白,好和不好的判斷標(biāo)準(zhǔn)是什麼。無(wú)疑,這是和Java/C++相比。在上面的例子中,已經(jīng)討論了PHP的接口在「面向契約編程」中是不足的,並沒有起到應(yīng)有的作用。

其實(shí),在上面的interface.php代碼中,machine類(lèi)的聲明應(yīng)該在plain類(lèi)前面。接口提供了一套規(guī)範,這是系統(tǒng)提供的,然後machine類(lèi)提供一組針對(duì)接口的API並實(shí)現(xiàn),最後才是自定義的類(lèi)。在Java裡,接口之所以盛行(多線(xiàn)程的runable接口、容器的collection接口等)就是因為系統(tǒng)為我們做了前面兩(liǎng)部分的工作,而程式設(shè)計(jì)師,只需要去寫(xiě)具體的實(shí)現(xiàn)類(lèi),就能保證接口可用可控。

為什麼要用接口?接口到底有什麼好處?接口本身並不提供實(shí)現(xiàn),只是提供一個(gè)規(guī)範。如果我們知道一個(gè)類(lèi)實(shí)現(xiàn)了某個(gè)接口,那麼就知道了可以調(diào)用該接口的哪些方法,我們只需要知道這些就夠了。

PHP中,接口的語義是有限的,使用接口的地方並不多,PHP中接口可以淡化為設(shè)計(jì)文檔,起到一個(gè)團(tuán)隊(duì)基本契約的作用,代碼如下所示:

<?php

interface cache{

/**

@describe:緩存管理,項(xiàng)目經(jīng)理定義接口,技術(shù)人員負(fù)責(zé)實(shí)現(xiàn)

**/

const maxKey=10000;//最大緩存量

public function getc($key);//獲取緩存

public function setc($key,$value);//設(shè)置緩存

public function flush();//清空緩存

PHP是強(qiáng)調(diào)靈活,所以並不推薦大規(guī)模使用接口,而是僅在部分「內(nèi)核」代碼中使用接口,因為PHP中的接口已經(jīng)失去很多接口應(yīng)該具有的語義。從語義上考慮,可以更多地使用抽象類(lèi)。至於抽象類(lèi)和接口的比較,不再贅述。

另外,PHP5對(duì)面向對(duì)象的特性做了許多增強(qiáng),其中就有一個(gè)SPL(標(biāo)準(zhǔn)PHP庫(kù))的嘗試。SPL中實(shí)現(xiàn)一些接口,其中最主要的就是Iterator迭代器接口,通過(guò)實(shí)現(xiàn)這個(gè)接口,就能使對(duì)象能夠用於foreach結(jié)構(gòu),從而在使用形式上比較統(tǒng)一。比如SPL中有一個(gè)DirectoryIterator類(lèi),這個(gè)類(lèi)在繼承SplFileInfo類(lèi)的同時(shí),實(shí)現(xiàn)Iterator、Traversable、SeekableIterator這三個(gè)接口,那麼這個(gè)類(lèi)的實(shí)例可以獲得父類(lèi)SplFileInfo的全部功能外,還能夠實(shí)現(xiàn)Iterator接口所展示的那些操作。

Iterator接口的原型如下:

*current()

This method returns the current index's value.You are solely

responsible for tracking what the current index is as the

interface does not do this for you.

*key()

This method returns the value of the current index's key.For

foreach loops this is extremely important so that the key

value can be populated.

*next()

This method moves the internal index forward one entry.

*rewind()

This method should reset the internal index to the first element.

*valid()

This method should return true or false if there is a current

element.It is called after rewind()or next(). 

如果一個(gè)類(lèi)聲明了實(shí)現(xiàn)Iterator接口,就必須實(shí)現(xiàn)這五個(gè)方法,如果實(shí)現(xiàn)了這五個(gè)方法,那麼就可以很容易對(duì)這個(gè)類(lèi)的實(shí)例進(jìn)行迭代。這裡,DirectoryIterator類(lèi)之所以拿來(lái)就能用,是因為系統(tǒng)已經(jīng)實(shí)現(xiàn)了Iterator接口,所以可以像下面這樣使用:

<?php

$dir=new DirectoryIterator(dirname(_FILE_));

foreach($dir as$fileinfo){

if(!$fileinfo->isDir()){

echo

$fileinfo->getFilename(),"\t",$fileinfo->getSize(),PHP_EOL;

}

可以想像,如果不用DirectoryIterator類(lèi),而是自己實(shí)現(xiàn),不但代碼量增加了,而且循環(huán)時(shí)候的風(fēng)格也不統(tǒng)一了。如果自己寫(xiě)的類(lèi)也實(shí)現(xiàn)了Iterator接口,那麼就可以像Iterator那樣工作。

為什麼一個(gè)類(lèi)只要實(shí)現(xiàn)了Iterator迭代器,其對(duì)象就可以被用作foreach的對(duì)象呢?其實(shí)原因很簡(jiǎn)單,在對(duì)PHP實(shí)例對(duì)象使用foreach語法時(shí),會(huì)檢查這個(gè)實(shí)例有沒有實(shí)現(xiàn)Iterator接口,如果實(shí)現(xiàn)了,就會(huì)通過(guò)內(nèi)置方法或使用實(shí)現(xiàn)類(lèi)中的方法模擬foreach語句。這是不是和前面提到的_toString方法的實(shí)現(xiàn)很像呢?事實(shí)上,_toString方法就是接口的一種變相實(shí)現(xiàn)。

接口就是這樣,接口本身什麼也不做,系統(tǒng)悄悄地在內(nèi)部實(shí)現(xiàn)了接口的行為,所以只要實(shí)現(xiàn)這個(gè)接口,就可以使用接口提供的方法。這就是接口「即插即用」思想。

我們都知道,接口是對(duì)多重繼承的一種變相實(shí)現(xiàn),而在講繼承時(shí),我們提到了用來(lái)實(shí)現(xiàn)混入(Mixin)式的Traits,實(shí)際上,Traits可以被視為一種加強(qiáng)型的接口。

來(lái)看一段代碼:

<?php

trait Hello{

public function sayHello(){

echo'Hello';

}

}

trait World{

public function sayWorld()

echo'World';

}

}

class MyHelloWorld{

use Hello,World;

public function sayExclamationMark(){

echo'!';

}

}

$o = new MyHelloWorld();

$o ->sayHello();

$o ->sayWorld();

$o ->sayExclamationMark();

?> 

上面的代碼運(yùn)行結(jié)果如下:

Hello World! 

這裡的MyHelloWorld同時(shí)實(shí)現(xiàn)了兩(liǎng)個(gè)Traits,從而使其可以分別調(diào)用兩(liǎng)個(gè)Traits裡的代碼段。從代碼中就可以看出,Traits和接口很像,不同的是Traits是可以導(dǎo)入包含代碼的接口。從某種意義上來(lái)說(shuō),Traits和接口都是對(duì)「多重繼承」的一種變相實(shí)現(xiàn)。

總結(jié)關(guān)於接口的幾個(gè)概念:

接口作為一種規(guī)範和契約存在。作為規(guī)範,接口應(yīng)該保證可用性;作為契約,接口應(yīng)該保證可控性。

接口只是一個(gè)聲明,一旦使用interface關(guān)鍵字,就應(yīng)該實(shí)現(xiàn)它。可以由程式設(shè)計(jì)師實(shí)現(xiàn)(外部接口),也可以由系統(tǒng)實(shí)現(xiàn)(內(nèi)部接口)。接口本身什麼都不做,但是它可以告訴我們它能做什麼。

PHP中的接口存在兩(liǎng)個(gè)不足,一是沒有契約限制,二是缺少足夠多的內(nèi)部接口。

接口其實(shí)很簡(jiǎn)單,但是接口的各種應(yīng)用很靈活,設(shè)計(jì)模式中也有很大一部分是圍繞接口展開(kāi)的。



文章引用:http://www.szymweb.com/new/142.html

本站文章為深圳網(wǎng)站建設(shè)·源美網(wǎng)絡(luò)原創(chuàng)策劃(huà),如有版權(quán)糾紛或者違規(guī)問(wèn)題,請聯(lián)繫我們刪除,謝謝!

最新案例
OUR ADVANTAGE WORKS

售後保障

承諾任何問(wèn)題1小時(shí)內(nèi)解決

數(shù)據(jù)備份

更安全、更高效、更穩(wěn)定

價(jià)格公道精準(zhǔn)

項(xiàng)目經(jīng)理精準(zhǔn)報(bào)價(jià)不弄虛作假

合作無(wú)風(fēng)險(xiǎn)

重合同講信譽(yù),無(wú)效全額退款