cloudcastle / support
Production-ready PHP 8.1+ package (CloudCastle Support).
Requires
- php: >=8.1
- cloudcastle/inflector: ^1.0
Requires (Dev)
- deptrac/deptrac: ^3.0 || ^4.0
- doctrine/inflector: ^2
- ergebnis/composer-normalize: ^2.45
- friendsofphp/php-cs-fixer: ^3.75
- icanhazstring/composer-unused: ^0.9
- illuminate/support: ^10
- infection/infection: ^0.29 || ^0.33
- nette/utils: ^4
- php-parallel-lint/php-parallel-lint: ^1.4
- phpdocumentor/shim: ^3.7
- phpmd/phpmd: ^2.15
- phpstan/extension-installer: ^1.4
- phpstan/phpstan: ^1.12 || ^2.1
- phpstan/phpstan-deprecation-rules: ^1.2 || ^2.0
- phpstan/phpstan-phpunit: ^1.4 || ^2.0
- phpstan/phpstan-strict-rules: ^1.6 || ^2.0
- phpunit/phpunit: ^10.5 || ^11.5
- psalm/plugin-phpunit: ^0.19 || ^0.20
- rector/rector: ^1.2 || ^2.0
- roave/security-advisories: dev-latest
- squizlabs/php_codesniffer: ^3.12 || ^4.0
- symfony/string: ^6.4
- vimeo/psalm: ^6.0
- voku/stringy: ^6 || ^7
- webmozart/assert: ^1.11
This package is auto-updated.
Last update: 2026-07-15 23:28:20 UTC
README
Строковые и массивные утилиты + хелперы потока для PHP 8.1+. Корректны для UTF-8, быстры и без утечек памяти. Функциональный суперсет пяти популярных библиотек в одном пакете с единым API.
Установка
composer require cloudcastle/support
Требуется PHP 8.1+. Единственная runtime-зависимость — собственный
cloudcastle/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-8 —
lower/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(через собственныйcloudcastle/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). - Объектные цепочки и трансформация Unicode —
symfony/stringилиvoku/stringy. - Только инфлексия английского —
doctrine/inflectorнапрямую. - Разнородные утилиты Nette-проекта —
nette/utils.
Документация
- Wiki — руководство пользователя
- Быстрый старт
- Возможности (Features)
- Сравнение с аналогами
- Архитектура
- API-документация
Качество
Пакет придерживается 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 # сравнение производительности с аналогами
Контакты
- Email — alex-4-17@yandex.ru
- VK — https://vk.com/leha_zorin
- Telegram — @CloudCastle85
- Телефон — +79872763991
- Сетка — https://set.ki/LdYRz76
Поддержать проект
Реквизиты для поддержки автора — в DONATE.md.
Contributors
Спасибо всем, кто вносит вклад в проект:
Список ведётся по спецификации all-contributors.
Лицензия
MIT © CloudCastle