PHP 对象遍历
对象遍历:将对象中的所有属性以键值对的形式取出并且进行访问
对象是一种复合数据类型,对象中真正保存的内容是属性
对象的属性本质也是一种键值对关系:名字=值
对象遍历解释利用foreach对对象中的属性进行取出解析
对象遍历遵循访问修饰符限定符的限定:即类外只能遍历所有公有属性
- 使用foreach语句进行遍历
PHP提供了一种定义对象的方法,使其可以通过单元列表来遍历,比如 foreach 语句。所有可见属性都将被遍历。
关于foreach,它的语法结构提供了遍历数组的简单方式。foreach仅能够应用于数组和对象,若是应用于其他数据类型的变量,或者未初始化的变量,就会报错。具体语法如下:(两种)
foreach (iterable_expression as $value)
statement
foreach (iterable_expression as $key => $value)
statement
//解析:iterable_expression 指的是可迭代的表达式。第一种格式遍历给定的 iterable_expression
迭代器。每次循环中,当前单元的值被赋给 $value
。第二种格式做同样的事,只除了当前单元的键名也会在每次循环中被赋给变量 $key
。
回归到话题“对象的遍历”,下面我们用实例来演示foreach遍历对象。
<?php
/**
* Created by PhpStorm.
* User: SillyCat
* Date: 2024/2/24
* Time: 20:46
*/
namespace 对象遍历;
class Test
{
public $vaule1='1';
public $vaule2='2';
protected $protected='protected';
private $private='private';
}
$test=new Test();
foreach ($test as $key=>$value) {
echo $key . '=>' . $value;
}
//vaule1=>1vaule2=>2
总结:不管是方法还是受保护或者私有的变量,都无法遍历出来。只有公共的属性才能被遍历出来。于是,我们可以实现Iterator接口,让对象自行决定如何遍历以及每次遍历时哪些值可用。
2. 实现Iterator 接口的对象遍历:
Iterator是一个PHP预定义的接口类, 可以直接使用, 这是它内部的结构:
Iterator extends Traversable
{
abstract public current(): mixed — 返回当前元素
abstract public key(): scalar — 返回当前元素的键
abstract public next(): void — 向前移动到下一个元素
abstract public rewind(): void — 返回到迭代器的第一个元素
abstract public valid(): bool — 检查当前位置是否有效
}
<?php
/**
* Created by PhpStorm.
* User: SillyCat
* Date: 2024/2/24
* Time: 20:51
*/
namespace 对象遍历;
class MyIterator implements \Iterator
{
// 保存数据的数组
private $var = array();
// 当前的键
public function __construct($array)
{
if (is_array($array)) {
$this->var = $array;
}
}
// 重置数组:返回到迭代器的第一个元素
public function rewind()
{
echo "rewinding\n";
reset($this->var);
}
// 返回当前元素
public function current()
{
$var = current($this->var);
echo "current: $var\n";
return $var;
}
//返回当前元素的键
public function key()
{
$var = key($this->var);
echo "key: $var\n";
return $var;
}
// 向前移动到下一个元素
public function next()
{
$var = next($this->var);
echo "next: $var\n";
return $var;
}
// 检查当前位置是否有效
public function valid()
{
$var = $this->current() !== false;
echo "valid: {$var}\n";
return $var;
}
}
$arr = array("php", "web", "java");
$myIterator = new MyIterator($arr);
foreach ($myIterator as $key => $val) {
echo "key: $key value: $val\n";
}
3. 使用ArrayAccess接口:
其实PHP早已为我们准备好了一个接口:ArrayAccess。可以让对象能够像数组一样进行操作。
IteratorAggregate(聚合式迭代器)接口:创建外部迭代器的接口。下面我们来演示一下:
4.生成器
生成器对于内存的优化
生成器:generator ,生成器提供了一种更容易的方法来实现对象迭代
相比定义类实现interator 接口的方式,性能开销和复杂性大大降低
生成器是 暂停循环执行逻辑
yield 关键字代表暂停代码继续向下执行,知道代码被使用
[PHP迭代生成器秒级导出500万数据 - 掘金 (juejin.cn)](
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~