国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

【SPL標準庫專題(1)】SPL簡介

GeekGhc / 3308人閱讀

摘要:什么是是標準庫的縮寫。根據(jù)官方定義,它是是用于解決典型問題的一組接口與類的集合。而的對象則嚴格以堆棧的形式描述數(shù)據(jù),并提供對應的方法。返回所有已注冊的函數(shù)。

什么是SPL

SPL是Standard PHP Library(PHP標準庫)的縮寫。

根據(jù)官方定義,它是"a collection of interfaces and classes that are meant to solve standard problems" SPL是用于解決典型問題(standard problems)的一組接口與類的集合。 但是,目前在使用中,SPL更多地被看作是一種使object(物體)模仿array(數(shù)組)行為的interfaces和classes。SPL的核心概念就是Iterator。

在我的理解中,SPL以及后面要說的設計模式專題都是用于同一個目的: 構(gòu)建優(yōu)雅簡潔易于擴展和維護的代碼,有時候我們看上去寫了更多的代碼,但事實上卻讓代碼的擴展性和維護性變得更強。

另外本專題屬于PHP進階課程。在本專題中給出的一些Example,看上去是有更簡單的替代方案,但在實際上在更復雜的開發(fā)中,看似更多的代碼卻使得程序的可插拔性,可維護性變得更強,SPL以及設計模式都算是面向?qū)ο笾械木枇?,所以面向?qū)ο蟮幕A一定要掌握得非常牢才更能理解;
Iterator

迭代器有時又稱光標(cursor)是程式設計的軟件設計模式,可在容器物件(container,例如list或vector)上遍訪的接口,設計人員無需關心容器物件的內(nèi)容。
PHP5開始支持了接口, 并且內(nèi)置了Iterator接口, 所以如果你定義了一個類,并實現(xiàn)了Iterator接口,那么你的這個類對象就是ZEND_ITER_OBJECT,否則就是ZEND_ITER_PLAIN_OBJECT.對于ZEND_ITER_PLAIN_OBJECT的類,foreach會通過HASH_OF獲取該對象的默認屬性數(shù)組,然后對該數(shù)組進行foreach。
而對于ZEND_ITER_OBJECT的類對象,則會通過調(diào)用對象實現(xiàn)的Iterator接口相關函數(shù)來進行foreach。
通俗地說,Iterator能夠使許多不同的數(shù)據(jù)結(jié)構(gòu),都能有統(tǒng)一的操作界面,比如一個數(shù)據(jù)庫的結(jié)果集、同一個目錄中的文件集、或者一個文本中每一行構(gòu)成的集合。

如果按照普通情況,遍歷一個MySQL的結(jié)果集,程序需要這樣寫:

// Fetch the "aggregate structure"
$result = mysql_query("SELECT * FROM users");

// Iterate over the structure
while ( $row = mysql_fetch_array($result) ) {
   // do stuff with the row here
}

讀出一個目錄中的內(nèi)容,需要這樣寫:

// Fetch the "aggregate structure"
$dh = opendir("/home/harryf/files");

// Iterate over the structure
while ( $file = readdir($dh) ) {
   // do stuff with the file here
}

讀出一個文本文件的內(nèi)容,需要這樣寫:

// Fetch the "aggregate structure"
$fh = fopen("/home/hfuecks/files/results.txt", "r");

// Iterate over the structure
while (!feof($fh)) {

   $line = fgets($fh);
   // do stuff with the line here

}

上面三段代碼,雖然處理的是不同的resource(資源),但是功能都是遍歷結(jié)果集(loop over contents),因此Iterator的基本思想,就是將這三種不同的操作統(tǒng)一起來,用同樣的命令界面,處理不同的資源。

SPL提供了6個迭代器接口(具體的會在本專題后續(xù)的文章里面說明):

名稱 功能
Traversable 遍歷接口(檢測一個類是否可以使用 foreach 進行遍歷的接口)
Iterator 迭代器接口(可在內(nèi)部迭代自己的外部迭代器或類的接口)
IteratorAggregate 聚合式迭代器接口(創(chuàng)建外部迭代器的接口)
OuterIterator 迭代器嵌套接口(將一個或多個迭代器包裹在另一個迭代器中)
RecursiveIterator 遞歸迭代訪問接口(提供遞歸訪問功能)
SeekableIterator 可索引迭代訪問接口(實現(xiàn)查找功能)
Classes

SPL除了定義一系列Interfaces以外,還提供一系列的內(nèi)置類,它們對應不同的任務,大大簡化了編程。
查看所有的內(nèi)置類,可以使用下面的代碼:

