interfaces/ISortable.md


Интерфейс ISortable

Пространство имён: goodboyalex\php_components_pack\interfaces
Версия: 2.0
Доступно с: 1.2

Описание

Интерфейс определяет контракт для классов, которые могут быть отсортированы по различным критериям. Наследует интерфейс IHashable для возможности сортировки по хеш-значению.

Методы интерфейса

sort

public function sort (bool $descending = false, string | callable $property = ''): void

Описание: Сортирует элементы класса по указанному свойству.

Параметры:

  • $descending (bool) — направление сортировки:
    • true — по убыванию;
    • false — по возрастанию (по умолчанию);
  • $property (string или callable) — имя свойства объекта или функция, возвращающую значение свойства (fn(mixed $a): mixed). Актуально, если внутри объекта, реализующего этот интерфейс, содержатся не примитивы.

ВНИМАНИЕ: Если внутри объекта, реализующего этот интерфейс, содержатся примитивы, то параметр $property должен игнорироваться.

sortCallback

public function sortCallback (callable $callback): void;

Описание: Сортирует массив объектов, по пользовательской функции.

Параметры:

  • $callback (callable) — функция сравнения, принимающая два параметра: mixed $a и mixed $b и возвращающая bool - true, если $a должно быть перед $b и false - если $b должен быть перед $a.

Рекомендации по реализации

  1. При реализации интерфейса:

    • Обеспечьте корректную обработку всех типов данных
    • Реализуйте механизмы сравнения значений
    • Учитывайте направление сортировки
    • Обработайте случай пустой строки в $property
  2. При использовании:

    • Проверяйте существование свойств перед сортировкой
    • Указывайте корректное направление сортировки
    • Используйте callback для сложных условий сортировки

Пример реализации

class ProductList implements ISortable
{
    private array $products;

    public function sort (bool $descending = false, string | callable $property = ''): void
    {
        if ($property === '') {
            // Сортировка по хешу
            usort($this->products, function ($a, $b) use ($descending) {
                return $descending ? strcmp($b->hash(), $a->hash()) : strcmp($a->hash(), $b->hash());
            });
        } else {
            usort($this->products, function ($a, $b) use ($property, $descending) {
                return $descending ? strcmp($b->$property, $a->$property) : strcmp($a->$property, $b->$property);
            });
        }
    }

    public function sortCallback (callable $callback): void
    {
        usort($this->products, $callback);
    }
}

Особенности реализации

  • Интерфейс наследует IHashable для возможности сортировки по хешу
  • Поддерживает как строгую, так и callback-сортировку
  • Позволяет настраивать направление сортировки
  • Должен корректно обрабатывать пустые строки в $property

Типичные ошибки

  • Отсутствие проверки существования свойств
  • Некорректная обработка callback-функций
  • Отсутствие обработки ошибок сортировки
  • Неправильное направление сортировки

На главную | Содержание