PHP SPL(PHP 標準庫)

  一.什麼是SPL?php

    SPL是用於解決典型問題(standard problems)的一組接口與類的集合。(出自:http://php.net/manual/zh/intro.spl.phphtml

    SPL,PHP 標準庫(Standard PHP Library) ,從 PHP 5.0 起內置的組件和接口,且從 PHP5.3 已逐漸的成熟。SPL 在全部的 PHP5 開發環境中被內置,同時無需任何設置。node

  二.如何使用?python

    SPL提供了一組標準數據結構:數組

    雙向鏈表數據結構

    雙鏈表是一種重要的線性存儲結構,對於雙鏈表中的每一個節點,不單單存儲本身的信息,還要保存前驅和後繼節點的地址。this

    PHP SPL中的SplDoublyLinkedList類提供了對雙鏈表的操做。spa

    SplDoublyLinkedList類摘要以下:.net

 1 SplDoublyLinkedList implements Iterator  , ArrayAccess  , Countable  {
 2   
 3   public __construct ( void )
 4   public void add ( mixed $index , mixed $newval )
 5   //雙鏈表的頭部節點
 6   public mixed top ( void )
 7   //雙鏈表的尾部節點
 8   public mixed bottom ( void )
 9   //雙聯表元素的個數
10   public int count ( void )
11   //檢測雙鏈表是否爲空
12   public bool isEmpty ( void )
13   
14   
15   //當前節點索引
16   public mixed key ( void )
17   //移到上條記錄
18   public void prev ( void )
19   //移到下條記錄
20   public void next ( void )
21   //當前記錄
22   public mixed current ( void )
23   //將指針指向迭代開始處
24   public void rewind ( void )
25   //檢查雙鏈表是否還有節點
26   public bool valid ( void )
27   
28   //指定index處節點是否存在
29   public bool offsetExists ( mixed $index )
30   //獲取指定index處節點值
31   public mixed offsetGet ( mixed $index )
32   //設置指定index處值
33   public void offsetSet ( mixed $index , mixed $newval )
34   //刪除指定index處節點
35   public void offsetUnset ( mixed $index )
36   
37   //從雙鏈表的尾部彈出元素
38   public mixed pop ( void )
39   //添加元素到雙鏈表的尾部
40   public void push ( mixed $value )
41   
42   //序列化存儲
43   public string serialize ( void )
44   //反序列化
45   public void unserialize ( string $serialized )
46   
47   //設置迭代模式
48   public void setIteratorMode ( int $mode )
49   //獲取迭代模式SplDoublyLinkedList::IT_MODE_LIFO (Stack style) SplDoublyLinkedList::IT_MODE_FIFO (Queue style)
50   public int getIteratorMode ( void )
51   
52   //雙鏈表的頭部移除元素
53   public mixed shift ( void )
54   //雙鏈表的頭部添加元素
55   public void unshift ( mixed $value )
56   
57 }

     

    使用起來也比較簡單設計

 1 $list = new SplDoublyLinkedList();
 2 $list->push('a');
 3 $list->push('b');
 4 $list->push('c');
 5 $list->push('d');
 6 
 7 $list->unshift('top');
 8 $list->shift();
 9 
10 $list->rewind();//rewind操做用於把節點指針指向Bottom所在的節點
11 echo 'curren node:'.$list->current()."<br />";//獲取當前節點
12 
13 $list->next();//指針指向下一個節點
14 echo 'next node:'.$list->current()."<br />";
15 
16 $list->next();
17 $list->next();
18 $list->prev();//指針指向上一個節點
19 echo 'next node:'.$list->current()."<br />";
20 
21 if($list->current())
22     echo 'current node is valid<br />';
23 else
24     echo 'current node is invalid<br />';
25 
26 
27 if($list->valid())//若是當前節點是有效節點,valid返回true
28     echo "valid list<br />";
29 else
30     echo "invalid list <br />";
31 
32 
33 var_dump(array(
34     'pop' => $list->pop(),
35     'count' => $list->count(),
36     'isEmpty' => $list->isEmpty(),
37     'bottom' => $list->bottom(),
38     'top' => $list->top()
39 ));
40 
41 $list->setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO);
42 var_dump($list->getIteratorMode());
43 
44 for($list->rewind(); $list->valid(); $list->next()) {
45     echo $list->current().PHP_EOL;
46 }
47 
48 var_dump($a = $list->serialize());
49 //print_r($list->unserialize($a));
50 
51 $list->offsetSet(0,'new one');
52 $list->offsetUnset(0);
53 var_dump(array(
54     'offsetExists' => $list->offsetExists(4),
55     'offsetGet' => $list->offsetGet(0),
56 
57 ));
58 var_dump($list);
59 
60 //堆棧,先進後出
61 $stack = new SplStack();//繼承自SplDoublyLinkedList類
62 
63 $stack->push("a<br />");
64 $stack->push("b<br />");
65 
66 echo $stack->pop();
67 echo $stack->pop();
68 echo $stack->offsetSet(0,'B');//堆棧的offset=0是Top所在的位置,offset=1是Top位置節點靠近bottom位置的相鄰節點,以此類推
69 $stack->rewind();//雙向鏈表的rewind和堆棧的rewind相反,堆棧的rewind使得當前指針指向Top所在的位置,而雙向鏈表調用以後指向bottom所在位置
70 echo 'current:'.$stack->current().'<br />';
71 
72 $stack->next();//堆棧的next操做使指針指向靠近bottom位置的下一個節點,而雙向鏈表是靠近top的下一個節點
73 echo 'current:'.$stack->current().'<br />';
74 echo '<br /><br />';
75 
76 //隊列,先進先出
77 $queue = new SplQueue();//繼承自SplDoublyLinkedList類
78 
79 $queue->enqueue("a<br />");//插入一個節點到隊列裏面的Top位置
80 $queue->enqueue("b<br />");
81 
82 $queue->offsetSet(0,'A');//堆棧的offset=0是Top所在的位置,offset=1是Top位置節點靠近bottom位置的相鄰節點,以此類推
83 
84 echo $queue->dequeue();
85 echo $queue->dequeue();
86 
87 echo "<br /><br />";

 

    堆

    堆(Heap)就是爲了實現優先隊列而設計的一種數據結構,它是經過構造二叉堆(二叉樹的一種)實現。根節點最大的堆叫作最大堆或大根堆(SplMaxHeap),根節點最小的堆叫作最小堆或小根堆(SplMinHeap)。二叉堆還經常使用於排序(堆排序)。

    SplHeap類摘要以下:

 1 abstract SplHeap implements Iterator , Countable {
 2   /* 方法 */
 3   public __construct ( void )
 4   abstract protected int compare ( mixed $value1 , mixed $value2 )
 5   public int count ( void )
 6   public mixed current ( void )
 7   public mixed extract ( void )
 8   public void insert ( mixed $value )
 9   public bool isEmpty ( void )
10   public mixed key ( void )
11   public void next ( void )
12   public void recoverFromCorruption ( void )
13   public void rewind ( void )
14   public mixed top ( void )
15   public bool valid ( void )
16 }

    顯然它是一個抽象類,最大堆(SplMaxHeap)和最小堆(SplMinHeap)就是繼承它實現的。最大堆和最小堆並無額外的方法。

