Spl

**PHP 標準函式庫**（**Standard PHP Library**，縮寫：**SPL**），是 PHP5.0 之後新添加的重要函式庫。它提供了一系列的介面（interface）和類別（classes）解決網站開發中普遍碰到的問題。原始碼在 ext/spl 目錄下。

## 介紹

SPL 主要提供了以下幾個方面的內容：

* iterator：迭代器，這是 SPL 中最重要的內容。它提供了一系列的介面和內建迭代器類別。
* exception：異常類別，它聲明一了組和 C++ 標準的異常類別。
* Observer：觀察者模式，觀察者模式在 MVC 中經常用到。
* 以及一些單體函式。

## SPL 主要的類別

## 主要介面

* ArrayAccess：其功能是使類別可以像 PHP 中的陣列一樣操作。有點類似於.NET 平台的 index 操作。
* Traversable：是 Zend 引擎的內建介面，它是能讓類別用於 foreach 語句的介面，但是在 PHP 中並不能直接實現 Traversable。只能間接地通過 Iterator 或 IteratorAggregate 介面實現。
* IteratorAggregate（繼承 Traversable，是他的兒子）是除 Iterator 之外另一個從 Traversable 介面中繼承而來的。其介面也很簡單，只有一個函式。就是返回一個迭代器實例。
* Iterator（也是繼承 Traversable，是他的兒子），SPL 中大部分介面和類別都是從這個介面繼承而來的。
* RecursiveIterator（繼承 Iterator，為 Traversable 的孫子），遞迴迭代器，通過 hasChildre () 和 getChildren () 兩個函式實現遞迴遍歷子元素。
* Countable：這介面就一個 count () 函式，返回結果集的數量。實現這個介面的類別可以用 count () 函式查詢其結果集。
* Serializable：該介面實現序列化和反序列化的介面。在沒有 SPL 之前，可以通過 \_\_sleep () 和 \_\_wakeup () 實現相同的功能，若同時實現了 Serializable 介面和 \_sleep () 和 \_\_wakeup ()，則只有 Serializable 介面的函式啟作用。
* OuterIterator：它的實現者可以包含一個或多個迭代器成員，即可以通過 getInnerIterator () 介面函式取得內部的迭代器，也可以直接通過類別本身實現的 Iterator 介面遍歷內部的迭代器資料。這在 SPL 是一個非常重要的介面，SPL 中很多內建的迭代器實現了這個介面。
* SplObserver：觀察者模式的中的觀察者介面。
* SplSubject：觀察者模式的中的發布者介面。

## 主要類別

* DirectoryIterator：這個類別用來檢視一個目錄中的所有檔案和子目錄。
* FilterIterator：這是一個抽象類別，它實現了 OuterIterator 介面。它包裝一個已有的迭代器類別，通過抽象方法 accept () 過濾掉不需要的內容，形成一個新的迭代器。
* LimitIterator：這也是一個實現 OuterIterator 的類別。它有點類似於 SQL 中的 LIMIT 語句。它通過包裝一個已有迭代器，然後截取其中某一段資料形成一個新的迭代器。
* RecursiveDirectoryIterator：遞迴檢視一個目錄中的所有檔案的子目錄。
* SimpleXMLIterator：一個遍歷 XML 內容的類別
* IteratorIterator：實現對迭代器的包裝，這也是 SPL 中對 OuterIterator 預設實現。
* InfiniteIterator：從字面意思就知道，這是個無限迴圈的迭代器，當 next () 到達最後時，會自動呼叫 rewind () 函式，又從頭開始。
* AppendIterator：它實現了對一系統迭代器的包裝，並且可以在執行過程中添加新的迭代器。
* SplFileInfo：取得檔案資訊類別。SplFileObject 從該類別繼承。
* SplFileObject：檔案操作類別，可以按行的方式遍歷檔案內容。同時還能取得檔案的大小及其它詳細資訊。

## 異常類別

* Exception：異常基礎類別
  * LogicException：邏輯錯誤異常類別。
    * BadFunctionCallException：不合法的函式被呼叫產生的異常類別。
    * BadMethodCallException：不合法的方法被呼叫產生的異常類別。
    * DomainException：表示一個值不在有效範圍內的異常。
    * InvalidArgumentException：表示傳遞了無效的參數產生的異常。
    * LengthException：表示一個參數超過了許可的長度的異常。
    * OutOfRangeException：表示請求檢索超越了陣列等容器最大長度的異常。
  * RuntimeException：執行時錯誤異常類別。
    * OutOfBoundsException：表示請求檢索超越了陣列等容器最大長度的異常。
    * OverflowException：表示演算法 / 緩衝區溢位異常。
    * RangeException：執行期間的範圍異常。
    * UnderflowException：執行期間的演算法 / 快取的向下溢位異常。

## 一此其它函式

* iterator\_apply：為迭代器中每個元素呼叫一個使用者自訂函式
* iterator\_count：計算迭代器中元素的個數
* iterator\_to\_array：將迭代器中的元素拷貝到陣列
* spl\_autoload\_call：嘗試呼叫所有已註冊的 \_\_autoload () 函式來裝載請求類別
* spl\_autoload\_extensions：註冊並返回 spl\_autoload 函式使用的預設副檔名。
* spl\_autoload\_functions：返回所有已註冊的 \_\_autoload () 函式。
* spl\_autoload\_register：註冊 \_\_autoload () 函式
* spl\_autoload\_unregister：註銷已註冊的 \_\_autoload () 函式
* spl\_autoload \_\_autoload ()：函式的預設實現
* spl\_classes：返回所有可用的 SPL 類別

## 6.0 中新增的資料結構

* SplDoublyLinkedList
* SplStack
* SplQueue
* SplHeap
* SplMaxHeap
* SplMinHeap
* SplPriorityQueue
* SplFixedArray 這是個固定大小的陣列，效能比系統內建的 array () 要快些。
* SplObjectStorage

## 參考

## 外部連結

* http://www.php.net/~helly/php/ext/spl/（頁面存檔備份，存於網際網路檔案館）
* http://www.caixw.com/archives/intro-to-spl-iterator.html（頁面存檔備份，存於網際網路檔案館）