Я пытаюсь спроектировать объект PHP (назовите его Incident_Collection
), который будет содержать коллекцию других объектов, каждый из которых реализует интерфейс Incident
.
<?php
class Foo implements Incident {
protected $incident_date; //DateTime object
protected $prop1;
protected $prop2;
//etc
public function when(){ //required by Incident interface
return $this->incident_date;
}
}
?>
Сначала я решил, что просто заставлю свой Incident_Collection
реализовать IteratorAggregate
и сохранить объекты Incident в свойстве массива коллекции:
<?php
class Incident_Collection implements IteratorAggregate {
protected $collection=array();
public function getIterator(){
return new ArrayIterator($this->collection);
}
public function sort(){
//sort by $incident->when() values in $this->collection
}
/*also __get($var), __set($var,$value), add(Incident $object), remove(Incident $object) and other functions*/
}
?>
Но потому чтоIncident
объекты имеют естественный порядок, я подумал, что, возможно, расширение одной из структур данных SPL может быть более подходящим / эффективным. Но какой именно? Мне не очень понятно, когда следует использовать конкретную структуру данных.
Еще одна проблема заключается в том, что могут быть ограничения на Incident_Collection
.Например, если был объект Person
с Incident_Collection
, возможно, могут применяться следующие ограничения:
- только 1
Birth
инцидент - , если
Birth
существует, это должен быть самый ранний инцидент в коллекции - только 1
Death
инцидент - если
Death
существует, это должен быть последний инцидент в коллекции HS_Graduation
должен идти после HS_Begin
Было бы лучше иметь универсальный Incident_Collection
, который принимает набор ограничений от своего владельца (например, Person
), или подкласс Person_Incident_Collection