SplHeap簡單使用:

 1 //
 2 class MySplHeap extends SplHeap{
 3     //compare()方法用來比較兩個元素的大小,絕對他們在堆中的位置
 4     public function compare( $value1, $value2 ) {
 5         return ( $value1 - $value2 );
 6     }
 7 }
 8 
 9 $obj = new MySplHeap();
10 
11 $obj->insert(0);
12 $obj->insert(1);
13 $obj->insert(2);
14 $obj->insert(3);
15 $obj->insert(4);
16 
17 echo $obj->top();//4
18 echo $obj->count();//5
19 
20 foreach ($obj as $item) {
21     echo $item."<br />";
22 }

    

    隊列

優先隊列也是很是實用的一種數據結構,能夠經過加權對值進行排序,因爲排序在php內部實現,業務代碼中將精簡很多並且更高效。經過SplPriorityQueue::setExtractFlags(int  $flag)設置提取方式能夠提取數據(等同最大堆)、優先級、和二者都提取的方式。

    SplPriorityQueue類摘要以下:

 1 SplPriorityQueue implements Iterator , Countable {
 2   /* 方法 */
 3   public __construct ( void )
 4   public int compare ( mixed $priority1 , mixed $priority2 )
 5   public int count ( void )
 6   public mixed current ( void )
 7   public mixed extract ( void )
 8   public void insert ( mixed $value , mixed $priority )
 9   public bool isEmpty ( void )
10   public mixed key ( void )
11   public void next ( void )
12   public void recoverFromCorruption ( void )
13   public void rewind ( void )
14   public void setExtractFlags ( int $flags )
15   public mixed top ( void )
16   public bool valid ( void )
17 }

    簡單使用:

 1 $pq = new SplPriorityQueue();
 2 
 3 $pq->insert('a', 10);
 4 $pq->insert('b', 1);
 5 $pq->insert('c', 8);
 6 
 7 echo $pq->count() .PHP_EOL; //3
 8 echo $pq->current() . PHP_EOL; //a
 9 
