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— по возрастанию (по умолчанию)
Рекомендации по реализации
-
При реализации интерфейса:
- Обеспечьте корректную обработку всех типов данных
- Реализуйте механизмы сравнения значений
- Учитывайте направление сортировки
- Обработайте случай пустой строки в
$property
-
При использовании:
- Проверяйте существование свойств перед сортировкой
- Указывайте корректное направление сортировки
- Используйте 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-функций
- Отсутствие обработки ошибок сортировки
- Неправильное направление сортировки