摘要:我把分為五個部分,,,,而其中是就是做一些類的介紹與相關(guān)的類在各自文章內(nèi),在介紹這些類之前,先介紹幾個接口數(shù)組式訪問接口只要實現(xiàn)了這個接口,就可以使得像那樣操作。只有內(nèi)部的類用寫的類才可以直接實現(xiàn)接口代碼中使用或接口來實現(xiàn)遍歷。
我把SPL分為五個部分:Iterator,Classes,Exceptions,Datastructures,F(xiàn)unction;而其中classes是就是做一些類的介紹(Iterator與Datastructures相關(guān)的類在各自文章內(nèi)),在介紹這些類之前,先介紹幾個接口:
ArrayAccess(數(shù)組式訪問)接口http://php.net/manual/zh/clas...
只要實現(xiàn)了這個接口,就可以使得object像array那樣操作。ArrayAccess界面包含四個必須部署的方法,這四個方法分別傳入的是array的key和value,:
* offsetExists($offset) This method is used to tell php if there is a value for the key specified by offset. It should return true or false.檢查一個偏移位置是否存在 * offsetGet($offset) This method is used to return the value specified by the key offset.獲取一個偏移位置的值 * offsetSet($offset, $value) This method is used to set a value within the object, you can throw an exception from this function for a read-only collection. 獲取一個偏移位置的值 * offsetUnset($offset) This method is used when a value is removed from an array either through unset() or assigning the key a value of null. In the case of numerical arrays, this offset should not be deleted and the array should not be reindexed unless that is specifically the behavior you want. 復(fù)位一個偏移位置的值
/** * A class that can be used like an array */ class Article implements ArrayAccess{ public $title; public $author; public $category; function __construct($title , $author , $category){ $this->title = $title; $this->author = $author; $this->category = $category; } /** * Defined by ArrayAccess interface * Set a value given it"s key e.g. $A["title"] = "foo"; * @param mixed key (string or integer) * @param mixed value * @return void */ function offsetSet($key , $value){ if (array_key_exists($key , get_object_vars($this))) { $this->{$key} = $value; } } /** * Defined by ArrayAccess interface * Return a value given it"s key e.g. echo $A["title"]; * @param mixed key (string or integer) * @return mixed value */ function offsetGet($key){ if (array_key_exists($key , get_object_vars($this))) { return $this->{$key}; } } /** * Defined by ArrayAccess interface * Unset a value by it"s key e.g. unset($A["title"]); * @param mixed key (string or integer) * @return void */ function offsetUnset($key){ if (array_key_exists($key , get_object_vars($this))) { unset($this->{$key}); } } /** * Defined by ArrayAccess interface * Check value exists, given it"s key e.g. isset($A["title"]) * @param mixed key (string or integer) * @return boolean */ function offsetExists($offset){ return array_key_exists($offset , get_object_vars($this)); } } // Create the object $A = new Article("SPL Rocks","Joe Bloggs", "PHP"); // Check what it looks like echo "Initial State:Serializable接口"; print_r($A); echo ""; // Change the title using array syntax $A["title"] = "SPL _really_ rocks"; // Try setting a non existent property (ignored) $A["not found"] = 1; // Unset the author field unset($A["author"]); // Check what it looks like again echo "Final State:"; print_r($A); echo "";
接口摘要
Serializable { /* 方法 */ abstract public string serialize ( void ) abstract public mixed unserialize ( string $serialized ) }
具體參考: http://php.net/manual/zh/clas...
簡單的說,當(dāng)實現(xiàn)了Serializable接口的類,被實例化后的對象,在序列化或者反序列化時都會自動調(diào)用類中對應(yīng)的序列化或者反序列化方法;
class obj implements Serializable { private $data; public function __construct() { $this->data = "自動調(diào)用了方法:"; } public function serialize() { $res = $this->data.__FUNCTION__; return serialize($res); } //然后上面serialize的值作為$data參數(shù)傳了進(jìn)來; public function unserialize($data) { $this->data = unserialize($res); } public function getData() { return $this->data; } } $obj = new obj; $ser = serialize($obj); $newobj = unserialize($ser); //在調(diào)用getData方法之前其實隱式又調(diào)用了serialize與unserialize var_dump($newobj->getData());IteratorAggregate(聚合式迭代器)接口
類摘要
IteratorAggregate extends Traversable { /* 方法 */ abstract public Traversable getIterator ( void ) }
Traversable作用為檢測一個類是否可以使用 foreach 進(jìn)行遍歷的接口,在php代碼中不能用。只有內(nèi)部的PHP類(用C寫的類)才可以直接實現(xiàn)Traversable接口;php代碼中使用Iterator或IteratorAggregate接口來實現(xiàn)遍歷。
實現(xiàn)了此接口的類,內(nèi)部都有一個getIterator方法來獲取迭代器實例;
class myData implements IteratorAggregate { private $array = []; const TYPE_INDEXED = 1; const TYPE_ASSOCIATIVE = 2; public function __construct( array $data, $type = self::TYPE_INDEXED ) { reset($data); while( list($k, $v) = each($data) ) { $type == self::TYPE_INDEXED ? $this->array[] = $v : $this->array[$k] = $v; } } public function getIterator() { return new ArrayIterator($this->array); } } $obj = new myData(["one"=>"php","javascript","three"=>"c#","java",]/*,TYPE 1 or 2*/ ); //↓↓ 遍歷的時候其實就是遍歷getIterator中實例的迭代器對象,要迭代的數(shù)據(jù)為這里面?zhèn)鬟M(jìn)去的數(shù)據(jù) foreach($obj as $key => $value) { var_dump($key, $value); echo PHP_EOL; }Countable 接口
類實現(xiàn) Countable接口后,在count時以接口中返回的值為準(zhǔn).
//Example One, BAD :( class CountMe{ protected $_myCount = 3; public function count(){ return $this->_myCount; } } $countable = new CountMe(); echo count($countable); //result is "1", not as expected //Example Two, GOOD :) class CountMe implements Countable{ protected $_myCount = 3; public function count(){ return $this->_myCount; } } $countable = new CountMe(); echo count($countable); //result is "3" as expectedArrayObject類
簡單的說該類可以使得像操作Object那樣操作Array;
這是一個很有用的類;
/*** a simple array ***/ $array = array("koala", "kangaroo", "wombat", "wallaby", "emu", "kiwi", "kookaburra", "platypus"); /*** create the array object ***/ $arrayObj = new ArrayObject($array); //增加一個元素 $arrayObj->append("dingo"); //顯示元素的數(shù)量 //echo $arrayObj->count(); //對元素排序: 大小寫不敏感的自然排序法,其他排序法可以參考手冊 $arrayObj->natcasesort(); //傳入其元素索引,從而刪除一個元素 $arrayObj->offsetUnset(5); //傳入某一元素索引,檢測某一個元素是否存在 if ($arrayObj->offsetExists(5)) { echo "Offset ExistsSplObserver, SplSubject
"; } //更改某個元素的值 $arrayObj->offsetSet(3, "pater"); //顯示某一元素的值 //echo $arrayObj->offsetGet(4); //更換數(shù)組,更換后就以此數(shù)組為對象 $fruits = array("lemons" => 1, "oranges" => 4, "bananas" => 5, "apples" => 10); $arrayObj->exchangeArray($fruits); // Creates a copy of the ArrayObject. $copy = $fruitsArrayObject->getArrayCopy(); /*** iterate over the array ***/ for($iterator = $arrayObj->getIterator(); /*** check if valid ***/ $iterator->valid(); /*** move to the next array member ***/ $iterator->next()) { /*** output the key and current array value ***/ echo $iterator->key() . " => " . $iterator->current() . "
"; }
這是兩個專用于設(shè)計模式中觀察者模式的類,會在后面的設(shè)計模式專題中詳細(xì)介紹;
SplFileInfo簡單的說,該對象就是把一些常用的文件信息函數(shù)進(jìn)行了封裝,比如獲取文件所屬,權(quán)限,時間等等信息,具體參考:
http://php.net/manual/zh/clas...
SplFileObject類為操作文件提供了一個面向?qū)ο蠼涌? 具體參考:http://php.net/manual/zh/clas...
SplFileObject extends SplFileInfo implements RecursiveIterator , SeekableIterator {}
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/31505.html
摘要:什么是是標(biāo)準(zhǔn)庫的縮寫。根據(jù)官方定義,它是是用于解決典型問題的一組接口與類的集合。而的對象則嚴(yán)格以堆棧的形式描述數(shù)據(jù),并提供對應(yīng)的方法。返回所有已注冊的函數(shù)。 什么是SPL SPL是Standard PHP Library(PHP標(biāo)準(zhǔn)庫)的縮寫。 根據(jù)官方定義,它是a collection of interfaces and classes that are meant to solve...
摘要:是用來存儲一組對象的,特別是當(dāng)你需要唯一標(biāo)識對象的時候。類實現(xiàn)了四個接口。可實現(xiàn)統(tǒng)計迭代序列化數(shù)組式訪問等功能。 PHP SPL SplObjectStorage是用來存儲一組對象的,特別是當(dāng)你需要唯一標(biāo)識對象的時候。PHP SPL SplObjectStorage類實現(xiàn)了Countable,Iterator,Serializable,ArrayAccess四個接口。可實現(xiàn)統(tǒng)計、迭代、...
摘要:主要是處理數(shù)組相關(guān)的主要功能,與普通不同的是,它是固定長度的,且以數(shù)字為鍵名的數(shù)組,優(yōu)勢就是比普通的數(shù)組處理更快。類摘要方法導(dǎo)入數(shù)組,返回對象把對象數(shù)組導(dǎo)出為真正的數(shù)組由于是定長數(shù)組,所以超過定長就會拋出異常。 SplFixedArray主要是處理數(shù)組相關(guān)的主要功能,與普通php array不同的是,它是固定長度的,且以數(shù)字為鍵名的數(shù)組,優(yōu)勢就是比普通的數(shù)組處理更快。 類摘要 SplF...
摘要:嵌套異常了解異常之前,我們先了解一下嵌套異常。其中兩個可被視為基類邏輯異常和運(yùn)行時異常兩種都繼承異常類。其余的方法在邏輯上可以被拆分為組動態(tài)調(diào)用組,邏輯組和運(yùn)行時組。運(yùn)行時組包含異常它由組成。 嵌套異常 了解SPL異常之前,我們先了解一下嵌套異常。嵌套異常顧名思義就是異常里面再嵌套異常,一個異常拋出,在catch到以后再拋出異常,這時可以通過Exception基類的getPreviou...
摘要:簡述雙鏈表是一種重要的線性存儲結(jié)構(gòu),對于雙鏈表中的每個節(jié)點,不僅僅存儲自己的信息,還要保存前驅(qū)和后繼節(jié)點的地址。 簡述 雙鏈表是一種重要的線性存儲結(jié)構(gòu),對于雙鏈表中的每個節(jié)點,不僅僅存儲自己的信息,還要保存前驅(qū)和后繼節(jié)點的地址。 showImg(https://segmentfault.com/img/remote/1460000019231932?w=813&h=236); 類摘要 ...
閱讀 2716·2021-09-24 09:47
閱讀 4366·2021-08-27 13:10
閱讀 2981·2019-08-30 15:44
閱讀 1281·2019-08-29 12:56
閱讀 2594·2019-08-28 18:07
閱讀 2615·2019-08-26 14:05
閱讀 2553·2019-08-26 13:41
閱讀 1265·2019-08-26 13:33