Skip to content

cloudcastle-apps/support

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

24 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

CloudCastle Support

Version PHP Version License Total Downloads Monthly Downloads Packagist Stars Dependents Suggesters Security Advisories

Quality CodeQL GitHub Stars GitHub Forks GitHub Issues Latest Release Last Commit Contributors

Coverage Mutation MSI OpenSSF Scorecard OpenSSF Best Practices PHPStan Psalm Code Style

Строковые и массивные утилиты + хелперы потока для PHP 8.1+. Корректны для UTF-8, быстры и без утечек памяти. Функциональный суперсет пяти популярных библиотек в одном пакете с единым API.

Установка

composer require cloudcastle/support

Требуется PHP 8.1+. Единственная runtime-зависимость — doctrine/inflector (инфлексия множественного/единственного числа).

Быстрый старт

<?php

use CloudCastle\Support\Str;
use CloudCastle\Support\Arr;
use CloudCastle\Support\Helpers;

// Строки: форматы имён (UTF-8), срезы, маскирование
Str::studly('foo_bar_baz');            // 'FooBarBaz'
Str::camel('foo_bar_baz');             // 'fooBarBaz'
Str::snake('fooBarBaz');               // 'foo_bar_baz'
Str::headline('user_profile');         // 'User Profile'
Str::between('«ключ»', '«', '»');      // 'ключ'  (корректно по символам)
Str::mask('4111111111111111', '*', 0, 12); // '************1111'
Str::plural('category');               // 'categories'
Str::isUuid('e2b0dd0e-9f8a-4c1e-8b2a-1234567890ab'); // true

// Массивы: точечная нотация
$config = ['app' => ['db' => ['host' => 'localhost']]];
Arr::get($config, 'app.db.host');      // 'localhost'
Arr::has($config, 'app.db.port');      // false
Arr::dot($config);                     // ['app.db.host' => 'localhost']
Arr::pluck([['id' => 1], ['id' => 2]], 'id'); // [1, 2]

// Хелперы потока
Helpers::retry(3, static fn (): string => callExternalApi());
Helpers::blank('  ');                  // true
Helpers::tap($user, static fn ($u) => $u->save());

Возможности

  • Форматы имёнstudly/camel/snake/kebab/title/headline с корректной многобайтовой обработкой.
  • Регистр UTF-8lower/upper/ucfirst/lcfirst через mb_* с ASCII fast-path (в разы быстрее на идентификаторах).
  • Поиск и срезыafter/before/between, contains/startsWith/endsWith, limit/wordCount/squish, padLeft/padRight/padBoth.
  • Маскирование и генерацияmask (сокрытие ПД: карт, счетов, телефонов), random (безопасная алфавитно-цифровая строка на random_bytes).
  • Инфлексияplural/singular (через doctrine/inflector).
  • ПредикатыisJson/isUuid/isAscii.
  • Массивыget/set/has/forget (точечная нотация), only/except/pluck, flatten/collapse/dot/undot, first/last/where/prepend.
  • Хелперы потокаtap/with/value/blank/filled/retry/dataGet/dataSet.

Функционально пакет покрывает возможности пяти сравниваемых аналогов вместе взятых: illuminate/support, symfony/string, nette/utils, voku/stringy, doctrine/inflector.

Возможности против аналогов

Сводная таблица (генерируется автоматически из tools/features-data.php; значения выверены по коду и документации аналогов). Легенда: ✅ полностью · ⚠️ частично · 🔌 адаптер · ❌ нет · — неприменимо.

Сгенерировано из tools/features-data.php (факты о поддержке). Легенда: ✅ полностью · ⚠️ частично · 🔌 адаптер · ❌ нет · — неприменимо.

Форматы имён

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
StudlyCase / PascalCase ⚠️ ⚠️ Паритет
camelCase Паритет
snake_case ⚠️ Паритет
kebab-case Паритет
Title / headline ⚠️ ⚠️ Паритет

Регистр (UTF-8)

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
lower / upper (mb) Паритет
ucfirst / lcfirst (mb) Паритет
ASCII fast-path (перф) Support

Поиск, срезы, дополнение

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
after / before / between ⚠️ Паритет
contains / startsWith / endsWith Паритет
limit / wordCount / squish ⚠️ ⚠️ ⚠️ Support, illuminate
padLeft / padRight / padBoth (mb) ⚠️ Паритет

Маскирование и генерация

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
mask (сокрытие ПД, mb) Support, illuminate
random (алфавитно-цифровой) Паритет

Инфлексия (число)

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
plural / singular Паритет

Предикаты

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
isJson Паритет
isUuid Support, illuminate
isAscii Паритет

Массивы (точечная нотация)

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
get / set / has / forget («a.b.c») ⚠️ Support, illuminate
only / except / pluck ⚠️ Support, illuminate
flatten / collapse / dot / undot ⚠️ Support, illuminate

Хелперы потока

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
tap / with / value Support, illuminate
blank / filled Support, illuminate
retry (повтор с предикатом) Support, illuminate

Зависимости и безопасность

