cloudcastle/support

Production-ready PHP 8.1+ package (CloudCastle Support).

Maintainers

Package info

github.com/cloudcastle-apps/support

Homepage

Documentation

pkg:composer/cloudcastle/support

Transparency log

Statistics

Installs: 2

Dependents: 0

Suggesters: 0

Stars: 1

Open Issues: 1

v1.1.0 2026-07-15 23:26 UTC

README

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-зависимость — собственный 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-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 (через собственный 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.
  • Функциональные формы — неймспейсные CloudCastle\Support\blank()/filled(): use function CloudCastle\Support\blank; — та же семантика, без глобального пространства.

Функционально пакет покрывает возможности пяти сравниваемых аналогов вместе взятых: 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) 16503262 ops/s 11662183 ops/s 252414 ops/s cloudcastle/support
camelCase (foo_bar_baz → fooBarBaz) 15972216 ops/s 12203387 ops/s 283447 ops/s 332033 ops/s cloudcastle/support
snake_case (fooBarBaz → foo_bar_baz) 11765229 ops/s 9756464 ops/s 421826 ops/s cloudcastle/support
Плюрализация (category → categories) 17844305 ops/s 1009180 ops/s 12392684 ops/s cloudcastle/support
Точечный доступ (Arr::get "a.b.c") 2755603 ops/s 1320562 ops/s cloudcastle/support
Уплощение в точечные ключи (Arr::dot) 1998811 ops/s 1998001 ops/s cloudcastle/support
Рекурсивное уплощение (Arr::flatten) 1593127 ops/s 1488318 ops/s 1069294 ops/s cloudcastle/support
Выборка столбца (Arr::pluck) 8450295 ops/s 957309 ops/s cloudcastle/support
Фильтр ключей (Arr::only) 5802053 ops/s 5760220 ops/s cloudcastle/support
Проверка пустоты (blank(), смесь значений) 2629493 ops/s 2571378 ops/s cloudcastle/support
Точечное чтение значения (Helpers::dataGet) 2619148 ops/s 1507712 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