这篇文章主要介绍了php中foreach遍历类对象的总结,对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的介绍如下图:
以上就是php中foreach遍历类对象的总结的详细内容,更多关于php中foreach遍历类对象的资料请关注编程学习网其它相关文章!
本文标题为:php中foreach遍历类对象的总结
- PHP仿tp实现mvc框架基本设计思路与实现方法分析 2022-10-18
- windows下9款一键快速搭建PHP本地运行环境的好工具(含php7.0环境) 2023-09-02
- PHP中PDO事务处理操作示例 2022-10-15
- php微信公众号开发之秒杀 2022-11-23
- PHP简单实现二维数组的矩阵转置操作示例 2022-10-02
- laravel实现按月或天或小时统计mysql数据的方法 2023-02-22
- PHP实现微信支付(jsapi支付)流程步骤详解 2022-10-09
- 用nohup命令实现PHP的多进程 2023-09-02
- Laravel balde模板文件中判断数据为空方法 2023-08-30
- laravel通用化的CURD的实现 2023-03-17