摘要:類實(shí)現(xiàn)了對象存儲映射表,應(yīng)用于需要唯一標(biāo)識多個(gè)對象的存儲場景。在之前僅能存儲對象,之后可以針對每個(gè)對象添加一條對應(yīng)的數(shù)據(jù)。實(shí)際上他們并沒有直接的關(guān)系。
1. 定義
php.net上的定義 The SplObjectStorage class provides a map from objects to data or, by ignoring data, an object set. This dual purpose can be useful in many cases involving the need to uniquely identify objects. 翻譯:SplObjectStorage類提供從對象到數(shù)據(jù)映射功能,或者,通過忽視數(shù)據(jù)來提供對象集合,在很多涉及需要唯一對象的許多情況下,這兩點(diǎn)是十分有用的。
SplObjectStorage類實(shí)現(xiàn)了對象存儲映射表,應(yīng)用于需要唯一標(biāo)識多個(gè)對象的存儲場景。 在PHP5.3.0之前僅能存儲對象,之后可以針對每個(gè)對象添加一條對應(yīng)的數(shù)據(jù)。 SplObjectStorage類的數(shù)據(jù)存儲依賴于PHP的HashTable實(shí)現(xiàn),與傳統(tǒng)的使用數(shù)組和spl_object_hash函數(shù)生成數(shù)組key相比, 其直接使用HashTable的實(shí)現(xiàn)在性能上有較大的優(yōu)勢。 有一些奇怪的是,在PHP手冊中,SplObjectStorage類放在數(shù)據(jù)結(jié)構(gòu)目錄下。 但是他的實(shí)現(xiàn)和觀察者模式的接口放在同一個(gè)文件(ext/spl/spl_observer.c)。 實(shí)際上他們并沒有直接的關(guān)系。《深入理解php內(nèi)核》2. 接口說明
class SplObjectStorage implements Countable, Iterator, Serializable, ArrayAccess { //省略,下邊詳細(xì)解釋以及翻譯 }
此類實(shí)現(xiàn)了 Countable, Iterator, Serializable, ArrayAccess 四個(gè)接口,分別對應(yīng)統(tǒng)計(jì),迭代,序列化和數(shù)組訪問,四個(gè)接口分別說明如下
此接口中只有一方法count(),看SplObjectStorage 類中此方法的說明(源碼位置在php.jar/stubs/SPL/SPL_c1.php文件的1979行,可以用phpstorm按住command鼠標(biāo)左鍵跳轉(zhuǎn)過去)
/** * Returns the number of objects in the storage //返回存儲中的對象數(shù)量 * @link https://php.net/manual/en/splobjectstorage.count.php * @return int The number of objects in the storage. * @since 5.1.0 */ public function count () {}
翻譯注釋:Returns the number of objects in the storage //返回存儲中的對象數(shù)量
接口注釋Interface for external iterators or objects that can be iterated 的翻譯為外部迭代器或可以迭代的對象的接口,此接口中有5個(gè)方法分別如下(對應(yīng)注釋中有翻譯)
/** * Rewind the iterator to the first storage element //將迭代器回到第一個(gè)存儲的元素 * @link https://php.net/manual/en/splobjectstorage.rewind.php * @return void * @since 5.1.0 */ public function rewind () {} /** * Returns if the current iterator entry is valid //返回當(dāng)前迭代器條目是否有效 * @link https://php.net/manual/en/splobjectstorage.valid.php * @return bool true if the iterator entry is valid, false otherwise. * @since 5.1.0 */ public function valid () {} /** * Returns the index at which the iterator currently is//返回當(dāng)前迭代對應(yīng)的索引 * @link https://php.net/manual/en/splobjectstorage.key.php * @return int The index corresponding to the position of the iterator. * @since 5.1.0 */ public function key () {} /** * Returns the current storage entry //返回當(dāng)前存儲的條目 * @link https://php.net/manual/en/splobjectstorage.current.php * @return object The object at the current iterator position. * @since 5.1.0 */ public function current () {} /** * Move to the next entry //移到下一個(gè)條目 * @link https://php.net/manual/en/splobjectstorage.next.php * @return void * @since 5.1.0 */ public function next () {}
接口注釋Interface for customized serializing.的翻譯為用于自定義序列化的接口,此接口中有2個(gè)方法分別如下(對應(yīng)注釋中有翻譯)
/** * Serializes the storage //序列化存儲 * @link https://php.net/manual/en/splobjectstorage.serialize.php * @return string A string representing the storage. //返回表示存儲的字符串 * @since 5.2.2 */ public function serialize () {} /** * Unserializes a storage from its string representation //從一個(gè)字符串表示中對存儲反序列化 * @link https://php.net/manual/en/splobjectstorage.unserialize.php * @param string $serialized* The serialized representation of a storage. *
* @return void * @since 5.2.2 */ public function unserialize ($serialized) {}
接口注釋Interface to provide accessing objects as arrays.的翻譯為提供像訪問數(shù)組一樣訪問對象的接口,此接口中有4個(gè)方法分別如下(對應(yīng)注釋中有翻譯)
/** * Checks whether an object exists in the storage //檢查存儲中是否存在找個(gè)對象 * @link https://php.net/manual/en/splobjectstorage.offsetexists.php * @param object $object* The object to look for. *
* @return bool true if the object exists in the storage, * and false otherwise. * @since 5.3.0 */ public function offsetExists ($object) {} /** * Associates data to an object in the storage //給存儲中的對象賦值 * @link https://php.net/manual/en/splobjectstorage.offsetset.php * @param object $object* The object to associate data with. *
* @param mixed $data [optional]* The data to associate with the object. *
* @return void * @since 5.3.0 */ public function offsetSet ($object, $data = null) {} /** * Removes an object from the storage //從存儲中刪除一個(gè)對象 * @link https://php.net/manual/en/splobjectstorage.offsetunset.php * @param object $object* The object to remove. *
* @return void * @since 5.3.0 */ public function offsetUnset ($object) {} /** * Returns the data associated with anobject //從存儲中獲得一個(gè)對象 * @link https://php.net/manual/en/splobjectstorage.offsetget.php * @param object $object* The object to look for. *
* @return mixed The data previously associated with the object in the storage. * @since 5.3.0 */ public function offsetGet ($object) {}
此接口的功能用代碼簡單說明如下
$collection = new SuporCollection();//假設(shè)有一Collection類,并且已經(jīng)實(shí)現(xiàn)了ArrayAccess 接口 $collection["a"] = 10;//我們可以像給數(shù)組賦值一樣給此對象賦值 var_dump($collection["a"]);//也可以使用取數(shù)組值的方法取得對象的屬性 而不用 "->" //輸出 int(10)3. 方法說明
在每個(gè)方法的注釋中有對應(yīng)翻譯,來說明這個(gè)方法的作用
/** * Adds an object in the storage //向存儲中添加一個(gè)對象 * @link https://php.net/manual/en/splobjectstorage.attach.php * @param object $object4. 使用* The object to add. *
* @param mixed $data [optional]* The data to associate with the object. *
* @return void * @since 5.1.0 */ public function attach ($object, $data = null) {} /** * Removes an object from the storage //從存儲中刪除一個(gè)對象 * @link https://php.net/manual/en/splobjectstorage.detach.php * @param object $object* The object to remove. *
* @return void * @since 5.1.0 */ public function detach ($object) {} /** * Checks if the storage contains a specific object //檢查存儲中是否包含特定的對象 * @link https://php.net/manual/en/splobjectstorage.contains.php * @param object $object* The object to look for. *
* @return bool true if the object is in the storage, false otherwise. * @since 5.1.0 */ public function contains ($object) {} /** * Adds all objects from another storage //添加一個(gè)存儲中所有對象 * @link https://php.net/manual/en/splobjectstorage.addall.php * @param SplObjectStorage $storage* The storage you want to import. *
* @return void * @since 5.3.0 */ public function addAll ($storage) {} /** * Removes objects contained in another storage from the current storage //從當(dāng)前存儲中刪除另一個(gè)存儲中包含的對象 * @link https://php.net/manual/en/splobjectstorage.removeall.php * @param SplObjectStorage $storage* The storage containing the elements to remove. *
* @return void * @since 5.3.0 */ public function removeAll ($storage) {} /** *從當(dāng)前存儲中刪除另一個(gè)存儲中不包含的對象 * Removes all objects except for those contained in another storage from the current storage * @link https://php.net/manual/en/splobjectstorage.removeallexcept.php * @param SplObjectStorage $storage* The storage containing the elements to retain in the current storage. *
* @return void * @since 5.3.6 */ public function removeAllExcept ($storage) {} /** * Returns the data associated with the current iterator entry //返回當(dāng)前迭代器條目相關(guān)的數(shù)據(jù) * @link https://php.net/manual/en/splobjectstorage.getinfo.php * @return mixed The data associated with the current iterator position. * @since 5.3.0 */ public function getInfo () {} /** * Sets the data associated with the current iterator entry//設(shè)置當(dāng)前迭代器條目相關(guān)的數(shù)據(jù) * @link https://php.net/manual/en/splobjectstorage.setinfo.php * @param mixed $data* The data to associate with the current iterator entry. *
* @return void * @since 5.3.0 */ public function setInfo ($data) {} /** * Calculate a unique identifier for the contained objects //給包含的對象計(jì)算一個(gè)唯一ID * @link https://php.net/manual/en/splobjectstorage.gethash.php * @param $object* object whose identifier is to be calculated. * @return string A string with the calculated identifier. * @since 5.4.0 */ public function getHash($object) {}
SplObjectStorage的對象操作
//假設(shè)有三個(gè)Collection對象 $collection1 = new SuporCollection(["a" => "aa", "b" => "bb"]); $collection2 = new SuporCollection(["c" => "cc", "d" => "dd"]); $collection3 = new SuporCollection(["e" => "ee", "f" => "ff"]); $splStorage = new SplObjectStorage(); $splStorage->attach($collection1); //傳入相同的對象會(huì)被替代 $splStorage->attach($collection1); $splStorage->attach($collection2); $splStorage->attach($collection3); //統(tǒng)計(jì)$splStorage中有多少個(gè)對象 $count = $splStorage->count(); var_dump($count); //得到某一對象的哈希值 $hash1 = $splStorage->getHash($collection1); var_dump($hash1); //檢查存儲中是否包含$collection3 $contains3 = $splStorage->contains($collection3); var_dump($contains3); //將指針后移 $splStorage->next(); //讀取移動(dòng)后的key $key = $splStorage->key(); var_dump($key); //刪除某個(gè)對象 $splStorage->detach($collection3); //統(tǒng)計(jì)刪除后的數(shù)量 $count = $splStorage->count(); var_dump($count); //遍歷$splStorage所有對象 //遍歷前先重置一下指針 $splStorage->rewind(); //當(dāng)當(dāng)前迭代器條目返回真時(shí) while ($splStorage->valid()) { //打印當(dāng)前條目 var_dump($splStorage->current()); //指針后移 $splStorage->next(); }
代碼執(zhí)行結(jié)果如下:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/30031.html
摘要:是用來存儲一組對象的,特別是當(dāng)你需要唯一標(biāo)識對象的時(shí)候。類實(shí)現(xiàn)了四個(gè)接口。可實(shí)現(xiàn)統(tǒng)計(jì)迭代序列化數(shù)組式訪問等功能。 PHP SPL SplObjectStorage是用來存儲一組對象的,特別是當(dāng)你需要唯一標(biāo)識對象的時(shí)候。PHP SPL SplObjectStorage類實(shí)現(xiàn)了Countable,Iterator,Serializable,ArrayAccess四個(gè)接口。可實(shí)現(xiàn)統(tǒng)計(jì)、迭代、...
摘要:也就是閑時(shí)為了寫文章而寫的一篇關(guān)于源碼的閱讀筆記。是標(biāo)準(zhǔn)庫的縮寫,一組旨在解決標(biāo)準(zhǔn)問題的接口和類的集合。提供了一套標(biāo)準(zhǔn)的數(shù)據(jù)結(jié)構(gòu),一組遍歷對象的迭代器,一組接口,一組標(biāo)準(zhǔn)的異常,一系列用于處理文件的類,提供了一組函數(shù),具體可以查看文檔。 也就是閑時(shí)為了寫文章而寫的一篇關(guān)于 Pimple 源碼的閱讀筆記。Pimple 代碼有兩種編碼方式,一種是以 PHP 編寫的,另一種是以 C 擴(kuò)展編寫...
摘要:設(shè)計(jì)觀察者模式是為了讓一個(gè)對象跟蹤某個(gè)狀態(tài),知道狀態(tài)何時(shí)改變,一旦狀態(tài)改變,所有訂閱對象都能得到通知。類與觀察者設(shè)計(jì)模式?jīng)]有內(nèi)在的關(guān)系,不過通過它其內(nèi)置的和方法可以很方便的將觀察者實(shí)例與一個(gè)主題實(shí)例相關(guān)聯(lián)以及解除關(guān)聯(lián)。 前言 知識就是作為觀察者所獲得的結(jié)論,經(jīng)過科學(xué)培訓(xùn)的觀察者會(huì)為我們提供所有能感知的現(xiàn)實(shí)。設(shè)計(jì)觀察者模式是為了讓一個(gè)對象跟蹤某個(gè)狀態(tài),知道狀態(tài)何時(shí)改變,一旦狀態(tài)改變,所有...
摘要:設(shè)計(jì)觀察者模式是為了讓一個(gè)對象跟蹤某個(gè)狀態(tài),知道狀態(tài)何時(shí)改變,一旦狀態(tài)改變,所有訂閱對象都能得到通知。類與觀察者設(shè)計(jì)模式?jīng)]有內(nèi)在的關(guān)系,不過通過它其內(nèi)置的和方法可以很方便的將觀察者實(shí)例與一個(gè)主題實(shí)例相關(guān)聯(lián)以及解除關(guān)聯(lián)。 前言 知識就是作為觀察者所獲得的結(jié)論,經(jīng)過科學(xué)培訓(xùn)的觀察者會(huì)為我們提供所有能感知的現(xiàn)實(shí)。設(shè)計(jì)觀察者模式是為了讓一個(gè)對象跟蹤某個(gè)狀態(tài),知道狀態(tài)何時(shí)改變,一旦狀態(tài)改變,所有...
摘要:設(shè)計(jì)觀察者模式是為了讓一個(gè)對象跟蹤某個(gè)狀態(tài),知道狀態(tài)何時(shí)改變,一旦狀態(tài)改變,所有訂閱對象都能得到通知。類與觀察者設(shè)計(jì)模式?jīng)]有內(nèi)在的關(guān)系,不過通過它其內(nèi)置的和方法可以很方便的將觀察者實(shí)例與一個(gè)主題實(shí)例相關(guān)聯(lián)以及解除關(guān)聯(lián)。 前言 知識就是作為觀察者所獲得的結(jié)論,經(jīng)過科學(xué)培訓(xùn)的觀察者會(huì)為我們提供所有能感知的現(xiàn)實(shí)。設(shè)計(jì)觀察者模式是為了讓一個(gè)對象跟蹤某個(gè)狀態(tài),知道狀態(tài)何時(shí)改變,一旦狀態(tài)改變,所有...
閱讀 2731·2021-11-24 09:39
閱讀 1646·2021-09-28 09:35
閱讀 1119·2021-09-06 15:02
閱讀 1306·2021-07-25 21:37
閱讀 2726·2019-08-30 15:53
閱讀 3643·2019-08-30 14:07
閱讀 713·2019-08-30 11:07
閱讀 3511·2019-08-29 18:36