Интерфейс Traversable

(PHP 5 >= 5.0.0)

Введение

Интерфейс, определяющий, является ли класс обходимым (traversable) используя foreach.

Абстрактный базовый интерфейс, который не может быть реализован сам по себе. Вместо этого он должен быть реализован используя IteratorAggregate или Iterator.

Замечание:

Внутренние (встроенные) классы, которые реализуют этот интерфейс, могут быть использованы в конструкции foreach и не обязаны реализовывать IteratorAggregate или Iterator.

Замечание:

Это внутренний интерфейс, который не может быть реализован в скрипте PHP. Вместо него нужно использовать либо IteratorAggregate, либо Iterator. При реализации интерфейса, наследующего от Traversable, убедитесь, что в секции implements перед его именем стоит IteratorAggregate или Iterator.

Обзор интерфейсов

Traversable {
}

Этот интерфейс не имеет методов, его единственная цель - быть базовым интерфейсом для всех обходимых классов.

Коментарии

While you cannot implement this interface, you can use it in your checks to determine if something is usable in for each. Here is what I use if I'm expecting something that must be iterable via foreach.

<?php
   
if( !is_array$items ) && !$items instanceof Traversable )
       
//Throw exception here
?>
2010-08-02 13:06:38
http://php5.kiev.ua/manual/ru/class.traversable.html
Автор:
Note that all objects can be iterated over with foreach anyway and it'll go over each property. This just describes whether or not the class implements an iterator, i.e. has custom behaviour.
2014-12-23 02:22:49
http://php5.kiev.ua/manual/ru/class.traversable.html
Автор:
NOTE:  While objects and arrays can be traversed by foreach, they do NOT implement "Traversable", so you CANNOT check for foreach compatibility using an instanceof check.

Example:

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

if ( !($myarray instanceof \Traversable) ) {
    print "myarray is NOT Traversable";
}
if ( !($myobj instanceof \Traversable) ) {
    print "myobj is NOT Traversable";
}

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

Output:
myarray is NOT Traversable
myobj is NOT Traversable
one
two
three
one
two
three
2015-12-30 23:50:56
http://php5.kiev.ua/manual/ru/class.traversable.html
The PHP7 iterable pseudo type will match both Traversable and array. Great for return type-hinting so that you do not have to expose your Domain to Infrastructure code, e.g. instead of a Repository returning a Cursor, it can return hint 'iterable':
<?php
UserRepository
::findUsers(): iterable
?>

Link: migration71.new-features#migration71.new-features.iterable-pseudo-type

Also, instead of:
<?php
   
if( !is_array$items ) && !$items instanceof Traversable )
       
//Throw exception here
?>

You can now do with the is_iterable() method:
<?php
   
if ( !is_iterable$items ))
       
//Throw exception here
?>

Link:  function.is-iterable
2017-06-26 11:09:42
http://php5.kiev.ua/manual/ru/class.traversable.html
Actually you can use `Traversable` within your php scripts - you can use it to enforce iterability on user-land objects.

<?php

interface Stream implements \Traversable {}

class 
InMemoryStream implements IteratorAggregateStream
{
    public function 
getIterator() {}
}

$stream = new InMemoryStream(); 
?>

In case you'd forgot about implementing `IteratorAggregate` or `Iterator` interfaces, fatal error will be raised when instantiating objects in question.

<?php

interface Stream implements \Traversable {}

class 
InMemoryStream implements Stream {}

$stream = new InMemoryStream(); // Fatal error: Class InMemoryStream must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown on line 0
?>
2018-09-21 11:27:38
http://php5.kiev.ua/manual/ru/class.traversable.html

    Поддержать сайт на родительском проекте КГБ