Что такое тип iterable PHP 7.1?


я видел некоторые коды, чтобы проверить PHP 7.1, и я нашел следующий фрагмент:

function doLoop(iterable $iterable) {
    foreach ($iterable as $value) {
        echo $value;
    }
}

$data = [1, 2, 3, 4];
doLoop($data);

iterable, я могу гарантировать, что аргумент, переданный будьте array, но я могу получить в том же результат, если вы это сделаете:

function doLoop(array $iterable) {
    foreach ($iterable as $value) {
        echo $value;
    }
}

$data = [1, 2, 3, 4];
doLoop($data);

Какая разница то на самом деле array iterable? Он действительно является своего рода?

Author: gmsantos, 2017-04-10

1 answers

" Не является типом, это псевдо типа (например, callable). В зависимости от этого, указывает, что функция принимает в качестве параметра как array, как и любой объект, который реализует интерфейс Traversable. То есть, принимает также объекты типа array-like, которые работают в loop foreach.

, указанное в параметре функции, то же будет принимать значения типа array, Iterator, Generator, etc. Если не указан ни один из этих типов, исключение типа TypeError стрелять.

function foo(iterable $iterable) {
    foreach ($iterable as $value) {
        // ...
    }
}

Также Может быть использован для определения возвращаемого значения функции:

function bar(): iterable {
    return [1, 2, 3];
}

При использовании в параметрах, даже, может иметь значение по умолчанию null или даже array пустой.

function foo(iterable $iterable = null) {
    // ...
}

В качестве generator суб-тип Traversable, следующее является допустимым:

function gen(): iterable {
    yield 1;
    yield 2;
    yield 3;
}

В Основном, чтобы знать, типа iterable, просто использовать функцию is_iterable:

var_dump(is_iterable([1, 2, 3])); // bool(true)
var_dump(is_iterable(new ArrayIterator([1, 2, 3]))); // bool(true)
var_dump(is_iterable((function () { yield 1; })())); // bool(true)
var_dump(is_iterable(1)); // bool(false)
var_dump(is_iterable(new stdClass())); // bool(false)

Слово iterable определяется как зарезервированные слова для имен классов, поэтому классы, интерфейсы и стиль игры не могут быть названы iterable.

Примечание: что PHP позволяет использовать foreach об объектах, итерацию свойств общественного пользования, объект не будет рассматриваться iterable не имеет тип Traversable.

Артикул: PHP RFC: Iterable

 7
Author: Woss, 2017-04-10 01:36:11