@metacortex, si es una colección, segui tratándolo como un array, y cuando desarrolles la clase "collection" le das soporte para acceder como array a través de
ArrayAccess, podes hacer esto:
Una implementacion muy simple:
Item, clase básica para guardar en la colección, en tu caso seria Image o algo parecido.
Código PHP:
Ver originalclass Item
{
/**
* @var string|integer
*/
protected $_id;
/**
* @var string
*/
protected $_name;
/**
* @param string|integer $id
* @param string $name
*/
public function __construct($id, $name)
{
$this->_id = (int)$id;
$this->_name = (string)$name;
}
/**
* @return string|integer $_id
*/
public function getId()
{
return $this->_id;
}
/**
* @param string $_name
* @return Item provide fluent interface
*/
public function setName($name)
{
$this->_name = (string)$name;
return $this;
}
/**
* @return string $_name
*/
public function getName()
{
return $this->_name;
}
public function __toString()
{
return (string)$this->_id;
}
}
Collection, esta clase deberia implementar
Iteraror,
SeekableIterator,
ArrayAccess y
Countable, pero para simplificar, en ejemplo utilizo
IteratorAggregate.
Código PHP:
Ver originalclass Collection implements IteratorAggregate
{
/**
* @var array
*/
protected $_data = array();
/**
* Implements IteratorAggregate
* @return ArrayIterator
*/
public function getIterator()
{
return new ArrayIterator($this->_data);
}
}
class ItemCollection extends Collection
{
/**
* @param Item $i
* @return Collection provide fluent interface
*/
public function add(Item $i)
{
$this->_data[(string)$i] = $i;
return $this;
}
}
Test:
Código PHP:
Ver original$collection = new ItemCollection();
$i1 = new Item(101, 'Item 1');
$i2 = new Item(201, 'Item 2');
$collection->add($i1)
->add($i2);
$it = $collection->getIterator();
assert($it->offsetGet(101) === $it[101]); //pass assert($it->offsetGet(101) === $it[201]); //fail
foreach($it as $item){
echo $item->getId() . ' - ' . $item->getName() . PHP_EOL;
}
Es algo sencillo de conseguir y te permite acceder a los elementos de la colleción de las dos formas como objeto o como array.
@abimaelrc, hay que tener cuidado con esa forma de implementar
__set, porque tiene un efecto poco deseable, podes setear cualquier cosa, es como si las propiedades fueran públicas, por eso se setean en el array las keys y se comprueba que existan.
Saludos.