KISS è sempre l'approccio migliore:
foreach($page->paragraphs as $paragraph)
foreach($paragraph->image_ids as $image_id)
$image = $page->images[$image_id]
Ma se vuoi qualcosa di un po 'più speciale, un delegato può aiutarti a fornire la funzionalità "mancante" richiesta e per il quale php 5.3 ha reso le cose super facili grazie a un po' di magia.
<?php
class PageDelegate
{
private $page;
public function construct($page)
{
$this->page = $page;
}
/* The magic delegating methods __call, __set and __get */
public function __call($name, $args)
{
if (method_exists($this->page, $name))
return call_user_func_array(array($this->page, $name), $args);
// you may require some conversion to valid method name
// like converting - to _ etc. this should be kept in mind.
if (array_has_key($this->images, $name))
return $this->images[$name]; // note how this becomes $this->page->images[$name]
throw BadMethodCallException("Method $name does not exist");
}
public function __get($name)
{
if (property_exists($this->page, $name))
return $this->page->{$name};
throw InvalidArgumentException("Property $name does not exist");
}
public function __set($name, $value)
{
if (property_exists($this->page, $name))
$this->page->{$name} = $value;
else
throw InvalidArgumentException("Property $name does not exist");
}
// And perhaps something to help out with common tasks
public function images_in_paragraph($paragraph)
{
$images = array();
foreach($paragraph->image_ids as $image_id)
// Note how this becomes $this-page->images[$image_id];
$images[] = $this->{$image_id}();
// return the collection of image objects in the paragraph
return $images;
}
}
Usando solo i 3 metodi magici __call, __set e __get stiamo delegando efficacemente a tutti i membri dell'istanza di Page e ora puoi chiamare le immagini usando il loro image id come metodo. Se ci sono delle funzionalità della Pagina che vuoi sovrascrivere, semplicemente aggiungendo la funzione verrebbe visto essere chiamato al posto del nostro metodo magico __call per fare le tue offerte. Ora non importa che non puoi cambiare la loro fonte, puoi comunque fare ciò che ti piace. =)
L'implementazione sarebbe quindi simile a questa forse
$page = new PageDelegate($page);
foreach($page->paragraphs as $paragraph)
foreach($page->images_in_paragraph($paragraph) as $image)
echo "<img title=\"$image->title\" src=\"$image->src\">";
nJoy!