PHP 对象迭代与 get_object_vars()
在 PHP 如何迭代一个对象 ( 上 ) 章节中我们介绍了迭代一个对象的基本原则 「迭代输出当前作用域范围内对象的可见属性」。那么,你知道这背后的原理吗?
你有没有使用过 get_object_vars()
这个函数,你知道它的作用吗? 你知道在一个继承体系下返回的结果吗?
get_object_vars()
get_object_vars()
这个函数,按照官方手册里的介绍,它的作用是 「 返回由对象属性组成的关联数组 」。但准确的定义,应该是 「返回当前作用域范围内对象的可见属性组成的关联数组」。
也许,你就会好奇了,这个定义和使用 foreach 迭代一个对象的原则一模一样啊。
对啊,是一样,因为 foreach 迭代一个对象的时候会调用 get_object_vars()
返回当前作用域范围内对象的可见属性组成的关联数组,然后才对这个关联数组进行迭代。
不信? 我们写一个范例来演示下
<?php class Person { public $name = "语飞"; public $sexy = "男"; protected $age = 30; private $married = "no"; } class Employee extends Person { public $job = "CEO"; public function intro() { foreach($this as $k => $v ) { echo $k, " => ", $v, "\n"; } echo "\n"; foreach(get_object_vars($this) as $k => $v ) { echo $k, " => ", $v, "\n"; } } } $me = new Employee(); $me->intro(); echo "\n--------------------\n"; foreach($me as $k => $v ) { echo $k, " => ", $v, "\n"; } echo "\n\n"; foreach(get_object_vars($me) as $k => $v ) { echo $k, " => ", $v, "\n"; }
运行结果如下
[yufei@www.twle.cn helloworld]$ php d.php job => CEO name => 语飞 sexy => 男 age => 30 job => CEO name => 语飞 sexy => 男 age => 30 -------------------- job => CEO name => 语飞 sexy => 男 job => CEO name => 语飞 sexy => 男
怎么样? 是不是完全相同?