PHP Conference Japan 2024

CachingIterator 類別

(PHP 5, PHP 7, PHP 8)

簡介

此物件支援對另一個迭代器進行快取迭代。

類別概要

類別 CachingIterator 繼承自 IteratorIterator 實作 ArrayAccess, Countable, Stringable {
/* 常數 */
公開 常數 整數 CALL_TOSTRING;
公開 常數 整數 CATCH_GET_CHILD;
公開 常數 整數 TOSTRING_USE_KEY;
公開 常數 整數 TOSTRING_USE_INNER;
公開 常數 整數 FULL_CACHE;
/* 方法 */
公開 __construct(迭代器 $iterator, 整數 $flags = CachingIterator::CALL_TOSTRING)
公開 count(): 整數
公開 current(): 混合
公開 getCache(): 陣列
公開 getFlags(): 整數
公開 hasNext(): 布林
公開 key(): 純量
公開 next():
公開 offsetExists(字串 $key): 布林
公開 offsetGet(字串 $key): 混合
公開 offsetSet(字串 $key, 混合 $value):
公開 offsetUnset(字串 $key):
公開 rewind():
公開 setFlags(整數 $flags):
公開 __toString(): 字串
公開 valid(): 布林值
/* 繼承的方法 */
}

預定義常數

CachingIterator::CALL_TOSTRING

將每個元素轉換為字串。

CachingIterator::CATCH_GET_CHILD

在訪問子項時不拋出例外。

CachingIterator::TOSTRING_USE_KEY

使用 進行字串轉換。

CachingIterator::TOSTRING_USE_CURRENT

使用 目前 值進行字串轉換。

CachingIterator::TOSTRING_USE_INNER

使用 內部 迭代器進行字串轉換。

CachingIterator::FULL_CACHE

快取所有讀取的資料。

更新日誌

版本 說明
8.0.0 CachingIterator 現在實作了 Stringable 介面。

目錄

新增註釋

使用者貢獻的註釋 4 則註釋

ahmad dot mayahi at gmail dot com
4 年前
CachingIterator 與其他迭代器(例如 ArrayIterator)之間的唯一區別是 hasNext() 方法。

由於數據將被載入到記憶體中,CachingIterator 可以檢查給定的迭代器是否具有下一個元素。

讓我們用一個例子來演示

<?php
$iterator
= new CachingIterator(new ArrayIterator(['C', 'C++', 'C#', 'PHP', 'Python', 'Go', 'Ruby']));

foreach (
$iterator as $item) {
if (
$iterator->hasNext()) {
echo
$item.', ';
} else {
echo
'和 '.$item;
}
}

// C, C++, C#, PHP, Python, Go, 和 Ruby
?>

在此範例中,我檢查迭代器是否具有下一個值,如果有的話,我會附加一個逗號,否則將「和」附加到最後一個元素。
ahmad dot mayahi at gmail dot com
8 年前
<?php
//此程式碼片段將印出所有已快取的元素 (foreach) 。

$cache = new CachingIterator(new ArrayIterator(range(1,100)), CachingIterator::FULL_CACHE);

foreach (
$cache as $c) {

}

print_r($cache->getCache());
?>
jerome at chaman dot ca
4 年前
「在另一個迭代器上進行快取迭代」意味著此迭代器始終落後於內部迭代器一步。換句話說,第一次迭代將產生 null 值

<?php

$cit
= new CachingIterator( new ArrayIterator( [ 'a', 'b', 'c'] ) );

echo
$cit->current() ); // null
echo $cit->getInnerIterator()->current() ); // "a"

while($cit->hasNext()){

// 我們從 "next" 開始,因為第一個項目是 null
$cit->next();
echo
$cit->current(), '<br>';

}
?>

以這種方式迭代,可以讓我們預先存取未來的項目(也就是內部迭代器的當前項目)。
xedin dot unknown at gmail dot com
4 年前
顯然,`FULL_CACHE` 旗標會自動取消預設的 `CALL_TOSTRING` 旗標。當其中一個值無法轉換為字串時,這一點很明顯:使用預設的 `CALL_TOSTRING` 旗標會拋出錯誤;如果沒有該旗標,或者使用 `FULL_CACHE` 旗標,則不會拋出錯誤。
To Top