PHP 对象遍历

对象遍历:将对象中的所有属性以键值对的形式取出并且进行访问

对象是一种复合数据类型,对象中真正保存的内容是属性

对象的属性本质也是一种键值对关系:名字=值

对象遍历解释利用foreach对对象中的属性进行取出解析

对象遍历遵循访问修饰符限定符的限定:即类外只能遍历所有公有属性

  1. 使用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)](

posted @   傻乎乎的猫  阅读(120)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示