interfaces/ISortable.md


Интерфейс ISortable

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

Описание

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

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

sort()

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

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

Параметры:

  • $property (string) — название свойства для сортировки (по умолчанию пустая строка)
  • $descending (bool) — направление сортировки:
    • true — по убыванию
    • false — по возрастанию (по умолчанию)

sortCallback()

public function sortCallback(callable $propertyFunction, bool $descending = false): void

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

Параметры:

  • $propertyFunction (callable) — функция, возвращающая значение свойства для сортировки
  • $descending (bool) — направление сортировки:
    • true — по убыванию
    • false — по возрастанию (по умолчанию)

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

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

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

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

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

Базовый пример

class ProductList implements ISortable
{
    private array $products;

    public function sort(string $property = '', bool $descending = false): 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 $propertyFunction, bool $descending = false): void
    {
        usort($this->products, function ($a, $b) use ($propertyFunction, $descending) {
            $valA = $propertyFunction($a);
            $valB = $propertyFunction($b);
            return $descending ? strcmp($valB, $valA) : strcmp($valA, $valB);
        });
    }
}

Пример с callback

class UserList implements ISortable
{
    private array $users;

    public function sortCallback(callable $propertyFunction, bool $descending = false): void
    {
        usort($this->users, function ($a, $b) use ($propertyFunction, $descending) {
            $valA = $propertyFunction($a);
            $valB = $propertyFunction($b);
            return $descending ? ($valB <=> $valA) : ($valA <=> $valB);
        });
    }
}

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

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

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

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

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