При разработке проектов, часто возникает необходимость, чтобы методы возвращали коллекции каких-то объектов.
Что в идеале мне нужно:
- Базовый класс коллекции, который просто умеет работать с любыми типами данных.
- Иметь возможность типизировать существующий базовый класс (или наследоваться от базового класса коллекции и небольшой доработкой сделать необходимые проверки на тип данных).
- Коллекция должна реализовывать интерфейсы Countable, IteratorAggregate и ArrayAccess.
- Возможность для коллекции добавлять методы map, filter и т.д.
Понимаю, что в php дженериков к сожалению нет, а использовать
Ds\Collection не использую по религиозным соображениям.
Для чего мне это надо:
Например я накидал простой интерфейс:
interface GraphInterface {
public function getPoints() : PointsCollection;
}
- Читается код проще. Сразу понятно, какого типа объекты в этой коллекции.
- Если PointsCollection передается как параметр в какой-то метод, то не нужно каждый раз проверять через instanceof. Также исключаются случаи попадание объектов другого типа в коллекцию.
- Возможность для каждой коллекции добавлять свои специфические методы.
- Также, это более соответствует методологии ООП, чем массивы объектов.
Возможно, вы видите в этом какие-то скрытые проблемы ?
В чем сложность, и причем здесь Doctrine\Common\Collections:
Сложности возникают с архитектурой. Хотел бы понять, каким образом лучше сделать типизацию. Мой вариант: добавить абстрактный метод
getObjectsType(), который нужно будет реализовать в каждой специфической коллекции:
class Point { ... }
class PointCollection extends AbstractCollection {
protected function getObjectsType() : string {
return Point::class;
}
}
Далее при добавлении объектов проверять,
if(!($this->getObjectsType() instanceof $currentObject)) {
throw new InvalidArgumentException();
}
Какие у вас есть варианты, и в чем их преимущество ?
В проекте сам doctrine не использую. Наткнулся на реализацию этой коллекции, и очень понравилась реализация, и возможности.
Вопросы:
Возможно ли использовать
Doctrine\Common\Collections вне доктрины, и можно ли в нем типизировать коллекции и как ?
Если нет, то каким образом можно доработать этот класс
Collections, чтобы удовлетворял моим условиям ? Т.к. какие методы добавить, что переопределить, что наследуем, что выкидываем из класса ?