怎么在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遍历类对象问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注亿速云行业资讯频道了解更多相关知识。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。