Функция Support illuminate symfony nette voku doctrine 🏆 Победитель
Runtime-зависимости (меньше — лучше) ⚠️ ⚠️ symfony, nette, doctrine
Единый API: строки + массивы + хелперы ⚠️ Support, illuminate
Без роста памяти (bounded, нет кэш-утечки) Support (vs illuminate)

Производительность

Изолированные замеры без Xdebug (composer compare), эквивалентные операции. Метрика — ops/sec (больше — лучше); «—» — операция не поддерживается.

Сгенерировано из composer compare (PHP 8.1.34). Правки в блоке будут перезаписаны.

Сценарий cloudcastle/support illuminate/support voku/stringy symfony/string doctrine/inflector nette/utils 🏆 Победитель
StudlyCase (foo_bar_baz → FooBarBaz) 14993044 ops/s 11600896 ops/s 252956 ops/s cloudcastle/support
camelCase (foo_bar_baz → fooBarBaz) 16474093 ops/s 13070439 ops/s 282354 ops/s 333785 ops/s cloudcastle/support
snake_case (fooBarBaz → foo_bar_baz) 11758632 ops/s 9624378 ops/s 430024 ops/s cloudcastle/support
Плюрализация (category → categories) 14847094 ops/s 1006287 ops/s 12246143 ops/s cloudcastle/support
Точечный доступ (Arr::get "a.b.c") 2783953 ops/s 1354903 ops/s cloudcastle/support
Уплощение в точечные ключи (Arr::dot) 2066770 ops/s 2015717 ops/s cloudcastle/support
Рекурсивное уплощение (Arr::flatten) 1639617 ops/s 1462092 ops/s 1059823 ops/s cloudcastle/support
Выборка столбца (Arr::pluck) 8699168 ops/s 924049 ops/s cloudcastle/support
Фильтр ключей (Arr::only) 5694527 ops/s 5632206 ops/s cloudcastle/support
Проверка пустоты (Helpers::blank) 13976355 ops/s 15923705 ops/s illuminate/support
Точечное чтение значения (Helpers::dataGet) 2655295 ops/s 1466155 ops/s cloudcastle/support

Полное сравнение по каждой возможности — в Wiki: Сравнение.

Заключение: когда что выбирать

Сильные стороны cloudcastle/support — единый API строк, массивов и хелперов потока, корректный для UTF-8 на всех операциях, с прицелом на финтех-безопасность: mask для сокрытия ПД, random на random_bytes, срезы по символам (не по байтам). Все горячие пути работают с ограниченной памятью — в отличие от illuminate/support, где статический $studlyCache растёт без ограничений (на разнообразном вводе это утечка памяти).

Производительность: supportпобедитель почти во всех сценариях таблицы выше (см. графу «🏆 Победитель»). Case-конверсия (studly/camel/snake/kebab) — в ~1.3–1.7× быстрее illuminate/support благодаря ограниченному (bounded) кэшу; плюрализация — на порядок быстрее illuminate и обгоняет doctrine/inflector напрямую; массивные операции (Arr::get, dot, flatten, pluck, only) и хелперы (dataGet) — быстрее illuminate (pluck — в ~9×). Ключевое отличие: кэш ограничен по размеру и сбрасывается, тогда как неограниченный $studlyCache в illuminate на разнообразном вводе течёт памятью. voku/stringy и symfony/string support обгоняет на всех сценариях. Прежнее исключение — nette/utils на точечном доступе — снято: его API требует массив ключей (['a','b','c']), тогда как support принимает строку 'a.b.c' — эргономичнее ценой разбора.

Слабые стороны — пакет молодой; для сложной лингвистики (склонение не-английских слов) инфлексия ограничена возможностями doctrine/inflector; коллекции вынесены в отдельный пакет cloudcastle/collection (этот пакет — статические утилиты, не цепочечные объекты).

Честные рекомендации:

  • Единый набор утилит без тяжёлых зависимостей фреймворкаcloudcastle/support.
  • Экосистема Laravel целикомilluminate/support (тянет пол-фреймворка, но нативен для Laravel).
  • Объектные цепочки и трансформация Unicodesymfony/string или voku/stringy.
  • Только инфлексия английскогоdoctrine/inflector напрямую.
  • Разнородные утилиты Nette-проектаnette/utils.

Документация

Качество

Пакет придерживается production-стандартов: строгая типизация, полный статический анализ (PHPStan max, Psalm level 1, PHPMD, Deptrac, Rector), покрытие тестами 100 % на каждый файл и мутационное тестирование (Infection MSI 100 %). Матрица CI — PHP 8.1–8.5.

composer ci        # полный пайплайн качества
composer check     # быстрые проверки перед коммитом
composer test      # тесты (unit + integration + security + load + performance)
composer compare   # сравнение производительности с аналогами

Контакты

Поддержать проект

Реквизиты для поддержки автора — в DONATE.md.

Contributors

Спасибо всем, кто вносит вклад в проект:

Список ведётся по спецификации all-contributors.

Лицензия

MIT © CloudCastle

About

Строковые и массивные утилиты + хелперы потока для PHP 8.1+ (UTF-8, быстрые, без утечек памяти). Суперсет 5 популярных библиотек с единым API.

Resources

License

Code of conduct

Contributing

Security policy

Stars

1 star

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages