Строковые и массивные утилиты + хелперы потока для 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-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(через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 | ✅ | ✅ | ✅ | ❌ | Паритет |
| Функция | 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.
Спасибо всем, кто вносит вклад в проект:
Список ведётся по спецификации all-contributors.
MIT © CloudCastle