cloudcastle / inflector
Production-ready PHP 8.1+ package (CloudCastle Inflector).
Requires
- php: >=8.1
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
- infection/infection: ^0.29 || ^0.33
- 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
- wapmorgan/morphos: ^3.2
- webmozart/assert: ^1.11
This package is auto-updated.
Last update: 2026-07-15 23:09:17 UTC
README
Мультиязычный инфлектор для PHP 8.1+ без зависимостей: пять языков (русский, английский, немецкий, французский, испанский), склонение по падежам и числам, спряжение глаголов по временам, счётная форма, транслитерация кириллица ↔ латиница и автоматическое определение языка.
Установка
composer require cloudcastle/inflector
Требуется PHP 8.1+. Runtime-зависимостей нет (zero-dependency).
Быстрый старт
<?php use CloudCastle\Inflector\Inflector; use CloudCastle\Inflector\Language; use CloudCastle\Inflector\GrammaticalCase; use CloudCastle\Inflector\GrammaticalNumber; use CloudCastle\Inflector\Tense; use CloudCastle\Inflector\Person; // Авто-определение языка по каждому слову (язык не задан) $inflector = new Inflector(); $inflector->pluralize('стол'); // 'столы' $inflector->pluralize('category'); // 'categories' $inflector->singularize('châteaux'); // 'château' // Фиксированный язык (быстрее: без детекта) $ru = new Inflector(Language::Russian); // Склонение по падежам и числам $ru->decline('стол', GrammaticalCase::Genitive); // 'стола' $ru->decline('стол', GrammaticalCase::Dative, GrammaticalNumber::Plural); // 'столам' // Счётная форма: 1 товар / 2 товара / 5 товаров $ru->pluralizeByCount('товар', 1); // 'товар' $ru->pluralizeByCount('товар', 2); // 'товара' $ru->pluralizeByCount('товар', 5); // 'товаров' // Спряжение по временам, лицам и числам $ru->conjugate('работать', Tense::Past); // 'работал' $ru->conjugate('работать', Tense::Present, Person::First); // 'работаю' $ru->conjugate('работать', Tense::Future); // 'будет работать' // Транслитерация и слаги $inflector->toLatin('щука'); // 'shchuka' $inflector->toCyrillic('privet'); // 'привет' $inflector->transliterate('привет'); // 'privet' (направление — автоматически) $inflector->slugify('Привет мир'); // 'privet-mir' // Определение языка $inflector->detectLanguage('mañana'); // Language::Spanish // Форматы имён для ORM/API $inflector->tableize('UserAccount'); // 'user_accounts' $inflector->classify('user_accounts'); // 'UserAccount' $inflector->camelize('foo_bar'); // 'fooBar'
Возможности
- Пять языков — русский, английский, немецкий, французский, испанский; единый
API и контракт правил (
LanguageRulesInterface) для добавления новых языков. - Число существительных —
pluralize/singularizeс нерегулярными парами и неисчисляемыми словами каждого языка; счётная формаpluralizeByCount(1 товар / 2 товара / 5 товаров). - Склонение — 6 русских падежей в обоих числах (регулярные парадигмы 1/2/3 склонения и среднего рода), немецкие Genitiv и Dativ Plural.
- Спряжение — прошедшее, настоящее и будущее время по лицам и числам: регулярные парадигмы всех пяти языков + частотные нерегулярные английские глаголы.
- Транслитерация — кириллица → латиница и латиница → кириллица (практическая
схема, многобуквенные сочетания
shch/zh/yo), автонаправление по алфавиту. - Определение языка — по алфавиту, диакритике (ß/ü, ñ, ç/œ) и частотным служебным словам; опция конструктора: авто-режим или фиксированный язык.
- Форматы имён —
camelize/pascalize/underscore/tableize/classify/dasherize/titleize/humanize, слаги с транслитерацией, порядковые числительные по правилам языка (1-й,1st,1.,1er,1.º). - Расширяемость — пользовательские нерегулярные пары, неисчисляемые слова и regex-правила per-язык.
- Производительность — ограниченные (bounded) кэши всех горячих путей: O(1) на повторяющемся вводе без неограниченного роста памяти.
Функционально пакет покрывает возможности сравниваемых аналогов вместе взятых:
doctrine/inflector, symfony/string (инфлекторы), wapmorgan/morphos, ext-intl.
Возможности против аналогов
Сводная таблица (генерируется автоматически из tools/features-data.php; значения выверены
по коду и документации аналогов). Легенда: ✅ полностью · ⚠️ частично · 🔌 адаптер · ❌ нет · — неприменимо.
Сгенерировано из tools/features-data.php (факты о поддержке). Легенда: ✅ полностью · ⚠️ частично · 🔌 адаптер · ❌ нет · — неприменимо.
Языки
| Функция | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| Английский | ✅ | ✅ | ✅ | ⚠️ | — | Паритет |
| Русский | ✅ | ❌ | ❌ | ✅ | — | Inflector, morphos |
| Немецкий | ✅ | ❌ | ❌ | ❌ | — | Inflector |
| Французский | ✅ | ❌ | ✅ | ❌ | — | Inflector, symfony |
| Испанский | ✅ | ❌ | ❌ | ❌ | — | Inflector |
| Авто-определение языка | ✅ | ❌ | ❌ | ❌ | ❌ | Inflector |
Число существительных
| Функция | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| pluralize / singularize | ✅ | ✅ | ✅ | ✅ | ❌ | Паритет |
| Счётная форма (1 товар / 2 товара / 5 товаров) | ✅ | ❌ | ❌ | ✅ | ❌ | Inflector, morphos |
| Нерегулярные и неисчисляемые слова | ✅ | ✅ | ⚠️ | ✅ | ❌ | Паритет |
Склонение и спряжение
| Функция | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| 6 русских падежей (ед. и мн. число) | ✅ | ❌ | ❌ | ✅ | ❌ | Inflector, morphos |
| Немецкие падежи (Genitiv, Dativ Pl.) | ✅ | ❌ | ❌ | ❌ | ❌ | Inflector |
| Спряжение глаголов (3 времени × лица × числа) | ✅ | ❌ | ❌ | ⚠️ | ❌ | Inflector |
| Спряжение на 5 языках | ✅ | ❌ | ❌ | ❌ | ❌ | Inflector |
Транслитерация
| Функция | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| Кириллица → латиница | ✅ | ❌ | ❌ | ⚠️ | ✅ | Паритет |
| Латиница → кириллица | ✅ | ❌ | ❌ | ❌ | ✅ | Inflector, intl |
| Автонаправление по алфавиту | ✅ | ❌ | ❌ | ❌ | ❌ | Inflector |
| Без расширений PHP (zero-dependency) | ✅ | ✅ | ⚠️ | ✅ | ❌ | Inflector, doctrine, morphos |
Форматы имён (ORM/API)
| Функция | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| camelize / pascalize / underscore | ✅ | ✅ | 🔌 | ❌ | ❌ | Inflector, doctrine |
| tableize / classify | ✅ | ✅ | ❌ | ❌ | ❌ | Inflector, doctrine |
| Слаги с транслитерацией кириллицы | ✅ | ❌ | ⚠️ | ❌ | 🔌 | Inflector |
| Порядковые числительные по языкам | ✅ | ❌ | ❌ | ⚠️ | 🔌 | Inflector |
Расширяемость
| Функция | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| Пользовательские нерегулярные пары | ✅ | ⚠️ | ❌ | ❌ | ❌ | Inflector |
| Пользовательские regex-правила | ✅ | ⚠️ | ❌ | ❌ | ❌ | Inflector |
| Единый интерфейс правил для новых языков | ✅ | ❌ | ⚠️ | ⚠️ | ❌ | Inflector |
Производительность и нагрузка
| Функция | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| Ограниченный кэш (нет утечки на уникальном вводе) | ✅ | ❌ | — | — | — | Inflector |
| O(1) на повторяющемся вводе | ✅ | ✅ | ❌ | ❌ | ❌ | Inflector, doctrine |
| Стабильная память при 100k+ уникальных слов | ✅ | ❌ | ✅ | ✅ | ✅ | Inflector, symfony, morphos |
Безопасность и качество
| Функция | Inflector | doctrine | symfony | morphos | intl | 🏆 Победитель |
|---|---|---|---|---|---|---|
| Fail-safe: неизвестный ввод не бросает исключений | ✅ | ✅ | ✅ | ⚠️ | ⚠️ | Паритет |
| Ввод — данные, не код (без eval/интерполяции) | ✅ | ✅ | ✅ | ✅ | ✅ | Паритет |
| Мутационное тестирование MSI 100% | ✅ | ❌ | ❌ | ❌ | — | Inflector |
| Fuzzing-инфраструктура (ClusterFuzzLite) | ✅ | ❌ | ❌ | ❌ | — | Inflector |
Производительность
Изолированные замеры без Xdebug (composer compare), эквивалентные операции. Метрика —
ops/sec (больше — лучше); «—» — операция не поддерживается.
Сгенерировано из composer compare (PHP 8.1.34). Правки в блоке будут перезаписаны.
| Сценарий | cloudcastle/inflector | doctrine/inflector | symfony/string | wapmorgan/morphos | ext-intl (ICU) |
|---|---|---|---|---|---|
| EN плюрализация (category → categories) | 14958288 ops/s | 12127523 ops/s | 313425 ops/s | — | — |
| RU плюрализация (стол → столы) | 15445789 ops/s | — | — | 90813 ops/s | — |
| RU родительный падеж (стол → стола) | 1099396 ops/s | — | — | 92191 ops/s | — |
| RU счётная форма (5 → товаров) | 875702 ops/s | — | — | 83637 ops/s | — |
| FR плюрализация (journal → journaux) | 14868146 ops/s | — | 839062 ops/s | — | — |
| Имя таблицы (FooBar → foo_bars) | 14926349 ops/s | 2715111 ops/s | — | — | — |
| Имя класса (foo_bars → FooBar) | 15152832 ops/s | 5347831 ops/s | — | — | — |
| Транслитерация RU → латиница | 2318063 ops/s | — | — | — | 8571 ops/s |
| Определение языка (кириллица) | 5467384 ops/s | — | — | — | — |
Полное сравнение по каждой возможности — в Wiki: Сравнение.
Заключение: когда что выбирать
Сильные стороны cloudcastle/inflector — единственный PHP-пакет, объединяющий инфлексию пяти языков, склонение по падежам, спряжение по временам, счётную форму, транслитерацию и автоопределение языка — при нуле runtime-зависимостей. Все горячие пути работают с ограниченной памятью (bounded-кэши со сбросом), любой «грязный» ввод обрабатывается fail-safe (данные, не код), мутационное покрытие — Infection MSI 100 %.
Производительность: победитель во всех девяти сценариях сравнения — от
английской плюрализации (быстрее doctrine/inflector в ~1.2×) до русской морфологии
(быстрее wapmorgan/morphos в ~10–170×) и транслитерации (быстрее ext-intl ICU
в ~270×). Замеры изолированные, без Xdebug (composer compare).
Слабые стороны — морфология построена на регулярных парадигмах без полного словаря: одушевлённость русских существительных не определяется (винительный падеж неодушевлённый), слова на «-ь» склоняются по женскому 3-му склонению, нерегулярные глаголы (кроме частотных английских) спрягаются только по регулярным схемам. Для задач, где нужна словарная точность каждой формы, используйте морфологический анализатор с полным словарём.
Честные рекомендации:
- Мультиязычное приложение (интерфейсы, счётчики, URL, ORM) —
cloudcastle/inflector. - Только английская инфлексия в Doctrine-проекте —
doctrine/inflectorуже в зависимостях ORM. - Только английское/французское число в Symfony —
symfony/stringуже в фреймворке. - Русская морфология со словарной точностью (имена, отчества, географические названия) —
wapmorgan/morphos. - Транслитерация экзотических письменностей (не кириллица) —
ext-intl(ICU).
Документация
- 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