// a simple foreach() to traverse the SPL class names
foreach(spl_classes() as $key=>$value){
  echo $key." -> ".$value."
"; }
Datastructures

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

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

SPL擁有的以下數(shù)據(jù)結(jié)構(gòu):
Doubly Linked Lists(雙向鏈表),Heaps(堆),Arrays(陣列),Map(映射)

Function

同時SPL還提供了很多方便的函數(shù),比如我們在框架中經(jīng)常用到的spl_autoload_register(注冊給定的函數(shù)作為 __autoload 的實現(xiàn))

class_implements — 返回指定的類實現(xiàn)的所有接口。

class_parents — 返回指定類的父類。

class_uses — Return the traits used by the given class

iterator_apply — 為迭代器中每個元素調(diào)用一個用戶自定義函數(shù)

iterator_count — 計算迭代器中元素的個數(shù)

iterator_to_array — 將迭代器中的元素拷貝到數(shù)組

spl_autoload_call — 嘗試調(diào)用所有已注冊的__autoload()函數(shù)來裝載請求類

spl_autoload_extensions — 注冊并返回spl_autoload函數(shù)使用的默認文件擴展名。

spl_autoload_functions — 返回所有已注冊的__autoload()函數(shù)。

spl_autoload_register — 注冊給定的函數(shù)作為 __autoload 的實現(xiàn)

spl_autoload_unregister — 注銷已注冊的__autoload()函數(shù)

spl_autoload — __autoload()函數(shù)的默認實現(xiàn)

spl_classes — 返回所有可用的SPL類

spl_object_hash — 返回指定對象的hash id

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31475.html

相關文章

  • SPL標準專題(10)】Datastructures:SplObjectStorage

    摘要:是用來存儲一組對象的,特別是當你需要唯一標識對象的時候。類實現(xiàn)了四個接口??蓪崿F(xiàn)統(tǒng)計迭代序列化數(shù)組式訪問等功能。 PHP SPL SplObjectStorage是用來存儲一組對象的,特別是當你需要唯一標識對象的時候。PHP SPL SplObjectStorage類實現(xiàn)了Countable,Iterator,Serializable,ArrayAccess四個接口。可實現(xiàn)統(tǒng)計、迭代、...

    ConardLi 評論0 收藏0
  • SPL標準專題(2)】Iterator

    摘要:由于沒有方法,所以就不能用重置游標,這個時候已經(jīng)到最后了,所以為空一種占位符形式的迭代器,不執(zhí)行任何操作。檢查是否含有子節(jié)點輸出所有字節(jié)點將一個樹形結(jié)構(gòu)的迭代器展開為一維結(jié)構(gòu)。 Iterator界面 本段內(nèi)容來自阮一峰老師再加自己的部分注解 SPL規(guī)定,所有部署了Iterator界面的class,都可以用在foreach Loop中。Iterator界面中包含5個必須部署的方法: * ...

    focusj 評論0 收藏0
  • SPL標準專題(4)】Exceptions

    摘要:嵌套異常了解異常之前,我們先了解一下嵌套異常。其中兩個可被視為基類邏輯異常和運行時異常兩種都繼承異常類。其余的方法在邏輯上可以被拆分為組動態(tài)調(diào)用組,邏輯組和運行時組。運行時組包含異常它由組成。 嵌套異常 了解SPL異常之前,我們先了解一下嵌套異常。嵌套異常顧名思義就是異常里面再嵌套異常,一個異常拋出,在catch到以后再拋出異常,這時可以通過Exception基類的getPreviou...

    wemall 評論0 收藏0
  • SPL標準專題(7)】Datastructures:SplPriorityQueue

    摘要:普通的隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),元素在隊列尾追加,而從隊列頭取出。在優(yōu)先隊列中,元素被賦予優(yōu)先級。當訪問元素時,具有最高優(yōu)先級的元素最先取出。優(yōu)先隊列具有最高級先出,的行為特征。 普通的隊列是一種先進先出的數(shù)據(jù)結(jié)構(gòu),元素在隊列尾追加,而從隊列頭取出。在優(yōu)先隊列中,元素被賦予優(yōu)先級。當訪問元素時,具有最高優(yōu)先級的元素最先取出。優(yōu)先隊列具有最高級先出 (largest-in,first...

    mindwind 評論0 收藏0
  • SPL標準專題(9)】Datastructures:SplFixedArray

    摘要:主要是處理數(shù)組相關的主要功能,與普通不同的是,它是固定長度的,且以數(shù)字為鍵名的數(shù)組,優(yōu)勢就是比普通的數(shù)組處理更快。類摘要方法導入數(shù)組,返回對象把對象數(shù)組導出為真正的數(shù)組由于是定長數(shù)組,所以超過定長就會拋出異常。 SplFixedArray主要是處理數(shù)組相關的主要功能,與普通php array不同的是,它是固定長度的,且以數(shù)字為鍵名的數(shù)組,優(yōu)勢就是比普通的數(shù)組處理更快。 類摘要 SplF...

    lindroid 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<