PHP Conference Japan 2024

Traversable 介面

(PHP 5, PHP 7, PHP 8)

簡介

用於檢測類別是否可以使用 foreach 進行遍歷的介面。

無法單獨實現的抽象基底介面。它必須由 IteratorAggregateIterator 其中之一來實現。

介面概要

interface Traversable {
}

此介面沒有方法,它唯一的目的是作為所有可遍歷類別的基底介面。

更新日誌

版本 說明
7.4.0 Traversable 介面現在可以由抽象類別實現。繼承的類別必須實現 IteratorIteratorAggregate

注意事項

注意:

實作此介面的內建 (內置) 類別可以在 foreach 結構中使用,並且不需要實作 IteratorAggregateIterator

注意:

在 PHP 7.4.0 之前,這個內部引擎介面無法在 PHP 腳本中實作。必須改用 IteratorAggregateIterator

新增註釋

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

kevinpeno at gmail dot com
14 年前
雖然您無法實作此介面,但您可以在檢查中使用它來判斷某些東西是否可用於 foreach。如果我預期某些東西必須透過 foreach 迭代,我會使用以下程式碼。

<?php
if( !is_array( $items ) && !$items instanceof Traversable )
//在此處拋出例外
?>
cobaltbluedw
8 年前
注意:雖然物件和陣列可以透過 foreach 遍歷,但它們並*沒有*實作「Traversable」,因此您*無法*使用 instanceof 檢查來檢查 foreach 相容性。

範例

$myarray = array('one', 'two', 'three');
$myobj = (object)$myarray;

if ( !($myarray instanceof \Traversable) ) {
print "myarray 並非 Traversable";
}
if ( !($myobj instanceof \Traversable) ) {
print "myobj 並非 Traversable";
}

foreach ($myarray as $value) {
print $value;
}
foreach ($myobj as $value) {
print $value;
}

輸出
myarray 並非 Traversable
myobj 並非 Traversable
one
two
three
one
two
three
douglas at reith dot com dot au
7 年前
PHP7 的 iterable 偽型別將同時匹配 Traversable 和陣列。非常適合用於返回型別提示,這樣您就不必將您的領域暴露給基礎架構程式碼,例如,儲存庫可以返回提示「iterable」而不是返回游標。
<?php
UserRepository
::findUsers(): iterable
?>

連結:https://php.dev.org.tw/manual/en/migration71.new-features.php#migration71.new-features.iterable-pseudo-type

此外,您可以使用 is_iterable() 方法,而不是
<?php
if( !is_array( $items ) && !$items instanceof Traversable )
//在此處拋出例外
?>

現在您可以使用 is_iterable() 方法
<?php
if ( !is_iterable( $items ))
//在此拋出例外
?>

連結:https://php.dev.org.tw/manual/en/function.is-iterable.php
ajf at ajf dot me
9 年前
請注意,所有物件都可以使用 foreach 進行迭代,它會遍歷每個屬性。這只是描述該類別是否實作了迭代器,即是否有自定義行為。
To Top