第七章:第18节 PHP面向对象——数组与对象相互转换(二)

更新于:2017-06-11 21:23:15

对象遍历:


数组可以用foreach遍历,其实对象也可以用foreach遍历。


对象使用foreach语句进行遍历,有两点注意:

1,只能遍历属性。

2,只能遍历“看得到”的属性——代码所在范围可访问。


在外面遍历:

1.png

1.png

在外面遍历只能遍历出public修饰的属性,想遍历出全部,可以在类内部写一个方法:


1.png

1.png

第一个方法遍历全部,第二个方法做了改进,只遍历出指定的属性。


拓展下:如果想在类的外面遍历对象所有的属性,包括不公开的,也是可以做到的。怎么做?手册里有介绍:


让类去实现一个PHP的内置接口——Iterator(迭代器)接口。


1.png

在类中重新定义这5个方法,具体怎么定义可去参考手册,这里不做介绍了。


对象转数组:


既然对象也可以foreach,代码和数组转对象几乎一样:

1.png

1.png

1.png


public修饰的属性都转成功了,也可以把这个方法写入类内部把全部属性都转成数组成员。


如果用类型转换符(array)可以把不公开的属性转成数组成员吗?(我们把其中一个属性改成private)


1.png

1.png

把对象强制转换成数组,可见是可以把不公开的属性转成数组成员的,只是下标名字做了改动,不是直接用的属性名称。


有时候,一个对象我们不刻意去转成数组,直接把它当成数组用:


1.png

1.png

第11行,直接把对象当成数组使用,报错了。


怎么才可以正常使用呢?


这还得需要借助PHP内置的一个接口:

1.png


1.png

1.png

这个对象可以当成数组使用了。类实现了接口ArrayAccess,当有类似于21行这样的代码执行,系统就会自动调用类中的offsetGet方法。


关于这个ArrayAccess接口具体使用更多地去参考手册,结合类的__get、__set等魔术方法,可以写出很丰富的功能来。


小节:这两节的内容不算难,数组与对象的转换还是会经常用到的,大家要会做下简单地转换。对象直接拿来当数组用,在开发框架时会用到,平时的逻辑开发中不是强型需求。


本节学习代码》》》