天天看點

SPL學習筆記之一:SPL簡介

      SPL(标準PHP庫)是PHP5面向對象功能中最重要的組成部分。它在5個關鍵的方面提升了PHP語言,包括:疊代器、異常、數組重載、XML以及檔案和資料處理能力。它還提供了另外一些有用的項,例如觀察者模式、計數功能、用于對象辨別符的輔助函數以及疊代器處理功能。此外,它還提供了用于自動加載類和接口的進階功能。

      在引擎層次,SPL實作了提供所有進階功能的6個類和接口。這些接口和Exception類都具有特殊性,即它們實際上與傳統的接口不同。它們擁有特别強大的功能,并且允許引擎以一種特定且特殊的方式挂接進代碼中。下面是這些元素的一個簡單介紹。

      ArrayAccess:ArrayAccess接口允許建立可以被當作數組的類。

      Exception:SPL的擴充為Exception類提供了一系列增強功能以及更多類型。

      Iterator:Iterator接口使得對象可以和諸如foreach這樣的循環結構一起工作。

      IteratorAggregate:IteratorAggregate接口允許将Iterator接口要求實作的方法放到其它類去實作。

      Serializable:Serializable接口挂接進了Serialize函數和Unserialize函數,和其他如會話這樣的功能一樣,可以確定類被正确地持久化儲存和恢複。

      Traversable:Traversable接口是由Iterator接口和IteratorAggregate接口使用的,用來确定某個類是否可以用foreach來疊代通路。這是一個内部接口,不能被使用者實作。

疊代器:

疊代器是實作了Iterator接口的類。通過實作這個接口,類可以被用在循環結構中,并且能夠提供一些進階的資料通路模式。

從循環通路對象到循環通路資料庫結果集都會用到疊代器,甚至在循環通路檔案時也可以用到疊代器。

疊代器接口方法:

current():傳回目前元素的值

key():傳回目前的鍵名稱或索引值

next():讓數組指針向前進一位指向下一個元素

rewind():将數組指針移到開頭位置

valid():判斷目前元素是否存在,必須在調用next()或rewind()方法之後才能調用這個方法

疊代器輔助函數:

iterator_to_array($iterator):這個函數可以接受任何疊代器,并且傳回一個包含疊代器中所有資料的數組

iterator_count($iterator):傳回疊代器中的元素數量值

iterator_apply($iterator, callback, [user data]):這個函數用來在疊代器中的每個元素上應用一個函數,它和在數組上使用array_walk()函數的方法時一樣的。當回調函數傳回TRUE時,循環回繼續執行,否則退出循環。

數組重載:數組重載時将對象作為數組使用的一個過程。ArrayAccess接口是這一過程的核心,它提供了挂接Zend引擎所必須的的功能。

      在将對象當作數組使用時,允許對象的用法和數組一模一樣是非常有用的。不過,ArrayAccess實作者自身并沒有定義一個計數函數,不能和count()函數一起使用。這是因為并不是所有的ArrayAccess對象都具有固定的長度。但隻要實作Countable接口,PHP的count()函數就可以正常使用了。

ArrayAccess接口方法:

offsetExists($offset):确定給定的偏移量是否存在于數組中

offsetSet($offset, $value):設定或替換給定偏移量上的資料

offsetGet($offset):傳回給定偏移量位置上的資料

offsetUnset($offset):置空指定偏移量位置上的資料

觀察者模式:觀察者模式是一種非常簡單的事件系統,包含兩個或者更多的互互相動的類。這一模式允許某個類觀察另外一個類的狀态,當被觀察者的狀态發生變化時,這個模式就會得到通知。

在觀察者模式中,被觀察的類叫做subject,而負責觀察的類叫做observer。SPL提供了SplSubject和SplObserver接口,其接口代碼如下:

interface SplSubject

{

public function attach(SplObserver $observer);

public function detach(SplObserver $observer);

public function notify();

}

interface SplObserver

{

public function update(SplSubject $subject);

}

SplSubject類維護了一個特定的狀态,當這個狀态發生變化時,它就會調用notify()方法,所有之前使用attach()方法注冊的SplObserver執行個體的update()方法都會被調用。

觀察者模式的優點在于,挂接到訂閱者上的觀察者可多可少,并且不需要提前知道哪個類會響應subject類發出的事件。

序列化:SPL的Serializable接口為一些進階的序列化場景提供了支援,提供了大量進階序列化功能。非SPL的序列化魔術方法的__sleep和__wakeup有一些問題,這些問題在SPL接口中都得到了解決。

SPL自動加載功能是由spl_autoload()、spl_autoload_register()、spl_autoload_functions()、spl_autoload_extensions()和spl_autoload_call()等函數提供的。

對象辨別符是由spl_object_hash()函數提供的,在同一次調用中對相同對象的引用可以保證對象辨別符是完全相同的。