1. 程式人生 > >PHP面向介面程式設計瞭解下(二)

PHP面向介面程式設計瞭解下(二)

通過上篇文章呢,我們對於這個面向介面程式設計有了一個基本的認知,完事這次,我們主要是來簡單延伸下我們的思維模式。

我們知道,PHP是弱型別語言,而且呼叫比較靈活,所以本人並不推薦大規模使用介面,可以在部分‘核心’程式碼中使用介面。

並且呢,因為PHP中的介面已經失去了很多介面本應該具有的語義,所以,從這方面考慮的話,我們可以在使用介面的地方,更多地使用抽象類。

另外呢,PHP5對面向物件的特性做了許多增強,其中就有一個SPL(標準PHP庫),它所實現的一些介面中,最主要的就是iterator迭代器介面,通過這個介面,我們就可以使物件用於foreach結構,從而在使用形式上,比較統一,網上有一句話是個例子,但是我沒看太懂,如:SPL中有一個directoryiterator類,這個類在繼承splfileinfo類的同時,會實現iterator,traversable,seekableitor這三個介面,那麼這個類的例項可以獲得父類splfileinfo的全部功能外,還能夠實現iterator介面所展示的那些操作。大概就是這句話了,反正是一臉蒙逼,那幾個類具體是什麼我不太清楚,但是它們的關係,我就理解了,換成我們熟悉的就好了。

來看下iterator介面的原型:

如果一個類,聲明瞭實現iterator介面,那麼它主要就是實現上述的幾個方法,這是必須的啊。

如果實現了上述的幾個方法,我們就可以很容易的對這個類的例項進行迭代,那個directoryiterator類,之所以可以拿來就用,就是因為系統已經實現了iterator這個介面。

我們先來看下DirectoryIterator類的一個簡單的使用小案例:

$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $key => $value) {
    if(!$value->isDir()){
        echo $value->getFilename().PHP_EOL;
        echo $value->getSize().PHP_EOL;
    }
}
die;

通過上述程式碼,我們可以看到,不使用DirectoryIterator類的話,我們也可以做到相同的事情,但是程式碼量肯定要增加,完事迴圈時候的風格也不統一了。

然而,我們如果寫自己的類實現了iterator介面,那麼我們就可以像使用DirectoryIterator類那樣,來進行操作了。

到這裡我們就會疑問了,為什麼一個類只要實現了iterator介面,其物件就可以像上述程式碼似的,可以使用統一風格的foreach迴圈???

原因其實很簡單,在對PHP例項物件使用foreach語法時,系統會檢測這個例項有沒有實現iterator介面,如果實現了,就會通過內建方法或者使用實現類中的方法模擬foreach語句。實際上,魔術方法tostrin就是介面的一種變相實現。

介面呢,它就是這樣,它本身什麼也不做,系統在內部悄悄地實現了介面的行為,所以,只要實現了這個介面,就可以使用介面提供的方法,這就是‘即插即用’的思想。

我們都知道,介面是對多重繼承的一種變相實現,而在瞭解繼承這個東西的時候,我們瞭解過一個用來實現混入式的traits,實際上這個traits也可以看做是一種加強型的介面。

來看段程式碼感受下traits的用法:

trait Lu{
    public function name_lu()
    {
        echo 'lu ';
    }
}

trait Ya{
    public function name_ya()
    {
        echo 'ya ';
    }
}

trait Ran{
    public function name_ran()
    {
        echo 'ran ';
    }
}


class MyLove{
    
    use Lu,Ya,Ran;

    public function say_my_love()
    {
        echo 'is my lover.';
    }
}

$obj = new MyLove();
$obj->name_lu();
$obj->name_ya();
$obj->name_ran();
$obj->say_my_love();
die;

上述程式碼中的MyLove同時實現了三個traits,從而使其可以分別從多個traits中呼叫不同的程式碼段,我們可以看出,和介面很相像,不過不相同的就是traits可以匯入包含程式碼的介面,我們從某種意義上可以把traits和介面都看做是對多重繼承的一種便想實現。

本文最末呢,咱們來總結下有關於介面的幾個概念:

  1. 介面它作為一種規範和契約來存在,它作為規範,介面應該保證可用性,作為契約呢,介面也同樣應該保證可控性
  2. 介面,它只是一個宣告,一旦使用interface關鍵字,就應該實現它,可以由程式人員實現(外部),也可以由系統內部實現,而它本身,什麼都不需要做,但是它會告訴我們,它能做什麼
  3. PHP中的介面有兩個不足,一是沒有契約限制,二是缺少足夠多的內部介面

總的來說呢,介面很簡單 ,但是介面的各種應用又很靈活,在我們比較熟悉的設計模式中,也有很大一部分是圍繞介面來展開的,咱這裡就不廢話了。

好啦,本次記錄就到這裡了。

如果感覺不錯的話,請多多點贊支援哦。。。