为什么集合对象的protected属性,可以被foreach显示出来

例如以动态属性调用关联时,返回的就是集合,可以用foreach显示

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 10

怎么 foreach ?没明白,上代码吧。

2年前 评论
class Collection implements ArrayAccess
2年前 评论

@LiamHao

<?php
use App\Models\Topic;

Route::get('test/{topic}', function (Topic $topic){
    dump($topic->replies);
    foreach($topic->replies as $reply)
    {
        dump($reply);
    }

});

打印显示

file

可以看到这个item是protected,但是foreach的时候还是拿到它了,而且本来是应该输出一个数组,这里却输出了数组成员

2年前 评论

你需要对PHP原生 ArrayAccess 接口了解一下

2年前 评论

@JimChen 能否细说下,我还是没有看懂 :joy:

2年前 评论
panda-sir

2楼正解 php.net 搜下ArrayAccess 接口吧

2年前 评论

额,文档第一句话就有了
提供像访问数组一样访问对象的能力的接口。

只要你对象实现的 ArrayAccess 接口,那么你就可以像数组一样遍历,
就像你上面那样的, 明显你打印的$topic->repliesIlluminate\Support\Collection 对象

foreach($topic->replies as $reply)
{
        dump($reply);
}

你再去看看 Illuminate\Support\Collection 源码就知道了,实现的ArrayAccess 方法里面 offsetGet, offsetSet, offsetExists, offsetUnset 全都是对 item 处理

2年前 评论

@JimChen 我知道这个接口的功能了,但我还是不知道集合是怎么通过这个接口实现我提的那个问题。。。。

2年前 评论

我都叫你自己去看源码实现,源码写得真的很简单的

2年前 评论

貌似是通过Iterator实现的,但是没找到。。。先mark下,以后作答

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!