2013-11-17 4 views
1

Я прочитал пример IteratorAggregate в PHP manual. Я пытаюсь удалить интерфейс IteratorAggregate, но выходы схожи с реализованным.Когда нам нужна SPL IteratorAggregate?

<?php  
    class myData { 
     public $property1 = "Public property one"; 
     public $property2 = "Public property two"; 
     public $property3 = "Public property three"; 

     public function __construct() { 
      $this->property4 = "last property"; 
     } 
    } 

    $obj = new myData; 

    foreach($obj as $key => $value) { 
     var_dump($key, $value); 
     echo "\n"; 
    } 

Выходы:

string(9) "property1" 
string(19) "Public property one" 

string(9) "property2" 
string(19) "Public property two" 

string(9) "property3" 
string(21) "Public property three" 

string(9) "property4" 
string(13) "last property" 

Я хочу знать, что, когда мы должны реализовать IteratorAggregate интерфейс? И почему выводы совпадают?

ответ

5

Пример на странице руководства не является отличным, именно из-за того, что вы здесь описываете. Пример класс реализует IteratorAggregate и делает это:

public function getIterator() { 
    return new ArrayIterator($this); 
} 

ArrayIterator, при условии, с объектом, просто обеспечивает общие свойства объекта. Это можно сделать, как вы демонстрируете, просто выполнив foreach на исходном объекте.

Более полезным примером могло бы быть, если бы мы хотели отразить другой выбор значений. Например, предположим, что все эти элементы были private, и мы не хотим, чтобы отправить $property3:

class myData implements IteratorAggregate { 
    private $property1 = "Public property one"; 
    private $property2 = "Public property two"; 
    private $property3 = "Public property three"; 

    public function __construct() { 
     $this->property4 = "last property"; 
    } 

    public function getIterator() { 
     return new ArrayIterator(array(
      'property1' => $this->property1, 
      'property2' => $this->property2, 
      'property4' => $this->property4 
     )); 
    } 
} 

$obj = new myData; 

foreach($obj as $key => $value) { 
    var_dump($key, $value); 
    echo "\n"; 
} 

Это построить итератор со свойствами вы хотели, не все из них.

Вы можете построить любой итератор таким образом, даже один полностью не связанный со свойствами класса. Часто лучший способ сделать это - реализовать Iterator, но иногда, если будет быстрее построить новый объект итератора и указать на это с помощью getIterator.

3

Теперь измените код, чтобы использовать частные или защищенные свойства, и попробуйте еще раз ...

Текущий эффект, что если вы итерацию над объектом с общественными свойствами, объект отливают в массив, делая все public properties - ключи и значения. И это то, что у вас есть.

С интерфейсом interator вы можете перебирать значения, недоступные в общедоступных свойствах. Они также могут быть созданы только в тот момент, когда вы обращаетесь к ним, т. Е. Извлекаете из базы данных.

Смежные вопросы