怎么在php中使用foreach遍历类对象?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流的数据库。4、面向对象编程:PHP提供了类和对象。5、版本更新速度快。6、具有丰富的功能。7、可伸缩性。8、功能全面,包括图形处理、编码与解码、压缩文件处理、xml解析等。
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 > </span>current/key
<span > </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遍历类对象问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。