关于PHP实现迭代器和迭代

来源:互联网 发布:网络暴力有哪方面影响 编辑:程序博客网 时间:2024/06/05 07:18

PHP的面向对象引擎提供了一个非常聪明的特性,就是,可以使用foreach()方法通过循环方式取出一个对象的所有属性,就像数组方式一样,代码如下:

<code class="hljs php has-numbering"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Myclass</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-variable">$a</span> = <span class="hljs-string">'php'</span>;    <span class="hljs-keyword">public</span> <span class="hljs-variable">$b</span> = <span class="hljs-string">'onethink'</span>;    <span class="hljs-keyword">public</span> <span class="hljs-variable">$c</span> = <span class="hljs-string">'thinkphp'</span>;}<span class="hljs-variable">$myclass</span> = <span class="hljs-keyword">new</span> Myclass();<span class="hljs-comment">//用foreach()将对象的属性循环出来</span><span class="hljs-keyword">foreach</span>(<span class="hljs-variable">$myclass</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$key</span>.<span class="hljs-string">'=>'</span>.<span class="hljs-variable">$val</span>){    <span class="hljs-keyword">echo</span> <span class="hljs-string">'$'</span>.<span class="hljs-variable">$key</span>.<span class="hljs-string">' = '</span>.<span class="hljs-variable">$val</span>.<span class="hljs-string">"<br/>"</span>;}<span class="hljs-comment">/*返回    $a = php    $b = onethink    $c = thinkphp*/</span></code><ul class="pre-numbering" style="opacity: 0.379238;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li></ul>

如果需要实现更加复杂的行为,可以通过一个iterator(迭代器)来实现

<code class="hljs php has-numbering"><span class="hljs-comment">//迭代器接口</span><span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">MyIterator</span>{</span>    <span class="hljs-comment">//函数将内部指针设置回数据开始处</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">rewind</span><span class="hljs-params">()</span>;</span>    <span class="hljs-comment">//函数将判断数据指针的当前位置是否还存在更多数据</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">valid</span><span class="hljs-params">()</span>;</span>    <span class="hljs-comment">//函数将返回数据指针的值</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">key</span><span class="hljs-params">()</span>;</span>    <span class="hljs-comment">//函数将返回将返回当前数据指针的值</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">value</span><span class="hljs-params">()</span>;</span>    <span class="hljs-comment">//函数在数据中移动数据指针的位置</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">next</span><span class="hljs-params">()</span>;</span>}<span class="hljs-comment">//迭代器类</span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">ObjectIterator</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">MyIterator</span>{</span>    <span class="hljs-keyword">private</span> <span class="hljs-variable">$obj</span>;<span class="hljs-comment">//对象</span>    <span class="hljs-keyword">private</span> <span class="hljs-variable">$count</span>;<span class="hljs-comment">//数据元素的数量</span>    <span class="hljs-keyword">private</span> <span class="hljs-variable">$current</span>;<span class="hljs-comment">//当前指针</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(<span class="hljs-variable">$obj</span>)</span>{</span>        <span class="hljs-variable">$this</span>->obj = <span class="hljs-variable">$obj</span>;        <span class="hljs-variable">$this</span>->count = count(<span class="hljs-variable">$this</span>->obj->data);    }    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">rewind</span><span class="hljs-params">()</span>{</span>        <span class="hljs-variable">$this</span>->current = <span class="hljs-number">0</span>;    }    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">valid</span><span class="hljs-params">()</span>{</span>        <span class="hljs-keyword">return</span> <span class="hljs-variable">$this</span>->current < <span class="hljs-variable">$this</span>->count;    }    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">key</span><span class="hljs-params">()</span>{</span>        <span class="hljs-keyword">return</span> <span class="hljs-variable">$this</span>->current;    }    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">value</span><span class="hljs-params">()</span>{</span>        <span class="hljs-keyword">return</span> <span class="hljs-variable">$this</span>->obj->data[<span class="hljs-variable">$this</span>->current];    }    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">next</span><span class="hljs-params">()</span>{</span>        <span class="hljs-variable">$this</span>->current++;    }}<span class="hljs-class"><span class="hljs-keyword">interface</span> <span class="hljs-title">MyAggregate</span>{</span>    <span class="hljs-comment">//获取迭代器</span>    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getIterator</span><span class="hljs-params">()</span>;</span>}<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">MyObject</span> <span class="hljs-keyword">implements</span> <span class="hljs-title">MyAggregate</span>{</span>    <span class="hljs-keyword">public</span> <span class="hljs-variable">$data</span> = <span class="hljs-keyword">array</span>();    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span><span class="hljs-params">(<span class="hljs-variable">$in</span>)</span>{</span>        <span class="hljs-variable">$this</span>->data = <span class="hljs-variable">$in</span>;    }    <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getIterator</span><span class="hljs-params">()</span>{</span>        <span class="hljs-keyword">return</span> <span class="hljs-keyword">new</span> ObjectIterator(<span class="hljs-variable">$this</span>);    }}<span class="hljs-comment">//迭代器的用法</span><span class="hljs-variable">$arr</span> = <span class="hljs-keyword">array</span>(<span class="hljs-number">2</span>,<span class="hljs-number">4</span>,<span class="hljs-number">6</span>,<span class="hljs-number">8</span>,<span class="hljs-number">10</span>);<span class="hljs-variable">$myobject</span> = <span class="hljs-keyword">new</span> MyObject(<span class="hljs-variable">$arr</span>);<span class="hljs-variable">$myiterator</span> = <span class="hljs-variable">$myobject</span>->getIterator();<span class="hljs-keyword">for</span>(<span class="hljs-variable">$myiterator</span>->rewind();<span class="hljs-variable">$myiterator</span>->valid();<span class="hljs-variable">$myiterator</span>->next()){    <span class="hljs-variable">$key</span> = <span class="hljs-variable">$myiterator</span>->key();    <span class="hljs-variable">$value</span> = <span class="hljs-variable">$myiterator</span>->value();    <span class="hljs-keyword">echo</span> <span class="hljs-variable">$key</span>.<span class="hljs-string">'=>'</span>.<span class="hljs-variable">$value</span>;    <span class="hljs-keyword">echo</span> <span class="hljs-string">"<br/>"</span>;}<span class="hljs-comment">/*返回    0=>2    1=>4    2=>6    3=>8    4=>10*/</span></code><ul class="pre-numbering" style="opacity: 0.379238;"><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li></ul><div class="save_code tracking-ad" data-mod="popu_249" style="display: block;"><a target=_blank target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png" alt="" /></a></div><ul class="pre-numbering" style=""><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li><li>9</li><li>10</li><li>11</li><li>12</li><li>13</li><li>14</li><li>15</li><li>16</li><li>17</li><li>18</li><li>19</li><li>20</li><li>21</li><li>22</li><li>23</li><li>24</li><li>25</li><li>26</li><li>27</li><li>28</li><li>29</li><li>30</li><li>31</li><li>32</li><li>33</li><li>34</li><li>35</li><li>36</li><li>37</li><li>38</li><li>39</li><li>40</li><li>41</li><li>42</li><li>43</li><li>44</li><li>45</li><li>46</li><li>47</li><li>48</li><li>49</li><li>50</li><li>51</li><li>52</li><li>53</li><li>54</li><li>55</li><li>56</li><li>57</li><li>58</li><li>59</li><li>60</li><li>61</li><li>62</li><li>63</li><li>64</li><li>65</li><li>66</li><li>67</li><li>68</li><li>69</li><li>70</li><li>71</li><li>72</li><li>73</li><li>74</li><li>75</li><li>76</li><li>77</li><li>78</li><li>79</li><li>80</li><li>81</li><li>82</li><li>83</li><li>84</li><li>85</li><li>86</li><li>87</li><li>88</li><li>89</li><li>90</li><li>91</li><li>92</li><li>93</li><li>94</li><li>95</li><li>96</li><li>97</li><li>98</li><li>99</li><li>100</li><li>101</li><li>102</li><li>103</li><li>104</li><li>105</li><li>106</li><li>107</li><li>108</li><li>109</li><li>110</li><li>111</li><li>112</li><li>113</li><li>114</li><li>115</li><li>116</li></ul>
0 0