@topuserman

Doctrine\Common\Collections, как переделать?

При разработке проектов, часто возникает необходимость, чтобы методы возвращали коллекции каких-то объектов.

Что в идеале мне нужно:


  • Базовый класс коллекции, который просто умеет работать с любыми типами данных.
  • Иметь возможность типизировать существующий базовый класс (или наследоваться от базового класса коллекции и небольшой доработкой сделать необходимые проверки на тип данных).
  • Коллекция должна реализовывать интерфейсы Countable, IteratorAggregate и ArrayAccess.
  • Возможность для коллекции добавлять методы map, filter и т.д.


Понимаю, что в php дженериков к сожалению нет, а использовать Ds\Collection не использую по религиозным соображениям.

Для чего мне это надо:

Например я накидал простой интерфейс:

interface GraphInterface {
     public function getPoints() : PointsCollection;
}


  1. Читается код проще. Сразу понятно, какого типа объекты в этой коллекции.
  2. Если PointsCollection передается как параметр в какой-то метод, то не нужно каждый раз проверять через instanceof. Также исключаются случаи попадание объектов другого типа в коллекцию.
  3. Возможность для каждой коллекции добавлять свои специфические методы.
  4. Также, это более соответствует методологии ООП, чем массивы объектов.


Возможно, вы видите в этом какие-то скрытые проблемы ?

В чем сложность, и причем здесь 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, чтобы удовлетворял моим условиям ? Т.к. какие методы добавить, что переопределить, что наследуем, что выкидываем из класса ?
  • Вопрос задан
  • 218 просмотров
Пригласить эксперта
Ответы на вопрос 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
Юзайте интерфейс Collection + docblock.

/**
 * @return Point[]|Collection
 */
public function getPoints(): Collection;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы