可迭代对象和数组类型提示? [英] Iterable objects and array type hinting?

查看:27
本文介绍了可迭代对象和数组类型提示?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有很多函数,它们要么具有数组类型提示,要么使用 is_array() 来检查变量的数组特性.

I have a lot of functions that either have type hinting for arrays or use is_array() to check the array-ness of a variable.

现在我开始使用可迭代的对象.它们实现 IteratorIteratorAggregate.如果它们通过类型提示或经过 is_array(),它们会被作为数组接受吗?

Now I'm starting to use objects that are iterable. They implement Iterator or IteratorAggregate. Will these be accepted as arrays if they pass through type hinting, or undergo is_array()?

如果我必须修改我的代码,是否有一种通用的 is_iterable(),或者我必须这样做:

If I have to modify my code, is there a generic sort of is_iterable(), or must I do something like:

if ( is_array($var) OR $var instance_of Iterable OR $var instanceof IteratorAggregate ) { ... }

还有哪些其他可迭代的接口?

What other iterable interfaces are out there?

推荐答案

我想你的意思是 instanceof Iterator,PHP 没有 Iterable 接口.它确实有一个 Traversable 接口.IteratorIteratorAggregate 都扩展了 Traversable (并且 AFAIK 他们是唯一这样做的).

I think you mean instanceof Iterator, PHP doesn't have an Iterable interface. It does have a Traversable interface though. Iterator and IteratorAggregate both extend Traversable (and AFAIK they are the only ones to do so).

但是不,实现 Traversable 的对象不会通过 is_array() 检查,也没有内置的 is_iterable()功能.您可以使用的支票是

But no, objects implementing Traversable won't pass the is_array() check, nor there is a built-in is_iterable() function. A check you could use is

function is_iterable($var) {
    return (is_array($var) || $var instanceof Traversable);
}

需要明确的是,所有 php 对象都可以用foreach 进行迭代,但只有一些 实现了Traversable.因此,提供的 is_iterable 函数不会检测到 foreach 可以处理的所有内容.

To be clear, all php objects can be iterated with foreach, but only some of them implement Traversable. The presented is_iterable function will therefore not detect all things that foreach can handle.

这篇关于可迭代对象和数组类型提示?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