10 /**
11  * 設置元素出隊模式
12  * SplPriorityQueue::EXTR_DATA 僅提取值
13  * SplPriorityQueue::EXTR_PRIORITY 僅提取優先級
14  * SplPriorityQueue::EXTR_BOTH 提取數組包含值和優先級
15  */
16 $pq->setExtractFlags(SplPriorityQueue::EXTR_DATA);
17 
18 while($pq->valid()) {
19     print_r($pq->current());  //a  c  b
20     $pq->next();
21 }

 

    陣列

SplFixedArray主要是處理數組相關的主要功能,與普通php array不一樣的是,它是固定長度的,且以數字爲鍵名的數組,優點就是比普通的數組處理更快。一般狀況下SplFixedArray要比php array快上20%~30%,因此若是你是處理巨大數量的固定長度數組,仍是強烈建議使用。

SplFixedArray類摘要以下:

 1 SplFixedArray implements Iterator , ArrayAccess , Countable {
 2   /* 方法 */
 3   public __construct ([ int $size = 0 ] )
 4   public int count ( void )
 5   public mixed current ( void )
 6   public static SplFixedArray fromArray ( array $array [, bool $save_indexes = true ] )
 7   public int getSize ( void )
 8   public int key ( void )
 9   public void next ( void )
10   public bool offsetExists ( int $index )
11   public mixed offsetGet ( int $index )
12   public void offsetSet ( int $index , mixed $newval )
13   public void offsetUnset ( int $index )
14   public void rewind ( void )
15   public int setSize ( int $size )
16   public array toArray ( void )
17   public bool valid ( void )
18   public void __wakeup ( void )
19 }

簡單使用:

 1 $arr = new SplFixedArray(4);
 2 $arr[0] = 'php';
 3 $arr[1] = 1;
 4 $arr[3] = 'python';
 5 
 6 //遍歷, $arr[2] 爲null
 7 foreach($arr as $v) {
 8     echo $v . PHP_EOL;
 9 }
10 
11 //獲取數組長度
12 echo $arr->getSize(); //4
13 
14 //增長數組長度
15 $arr->setSize(5);
16 $arr[4] = 'new one';
17 
18 //捕獲異常
19 try{
20     echo $arr[10];
21 } catch (RuntimeException $e) {
22     echo $e->getMessage();
23 }

 

    映射

用來存儲一組對象的,特別是當你須要惟一標識對象的時候。

 

PHP SPL SplObjectStorage類實現了Countable,Iterator,Serializable,ArrayAccess四個接口。可實現統計、迭代、序列化、數組式訪問等功能。

SplObjectStorage類摘要以下:

 1 SplObjectStorage implements Countable , Iterator , Serializable , ArrayAccess {
 2   /* 方法 */
 3   public void addAll ( SplObjectStorage $storage )
 4   public void attach ( object $object [, mixed $data = NULL ] )
 5   public bool contains ( object $object )
 6   public int count ( void )
 7   public object current ( void )
 8   public void detach ( object $object )
 9   public string getHash ( object $object )
10   public mixed getInfo ( void )
11   public int key ( void )
12   public void next ( void )
13   public bool offsetExists ( object $object )
14   public mixed offsetGet ( object $object )
15   public void offsetSet ( object $object [, mixed $data = NULL ] )
16   public void offsetUnset ( object $object )
17   public void removeAll ( SplObjectStorage $storage )
18   public void removeAllExcept ( SplObjectStorage $storage )
19   public void rewind ( void )
20   public string serialize ( void )
21   public void setInfo ( mixed $data )
22   public void unserialize ( string $serialized )
23   public bool valid ( void )
24 }

    簡單使用:

 1 class A {
 2     public $i;
 3     public function __construct($i) {
 4         $this->i = $i;
 5     }
 6 }
 7  
 8 $a1 = new A(1);
 9 $a2 = new A(2);
10 $a3 = new A(3);
11 $a4 = new A(4);
12  
13 $container = new SplObjectStorage();
14  
15 //SplObjectStorage::attach 添加對象到Storage中
16 $container->attach($a1);
17 $container->attach($a2);
18 $container->attach($a3);
19  
20 //SplObjectStorage::detach 將對象從Storage中移除
21 $container->detach($a2);
22  
23 //SplObjectStorage::contains用於檢查對象是否存在Storage中
24 var_dump($container->contains($a1)); //true
25 var_dump($container->contains($a4)); //false
26  
27 //遍歷
28 $container->rewind();
29 while($container->valid()) {
30     var_dump($container->current());
31     $container->next();
32 }
相關文章
相關標籤/搜索