PHP SPL使用方法 自動載入和迭代器

2022-07-24 09:57:10 字數 1800 閱讀 7191

spl,php 標準庫(standard php library) ,此從 php 5.0 起內建的元件和介面,並且從 php5.3 已逐漸的成熟。spl 其實在所有的 php5 開發環境中被內建,同時無需任何設定。

似乎眾多的

php 開發人員基本沒有使用它,甚至聞所未聞。究其原因,可以追述到它那陽春白雪般的說明文件,使你忽略了「它的存在」。spl

這塊寶石猶如鐵達尼的「海洋之心」般,被沉入海底。而現在它應該被我們撈起,並將它穿戴在應有的位置 ,而這也是這篇文章所要表述的觀點。

那麼,spl 提供了什麼?

spl 對 php 引擎進行了擴充套件,例如 arrayaccess、countable 和 seekableiterator

等介面,它們用於以陣列形式操作物件。同時,你還可以使用 recursiveiterator、arrayobejcts

**如下:

<?php

class myloader

}spl_autoload_register( array('myloader', 'doautoload') );

?>

正如你所見, spl autoload register 還能以陣列的形式加入多個載入邏輯。同時,你還可以利用spl autoload unregister 移除已經不再需要的載入邏輯,這功能總會用到的。

迭代器迭代是常見設計模式之一,普遍應用於一組資料中的統一的遍歷操作。可以毫不誇張的說,spl 提供了所有你需要的對應資料型別的迭代器。

有個非常好的案例就是遍歷目錄。常規的做法就是使用 scandir ,然後跳過「.「 和 「..」,以及其它未滿足條件的檔案。例如你需要遍歷個某個目錄抽取其中的檔案,就需要判斷是否是 jpg、gif 結尾。

下面的**就是使用 spl 的迭代器執行上述遞迴尋找指定目錄中的檔案的例子:

**如下:

<?php

class recursivefilefilteriterator extends filteriterator

/*** 檢查副檔名是否滿足條件

*/public function accept() }}

// 例項化

foreach (new recursivefilefilteriterator('/path/to/something') as $item)

?>

你可能會說,這不是花了更多的**去辦同一件事情嗎?那麼,檢視上面的**,你不是擁有了具有高度重用而且可以測試的**了嗎 :)

分析:想一下,如果把集合物件和對集合物件的操作放在一起,當我們想換一種方式遍歷集合物件中元素時,就需要修改集合物件了,違背「單一職責原則」,而迭代器模式將資料結構和資料結構的演算法分離開,兩者可獨立發展。

優點:

1.支援多種遍歷方式。比如有序列表,我們根據需要提供正序遍歷、倒序遍歷兩種迭代器。使用者只需要得到我們的迭代器,就可以對集合執行遍歷操作

2.簡化了聚合類。由於引入了迭代器,原有的集合物件不需要自行遍歷集合元素了

3.增加新的聚合類和迭代器類很方便,兩個維度上可各自獨立變化

4.為不同的集合結構提供乙個統一的介面,從而支援同樣的演算法在不同的集合結構上操作

缺點:

1.迭代器模式將儲存資料和遍歷資料的職責分離增加新的集合物件時需要增加對應的迭代器類,類的個數成對增加,在一定程度上增加系統複雜度

使用場景:

1.訪問乙個聚合物件內容而無須暴露它的內部顯示

2.需要為聚合物件提供多種遍歷方式

3.為遍歷不同的聚合結構提供乙個統一的介面

nodemon自動重啟工具使用方法

平時我們修改服務端 都需要手動在終端重啟server.js服務來更改頁面響應.使用以下 node server.js 而nodemon工具可以簡化操作,幫我們自動重啟服務.1.安裝 npm install g nodemon 如果報錯就在開頭加上sudo sudo npm install g nod...

pythonpip使用方法 pip使用方法整理

匯出專案已安裝的pip包 pip list 檢視專案中安裝的包 pip freeze requirements.txt 將專案中所用到的第三方庫輸出到requirements.txt中 pip install 版本號 pip install i 本次使用清華源進行安裝 離線安裝第三方庫 一鍵安裝整個...

PHP header 使用方法和介紹

header 函式向客戶端傳送原始的 http 報頭。認識到一點很重要,即必須在任何實際的輸出被傳送之前呼叫 header 函式 在 php 4 以及更高的版本中,您可以使用輸出快取來解決此問題 結果出錯 在呼叫 header 之前已存在輸出 header location header strin...