July 7, 2008

Iterator [GoF]

Lot’s of people like to write down things into lists, so that they can go through that list later and check whether everything was fine. Normally every recipe has a list ~ there’s always a list of ingredients at the beginning of the recipe. This short example shows how such a list can be processed in PHP. So why would you want to have something else than a array to hold your objects? - My example still uses a array to hold the objects (uni- or bidirectional lists would also be possible) but it adds a kind of a facade to the array so that the common managements-tasks are handled within the List-Object. Everything you need for this example is present in PHP since version 5.0. The basic steps you need to do is to provide a “Object” and an “ObjectList” which implements the native “Iterator” interface and then you’re able to have very handy lists :)

class Incredient {

public $name,$amount; public function __construct($name,$amount) { $this->name = $name; $this->amount = $amount; } }

class Recipe implements Iterator { public $title; private $ingredients;

public function __construct ($title) { $this->title = $title; }

public function addIncredient(Incredient $in) { $this->ingredients[] = $in; }

public function current ()  {   return current ($this->ingredients);    } public function key ()      {   return key($this->ingredients);         } public function valid ()    {   return current ($this->ingredients);    } public function rewind ()   {   return reset ($this->ingredients);      } public function next ()     {   return next ($this->ingredients);       } }

$cookieRecipe = new Recipe(“Chocolate Cookie”); $cookieRecipe->addIncredient(new Incredient(‘Flour’,‘2.5 cups’)); $cookieRecipe->addIncredient(new Incredient(‘Baking soda’,‘1 teaspoon’)); $cookieRecipe->addIncredient(new Incredient(‘Salt’,‘0.5 teaspoon’)); $cookieRecipe->addIncredient(new Incredient(‘Butter’,‘1 cup’)); $cookieRecipe->addIncredient(new Incredient(‘Sugar’,‘1 cup’)); $cookieRecipe->addIncredient(new Incredient(‘Brown Sugar’,‘0.5 cup’)); $cookieRecipe->addIncredient(new Incredient(‘Vanilla extract’,‘1 teaspoon’)); $cookieRecipe->addIncredient(new Incredient(‘Egg’,‘1-2’)); $cookieRecipe->addIncredient(new Incredient(‘Chocolate chips’,‘2 cups’));

// process recipe: foreach($cookieRecipe as $inc) { echo $inc->name.“ => ”.$inc->amount.”
”; }

As you see it’s pretty easy to have lists of objects in PHP. You might also think that always creating to some list-object over and over again is very odd and you’re right. For the most common tasks like iterating through arrays, directory-lists and a few more task you can use objects which are shipped with the Standard PHP Library ,which is also part of PHP since version 5 and mandatory in 5.3. So the example shown above could also look like this:

$recipe = array(); $recipe[] = new Incredient(‘Flour’,‘2.5 cups’); $recipe[] = new Incredient(‘Baking soda’,‘1 teaspoon’); $recipe[] = new Incredient(‘Salt’,‘0.5 teaspoon’); $recipe[] = new Incredient(‘Butter’,‘1 cup’); $recipe[] = new Incredient(‘Sugar’,‘1 cup’); $recipe[] = new Incredient(‘Brown Sugar’,‘0.5 cup’); $recipe[] = new Incredient(‘Vanilla extract’,‘1 teaspoon’); $recipe[] = new Incredient(‘Egg’,‘1-2’); $recipe[] = new Incredient(‘Chocolate chips’,‘2 cups’);

$recipeIncObj = new ArrayObject($recipe); $ingredientsIt = $recipeIncObj->getIterator();

foreach($ingredientsIt as $inc) { echo $inc->name.“ => ”.$inc->amount.”
”; }

As I said at the beginning, there are lots of situations where you might want to have a list for something and if you store that list in PHP the Iterator-pattern can keep your code clean and tasty :)

© tolleiv 2016 - CC BY-SA 3.0 - Powered by Hugo