广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP中怎么检测一个类是否可以被foreach遍历
  • 372
分享到

PHP中怎么检测一个类是否可以被foreach遍历

2023-06-15 11:06:27 372人浏览 泡泡鱼
摘要

这篇文章将为大家详细讲解有关PHP中怎么检测一个类是否可以被foreach遍历,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在php中检测一个类是否可以被foreach遍历在PHP中,我们可以非常简单的判

这篇文章将为大家详细讲解有关PHP中怎么检测一个类是否可以被foreach遍历,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

php中检测一个类是否可以被foreach遍历

在PHP中,我们可以非常简单的判断一个变量是什么类型,也可以非常方便的确定一个数组的长度从而决定这个数组是否可以遍历。那么类呢?我们要如何知道这个类是否可以通过 foreach 来进行遍历呢?其实,PHP已经为我们提供了一个现成的接口。

class Obj1{    public $v = 'V:Obj1';    private $prv = 'prv:Obj1';}$obj1 = new Obj1();echo $obj1 instanceof Traversable ? 'yes' : 'no', PHP_EOL; // noclass Obj2 implements IteratorAggregate{    public $v = 'V:Obj2';    private $prv = 'prv:Obj2';    public function getIterator()    {        return new ArrayIterator([            'v' => $this->v,            'prv' => $this->prv,        ]);    }}$obj2 = new Obj2();echo $obj2 instanceof Traversable ? 'yes' : 'no', PHP_EOL; // yes

从上面的例子中可以看出,每一个 \$obj1 无法通过 Traversable 判断,所以它是不能被遍历的。而第二个 $obj2 则是实现了迭代器接口,这个对象是可以通过 Traversable 判断的。在PHP手册中,Traversable 接口正是用于检测一个类是否可以被 foreach 遍历的接口。

这个接口有几个特点:

  1. 实现此接口的内建类可以使用 foreach 进行遍历而无需实现 IteratorAggregate 或 Iterator 接口。

  2. 这是一个无法在 PHP 脚本中实现的内部引擎接口。IteratorAggregate 或 Iterator 接口可以用来代替它。

也就是说这个接口不需要我们去手工实现,只需要我们的类实现迭代器相关的接口就可以通过这个接口的验证的判断。如果单独去实现这个接口的话,将会报错并提示我们应该去实现 IteratorAggregate 或 Iterator 接口。

// Fatal error: Class ImplTraversable must implement interface Traversable as part of either Iterator or IteratorAggregate in Unknown class ImplTraversable implements Traversable{}

其实之前的文章中,我们已经验证过,对象是可以被遍历的,而且并不需要实现什么迭代器接口就可以被 foreach 遍历。它会输出 所有 public 的属性。

// foreachforeach ($obj1 as $o1) {    echo $o1, PHP_EOL;}foreach ($obj2 as $o2) {    echo $o2, PHP_EOL;}// V:Obj1// V:Obj2// prv:Obj2

也就是说这个 Traversable 接口的作用在实际使用中并不明显。相信我们决大部分人也并没有使用过这个接口来判断过类是否可以被遍历。但是从上面的例子中我们可以看出,迭代器能够自定义我们需要输出的内容。相对来说比直接的对象遍历更加的灵活可控。另外,如果是数组强转对象的情况,Traversable 接口同样无法进行判断。

$arr = [1, 2, 3, 4];$obj3 = (object) $arr;echo $obj3 instanceof Traversable ? 'yes' : 'no', PHP_EOL; // noforeach ($obj3 as $o3) {    echo $o3, PHP_EOL;}

其实,数组本身就是天然的可迭代对象。这里虽然进行了类型强转,但其实应该将数组强转的对象视为默认实现了迭代的器的对象更合适。当然,这类接口更大的意义还是在于代码规范及强制检查方面。

关于“PHP中怎么检测一个类是否可以被foreach遍历”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: PHP中怎么检测一个类是否可以被foreach遍历

本文链接: https://www.lsjlt.com/news/279974.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP中怎么检测一个类是否可以被foreach遍历
    这篇文章将为大家详细讲解有关PHP中怎么检测一个类是否可以被foreach遍历,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在PHP中检测一个类是否可以被foreach遍历在PHP中,我们可以非常简单的判...
    99+
    2023-06-15
  • php怎么检测指定字符串中是否包含另一个字符串
    4种方法:1、用strpos(),语法“strpos(字符串,另一个字符串)”,返回位置值则包含。2、用strrpos(),语法“strrpos(字符串,另一字符串)”,返回位置值则包含。3、用explode(),语法“explode(另一...
    99+
    2022-09-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作