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

首頁 > 編程 > PHP > 正文

SPL標準PHP類庫(Standard PHP Library)

2020-03-22 19:02:57
字體:
來源:轉載
供稿:網友
  • 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、splhtml' target='_blank'>classes、iteratorapply 等的幫助函數(helper functions),用于重載對應的功能。

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

    重載 autoloader

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

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

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

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

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


    <?phpclass MyLoader {    public static function doAutoload($class) {        // 本模塊對應的 autoload 操作    }}spl_autoload_register( array('MyLoader', 'doAutoload') );?>

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

    迭代器

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

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

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


    <?phpclass RecursiveFileFilterIterator extends FilterIterator {    // 滿足條件的擴展名 www.it165.net    protected $ext = array('jpg','gif');    /**     * 提供 $path 并生成對應的目錄迭代器     */    public function __construct($path) {        parent::__construct(new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)));    }    /**     * 檢查文件擴展名是否滿足條件     */    public function accept() {        $item = $this->getInnerIterator();        if ($item->isFile() &&                in_array(pathinfo($item->getFilename(), PATHINFO_EXTENSION), $this->ext)) {            return TRUE;        }    }}// 實例化foreach (new RecursiveFileFilterIterator('/path/to/something') as $item) {    echo $item . PHP_EOL;}?>

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

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

    RecursiveIteratorRecursiveIteratorIteratorOuterIteratorIteratorIteratorFilterIteratorRecursiveFilterIteratorParentIteratorSeekableIteratorLimitIteratorGlobIteratorCachingIteratorRecursiveCachingIteratorNoRewindIteratorAppendIteratorRecursiveIteratorIteratorInfiniteIteratorRegexIteratorRecursiveRegexIteratorEmptyIteratorRecursiveTreeIteratorArrayIterator

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

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 玛纳斯县| 杂多县| 临城县| 石屏县| 六盘水市| 贵州省| 若羌县| 北流市| 运城市| 三台县| 万盛区| 庄浪县| 阿克陶县| 澎湖县| 石泉县| 兴义市| 修武县| 云和县| 塘沽区| 仙居县| 潮安县| 乌拉特中旗| 瓦房店市| 勃利县| 雷州市| 新乐市| 依安县| 田林县| 夏津县| 柳州市| 德昌县| 禄丰县| 莱州市| 平和县| 桦川县| 衡阳县| 定州市| 海兴县| 赤城县| 门源| 南陵县|