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

資訊專欄INFORMATION COLUMN

PHP 之 SplObjectStorage對象存儲

cpupro / 1128人閱讀

摘要:類實(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è)接口分別說明如下

2.1 Countable

此接口中只有一方法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ù)量

2.2 Iterator

接口注釋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 () {}
2.3 Serializable

接口注釋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) {}
2.4 ArrayAccess

接口注釋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 an object //從存儲中獲得一個(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 $object 

* 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) {}

4. 使用

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

相關(guān)文章

  • 【SPL標(biāo)準(zhǔn)庫專題(10)】Datastructures:SplObjectStorage

    摘要:是用來存儲一組對象的,特別是當(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ì)、迭代、...

    ConardLi 評論0 收藏0
  • PHP - Pimple 源碼筆記(上)

    摘要:也就是閑時(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ò)展編寫...

    cfanr 評論0 收藏0
  • PHP設(shè)計(jì)模式——觀察者模式

    摘要:設(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)改變,所有...

    Barrior 評論0 收藏0
  • PHP設(shè)計(jì)模式——觀察者模式

    摘要:設(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)改變,所有...

    KoreyLee 評論0 收藏0
  • PHP設(shè)計(jì)模式——觀察者模式

    摘要:設(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)改變,所有...

    lifefriend_007 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<