您现在的位置是:群英 > 开发技术 > PHP语言
PHP中foreach怎样实现遍历类对象?
Admin发表于 2021-11-03 17:48:541541 次浏览

    这篇文章给大家分享的是PHP中foreach遍历类对象的实现,foreach 遍历数组很常见,同样foreach也可以遍历对象,文中示例代码介绍的非常详细,感兴趣的朋友接下来一起跟随小编看看吧。

    做如下测试:

class my
{
	public $a = 'a';
	protected $b = 'b';
	private $c = 'c';
	private $data = array('fantasy','windows','linux');
	// 内部foreach遍历class
	function traversable()
	{
		foreach($this as $key=>$val)
		{
			echo $key.'=>';
			print_r($val);
			echo '<br>';
		}
	}
}
$m = new my();
// 外部foreach遍历class
foreach($m as $key=>$val)
{
	echo $key.'=>';
	print_r($val);
	echo '<br>';
}
echo '--------------------------<br>';
// 内部foreach遍历class
$m->traversable();

    输出结果如下:

a=>a

--------------------------

a=>a

b=>b

c=>c

    由此可知,对于外部的foreach遍历是没有权限访问 protected private 这两个修饰的属性的,而在class内部是有权限访问,foreach可以遍历所有的属性。

    今天在写PDO的时候发现可以这样写: 

foreach($db->query('SELECT * FROM tab') as $row)
{
    print_r($row);
}


    这样快速的获取了全部查询结果,可奇怪的是$this->query() 返回的是 object类型 PDOStatement ,var_dump()打印出来的结果是这样的:

object(PDOStatement)#2 (1) {
  ["queryString"]=>
  string(18) "SELECT * FROM user"
}


    PDOStatement里面就一个public属性 queryString  并且foreach也没有出现这个值,这样的情况就不是简单的对属性进行遍历了,而是class继承了iterator迭代器,在foreach的时候会执行class里面的迭代方式,遍历迭代器指定的数据

    关于迭代器看下面的例子:

class test implements Iterator
{
	public $a = 'a';
	private $data = array('apple','banlance','current');
	private $point = 0;
	public function __construct()
	{
		$this->point = 0;
	}
	public function current()
	{
		return $this->data[$this->point];
	}
	public function key()
	{
		return $this->point;
	}
	public function next()
	{
		++$this->point;
	}
	public function rewind()
	{
		$this->point=0;
	}
	public function valid()
	{
		return isset($this->data[$this->point]);
	}
}
$t = new test();
foreach($t as $val)
{
	print_r($val);
	echo '<br>';
}

    输出结果如下:

apple

banlance

    test class 实现iterator的接口,foreach调用的时候会使用这个接口方法,调用过程大致如下面伪代码:

// 迭代过程伪代码
while(valid)
{
<span style="white-space:pre">	</span>current/key
<span style="white-space:pre">	</span>next
}
rewind

    so,之前的foreach对class的处理过程是一种默认方法,如果是继承iterator的class被foreach遍历的时候是上面这种方式

    由此情况去套用 PDO的写法还是行不通,因为如果我们var_dump上面的哪个test类结果是这样的:

test Object
(
    [a] => a
    [data:test:private] => Array
        (
            [0] => apple
            [1] => banlance
            [2] => current
        )
 
    [point:test:private] => 0
)

    但是当我们var_dump $db->query返回的对象时并没有见到point这个iterator接口中定义的属性以及遍历的数据 $data;

    由此我们可以猜测PDOStatement继承了一种迭代的接口但是并不是iterator

    查看手册可以发现:

PDOStatement implements Traversable

    查看Traversable的介绍如下图:

    由此明白了,PDOStatement的迭代实现都是在内部,继承iterator是php脚本的实现方式。

    大致总结下:

    foreach是可以遍历数组的,也可以遍历对象。对象只能罗列出public的属性,如果想要foreach罗列出保护的属性可以让class继承iterator并实现其中的方法,这样foreach遍历一个class的时候是按照class内部实现的iterator进行处理的。
-------------------------------------------------------------
    PDO的问题:

    PDO::query() 返回的是对象 PDOStatement (继承的Traversable这个空接口,必须由Iterator or iteratorAggregate 接口实现)。
    PDOStatement 实现了Iterator接口的方法,其实现方法中操作的就是非public修饰的属性,这个属性里面存储的是查询结果集。
    至此,foreach($db->query('sql..') as $row) 的执行过程明白了

    以上就是关于PHP中foreach遍历类对象的介绍,上述示例具有一定的借鉴价值,有需要的朋友可以参考学习,希望对大家学习PHP有帮助,想要了解更多可以继续浏览群英网络其他相关的文章。

文本转载自脚本之家

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。

相关信息推荐
2022-05-31 17:37:52 
摘要:java子类调用父类的方法:1、子类的对象调用方法时,会首先在子类中查找,如果子类中没有该方法,再到父类中查找;2、如果该方法中又调用了其他方法,那么还是按照之前的顺序,先在子类中查找,再在父类中查找。
2022-02-23 15:05:05 
摘要:这篇文章给大家分享的是HTML中table设置行间距的方法。小编觉得挺实用的,因此分享给大家做个参考,文中的示例代码介绍得很详细,有需要的朋友可以参考,接下来就跟随小编一起了解看看吧。
2021-10-15 16:28:28 
摘要:搭建我的世界服务器,首先要满足自己和别人联机玩mc的平台。可以一次性容纳多人,而且不需要主人在线一直后台运作。服务器是个局域网络,选择一个区去玩,在里面玩会给你带来很好多的成就感,你可以打扮自己的家,也可以开一家小店,吸引客人,让对方买你东西。
云活动
推荐内容
热门关键词
热门信息
群英网络助力开启安全的云计算之旅
立即注册,领取新人大礼包
  • 联系我们
  • 24小时售后:4006784567
  • 24小时TEL :0668-2555666
  • 售前咨询TEL:400-678-4567

  • 官方微信

    官方微信
Copyright  ©  QY  Network  Company  Ltd. All  Rights  Reserved. 2003-2019  群英网络  版权所有   茂名市群英网络有限公司
增值电信经营许可证 : B1.B2-20140078   粤ICP备09006778号
免费拨打  400-678-4567
免费拨打  400-678-4567 免费拨打 400-678-4567 或 0668-2555555
微信公众号
返回顶部
返回顶部 返回顶部