国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

PHP SPL 被遺落的寶石【SPL應用淺析】

2024-05-04 21:50:02
字體:
來源:轉載
供稿:網友

本文實例講述了PHP SPL應用方法。分享給大家供大家參考,具體如下:

Rafael Dohms 上面的篇文章 讓我為之驚艷,忍不住就翻譯了下來,同時補充了部分內容。

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

似乎眾多的 PHP 開發人員基本沒有使用它,甚至聞所未聞。究其原因,可以追述到它那陽春白雪般的說明文檔,使你忽略了「它的存在」。SPL 這塊寶石猶如鐵達尼的「海洋之心」般,被沉入海底。而現在它應該被我們撈起,并將它穿戴在應有的位置 ,而這也是這篇文章所要表述的觀點。

那么,SPL 提供了什么?

SPL 對 PHP 引擎進行了擴展,例如 ArrayAccess、Countable 和 SeekableIterator 等接口,它們用于以數組形式操作對象。同時,你還可以使用 RecursiveIterator、ArrayObejcts 等其他迭代器進行數據的迭代操作。

它還內置幾個的對象例如 Exceptions、SplObserver、Spltorage 以及 splautoloadregister、splclasses、iteratorapply 等的幫助函數(helper functions),用于重載對應的功能。

這些工具聚合在一起就好比是把多功能的瑞士軍刀,善用它們可以從質上提升 PHP 的代碼效率。那么,我們如何發揮它的威力?

重載 autoloader

如果你是位「教科書式的程序員」,那么你保證了解如何使用 __autoload 去代替 includes/requires 操作惰性載入對應的類,對不?

但久之,你會發現你已經陷入了困境,首先是你要保證你的類文件必須在指定的文件路徑中,例如在 Zend 框架中你必須使用「_」來分割類、方法名稱(你如何解決這一問題?)。

另外的一個問題,就是當項目變得越來越復雜, __autoload 內的邏輯也會變得相應的復雜。到最后,甚至你會加入異常判斷,以及將所有的載入類的邏輯如數寫到其中。

大家都知道「雞蛋不能放到一個籃子中」,利用 SPL 可以分離 __autoload 的載入邏輯。只需要寫個你自己的 autoload 函數,然后利用 SPL 提供的函數重載它。

例如上述 Zend 框架的問題,你可以重載 Zend loader 對應的方法,如果它沒有找到對應的類,那么就使用你先前定義的函數。

  1. <?php 
  2. class MyLoader { 
  3.   public static function doAutoload($class) { 
  4.     // 本模塊對應的 autoload 操作 
  5.   } 
  6. spl_autoload_register( array('MyLoader''doAutoload') ); 
  7. ?> 

正如你所見, spl_autoload_register 還能以數組的形式加入多個載入邏輯。同時,你還可以利用spl_autoload_unregister 移除已經不再需要的載入邏輯,這功能總會用到的。

迭代器

迭代是常見設計模式之一,普遍應用于一組數據中的統一的遍歷操作。可以毫不夸張的說,SPL 提供了所有你需要的對應數據類型的迭代器。

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

下面的代碼就是使用 SPL 的迭代器執行上述遞歸尋找指定目錄中的圖片文件的例子:

  1. <?php 
  2. class RecursiveFileFilterIterator extends FilterIterator { 
  3.   // 滿足條件的擴展名 
  4.   protected $ext = array('jpg','gif'); 
  5.   /** 
  6.    * 提供 $path 并生成對應的目錄迭代器 
  7.    */ 
  8.   public function __construct($path) { 
  9.     parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path))); 
  10.   } 
  11.   /** 
  12.    * 檢查文件擴展名是否滿足條件 
  13.    */ 
  14.   public function accept() { 
  15.     $item = $this->getInnerIterator(); 
  16.     if ($item->isFile() && 
  17.         in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) { 
  18.       return TRUE; 
  19.     } //Vevb.com 
  20.   } 
  21. // 實例化 
  22. foreach (new RecursiveFileFilterIterator('/path/to/something'as $item) { 
  23.   echo $item . PHP_EOL; 
  24. ?> 

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

下面是 SPL 提供的其他的迭代器:

  1. RecursiveIterator 
  2. RecursiveIteratorIterator 
  3. OuterIterator 
  4. IteratorIterator 
  5. FilterIterator 
  6. RecursiveFilterIterator 
  7. ParentIterator 
  8. SeekableIterator 
  9. LimitIterator 
  10. GlobIterator 
  11. CachingIterator 
  12. RecursiveCachingIterator 
  13. NoRewindIterator 
  14. AppendIterator 
  15. RecursiveIteratorIterator 
  16. InfiniteIterator 
  17. RegexIterator 
  18. RecursiveRegexIterator 
  19. EmptyIterator 
  20. RecursiveTreeIterator 
  21. ArrayIterator 

自 PHP5.3 開始,會內置其他更多的迭代器,我想你都可以嘗試下,或許它能改變你編寫傳統代碼的習慣。

SplFixedArray

SPL 還內置了一系列的數組操作工具,例如可以使用 SplFixedArray 實例化一個固定長度的數組。那么為什么要使用它?因為它更快,甚至它關系著你的工資問題 :)

我們知道 PHP 常規的數組包含不同類型的鍵,例如數字、字符串等,并且長度是可變的。正是因為這些「高級功能」,PHP 以散列(hash)的方式通過鍵得到對應的值 -- 其實這在特定情況這會造成性能問題。

而 SplFixedArray 因為是使用固定的數字鍵,所以它并沒有使用散列存儲方式。不確切的說,甚至你可以認為它就是個 C 數組。這就是為什么 SplFixedArray 會比通常數組要快的原因(僅在 PHP5.3 中)。

那到底有多快呢,下面的組數據可以讓你窺其究竟。

PHP SPL 被遺落的寶石【SPL應用淺析】

如果你需要大量的數組操作,那么你可以嘗試下,相信它是值得信賴的。

數據結構:

同時 SPL 還提供了些數據結構基本類型的實現 。雖然我們可以使用傳統的變量類型來描述數據結構,例如用數組來描述堆棧(Strack)-- 然后使用對應的方式 pop 和 push(arraypop()、arraypush()),但你得時刻小心,·因為畢竟它們不是專門用于描述數據結構的 -- 一次誤操作就有可能破壞該堆棧。

而 SPL 的 SplStack 對象則嚴格以堆棧的形式描述數據,并提供對應的方法。同時,這樣的代碼應該也能理解它在操作堆棧而非某個數組,從而能讓你的同伴更好的理解相應的代碼,并且它更快。

最后,可能上述那些慘白的例子還不足矣「誘惑你」去使用 SPL。實踐出真知,SPL 更多、更強大的功能需要你自己去挖掘。而它正如寶石般的慢慢雕砌,才能散發光輝。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 长治县| 剑阁县| 双城市| 大连市| 那坡县| 正安县| 溧水县| 安吉县| 广德县| 临颍县| 滁州市| 修武县| 腾冲县| 临沭县| 顺平县| 荆州市| 伊宁县| 刚察县| 蛟河市| 贵南县| 枣庄市| 梁河县| 安溪县| 固阳县| 青阳县| 翼城县| 武平县| 华容县| 黄山市| 平利县| 应城市| 克什克腾旗| 鄄城县| 承德市| 玛纳斯县| 乐安县| 宜州市| 诏安县| 沁水县| 雅安市| 闽侯县|