当前位置:首页 > PHP教程 > php应用 > 列表

php遍历对象的方法

发布:smiling 来源: PHP粉丝网  添加日期:2022-04-25 16:21:03 浏览: 评论:0 

这篇文章主要介绍了php遍历对象的方法,帮助大家更好的理解和学习使用php,感兴趣的朋友可以了解下。

目录

对于php来说,foreach是非常方便好用的一个语法,几乎对于每一个PHPer它都是日常接触最多的请求之一。那么对象是否能通过foreach来遍历呢?

答案是肯定的,但是有个条件,那就是对象的遍历只能获得它的公共属性。

  1. // 普通遍历 
  2. class A 
  3.     public $a1 = '1'
  4.     public $a2 = '2'
  5.     public $a3 = '3'
  6.  
  7.     private $a4 = '4'
  8.     protected $a5 = '5'
  9.  
  10.     public $a6 = '6'
  11.  
  12.     public function test() 
  13.     { 
  14.         echo 'test'
  15.     } 
  16. $a = new A(); 
  17. foreach ($a as $k => $v) { 
  18.     echo $k'==='$v, PHP_EOL; 
  19.  
  20. // a1===1 
  21. // a2===2 
  22. // a3===3 
  23. // a6===6 

不管是方法还是受保护或者私有的变量,都无法遍历出来。只有公共的属性才能被遍历出来。其实,我们之前在讲设计模式时讲过的迭代器模式就是专门用来进行对象遍历的,而且PHP已经为我们准备好了相关的接口,我们只需要去实现这个接口就可以完成迭代器模式的创建了。具体的内容可以参考之前的设计模式系列文章:PHP设计模式之迭代器模式

  1. // 实现迭代器接口 
  2. class B implements Iterator 
  3.     private $var = []; 
  4.  
  5.     public function __construct($array
  6.     { 
  7.         if (is_array($array)) { 
  8.             $this->var = $array
  9.         } 
  10.     } 
  11.  
  12.     public function rewind() 
  13.     { 
  14.         echo "rewinding\n"
  15.         reset($this->var); 
  16.     } 
  17.  
  18.     public function current() 
  19.     { 
  20.         $var = current($this->var); 
  21.         echo "current: $var\n"
  22.         return $var
  23.     } 
  24.  
  25.     public function key() 
  26.     { 
  27.         $var = key($this->var); 
  28.         echo "key: $var\n"
  29.         return $var
  30.     } 
  31.  
  32.     public function next() 
  33.     { 
  34.         $var = next($this->var); 
  35.         echo "next: $var\n"
  36.         return $var
  37.     } 
  38.  
  39.     public function valid() 
  40.     { 
  41.         $var = $this->current() !== false; 
  42.         echo "valid: {$var}\n"
  43.         return $var
  44.     } 
  45.  
  46. $b = new B([1, 2, 3, 4]); 
  47.  
  48. foreach ($b as $k => $v) { 
  49.     echo $k'==='$v, PHP_EOL; 
  50.  
  51. // rewinding 
  52. // current: 1 
  53. // valid: 1 
  54. // current: 1 
  55. // key: 0 
  56. // 0===1 
  57. // next: 2 
  58. // current: 2 
  59. // valid: 1 
  60. // current: 2 
  61. // key: 1 
  62. // 1===2 
  63. // next: 3 
  64. // current: 3 
  65. // valid: 1 
  66. // current: 3 
  67. // key: 2 
  68. // 2===3 
  69. // next: 4 
  70. // current: 4 
  71. // valid: 1 
  72. // current: 4 
  73. // key: 3 
  74. // 3===4 
  75. // next: 
  76. // current: 
  77. // valid: 

假如今天的文章只是讲之前讲过的迭代器模式,那就太没意思了,所以,咱们还要来学习一个更有意思的应用。那就是让对象可以像数组一样进行操作。这个其实也是使用PHP早已为我们准备好的一个接口:ArrayAccess。

  1. // 让类可以像数组一样操作 
  2. class C implements ArrayAccess, IteratorAggregate 
  3.     private $container = []; 
  4.     public function __construct() 
  5.     { 
  6.         $this->container = [ 
  7.             "one" => 1, 
  8.             "two" => 2, 
  9.             "three" => 3, 
  10.         ]; 
  11.     } 
  12.     public function offsetSet($offset$value
  13.     { 
  14.         if (is_null($offset)) { 
  15.             $this->container[] = $value
  16.         } else { 
  17.             $this->container[$offset] = $value
  18.         } 
  19.     } 
  20.     public function offsetExists($offset
  21.     { 
  22.         return isset($this->container[$offset]); 
  23.     } 
  24.     public function offsetUnset($offset
  25.     { 
  26.         unset($this->container[$offset]); 
  27.     } 
  28.     public function offsetGet($offset
  29.     { 
  30.         return isset($this->container[$offset]) ? $this->container[$offset] : null; 
  31.     } 
  32.  
  33.     public function getIterator() { 
  34.         return new B($this->container); 
  35.     } 
  36.  
  37. $c = new C(); 
  38. var_dump($c); 
  39.  
  40. $c['four'] = 4; 
  41. var_dump($c); 
  42.  
  43. $c[] = 5; 
  44. $c[] = 6; 
  45. var_dump($c); 
  46.  
  47. foreach($c as $k=>$v){ 
  48.     echo $k'==='$v, PHP_EOL; 
  49.  
  50. // rewinding 
  51. // current: 1 
  52. // valid: 1 
  53. // current: 1 
  54. // key: one 
  55. // one===1 
  56. // next: 2 
  57. // current: 2 
  58. // valid: 1 
  59. // current: 2 
  60. // key: two 
  61. // two===2 
  62. // next: 3 
  63. // current: 3 
  64. // valid: 1 
  65. // current: 3 
  66. // key: three 
  67. // three===3 
  68. // next: 4 
  69. // current: 4 
  70. // valid: 1 
  71. // current: 4 
  72. // key: four 
  73. // four===4 
  74. // next: 5 
  75. // current: 5 
  76. // valid: 1 
  77. // current: 5 
  78. // key: 0 
  79. // 0===5 
  80. // next: 6 
  81. // current: 6 
  82. // valid: 1 
  83. // current: 6 
  84. // key: 1 
  85. // 1===6 
  86. // next:  
  87. // current:  
  88. // valid:  

这个接口需要我们实现四个方法:

offsetSet($offset, $value),根据偏移量设置值

offsetExists($offset),根据偏移量确定是否存在内容

offsetUnset($offset),根据偏移量删除内容

offsetGet($offset),根据依稀量获取内容

这里的偏移量就是我们常说的下标。通过实现这四个方法,我们就可以像操作数组一样的操作对象。当然,日常开发中我们可能并不会很经常的使用包括迭代器在内的这些对象遍历的能力。

通常我们会直接去将对象转换成数组 (array) obj 来进行下一步的操作。不过,在java中,特别是JavaBean中会经常在类的内部有一个 List 为自己的对象来表示自身的集合状态。

通过对比,我们发现PHP也完全可以实现这样的能力,而且使用迭代器和 ArrayAccess 接口还能够更方便的实现类似的能力。这是非常有用的一种知识扩展,或许下一个项目中你就能运用上这些能力哦!

测试代码:github.com/zhangyue050…

Tags: php遍历对象

分享到: