雖然您無法實作此介面,但您可以在檢查中使用它來判斷某些東西是否可用於 foreach。如果我預期某些東西必須透過 foreach 迭代,我會使用以下程式碼。
<?php
if( !is_array( $items ) && !$items instanceof Traversable )
//在此處拋出例外
?>
(PHP 5, PHP 7, PHP 8)
此介面沒有方法,它唯一的目的是作為所有可遍歷類別的基底介面。
版本 | 說明 |
---|---|
7.4.0 | Traversable 介面現在可以由抽象類別實現。繼承的類別必須實現 Iterator 或 IteratorAggregate。 |
注意:
實作此介面的內建 (內置) 類別可以在 foreach 結構中使用,並且不需要實作 IteratorAggregate 或 Iterator。
注意:
在 PHP 7.4.0 之前,這個內部引擎介面無法在 PHP 腳本中實作。必須改用 IteratorAggregate 或 Iterator。
雖然您無法實作此介面,但您可以在檢查中使用它來判斷某些東西是否可用於 foreach。如果我預期某些東西必須透過 foreach 迭代,我會使用以下程式碼。
<?php
if( !is_array( $items ) && !$items instanceof Traversable )
//在此處拋出例外
?>
注意:雖然物件和陣列可以透過 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
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