Исходя из информации в вопросе, я бы, вероятно, использовал Шаблон команды
Все комнаты должны реализовывать команду parse ()
interface Parseable
{
public function parse($arr, $dept);
}
Экземпляр комнаты может выглядеть следующим образом
class Room implements Parseable
{
protected $_price;
protected $_adults;
public function parse($arr, $dept) {
// nonsense calculation, exchange with your parse logic
$this->_price = $arr * $dept * rand();
return $this;
}
public function getPrice()
{
return $this->_price;
}
}
Чтобы просмотреть их, я бы добавил их в Invoker, который хранит все комнаты и знает, как вызвать их метод parse (), а также знает, что делать с возвратом из parse (), если необходимо
class RoomParser extends SplObjectStorage
{
// makes sure we only have objects implementing parse() in store
public function attach(Parseable $obj)
{
parent::attach($obj);
}
// invoking all parse() methods in Rooms
public function parseRooms($arr, $dept)
{
for($this->rewind(); $this->valid(); $this->next()) {
$ret = $this->current()->parse($arr, $dept);
// do something with $ret
echo $ret->getPrice(), PHP_EOL;
}
}
// other methods
}
И тогда вы можете использовать это так:
$parser = new RoomParser;
$parser->attach(new Room);
$parser->attach(new Room);
$parser->attach(new Room);
$parser->attach(new Room);
echo $parser->count(), ' Rooms', PHP_EOL;
$parser->parseRooms(1,2);
Обратите внимание, что Invoker расширяет SplObjectStorage
, поэтому он реализует Countable, Iterator, Traversable, Serializable и ArrayAccess.