PHP: полный мануал с примерами, функциями и ООП
Практический мануал PHP: от переменных и читаемого кода до безопасных форм, интеграций, базы данных и ООП на примере магазина. Учебный маршрут, поиск функций, подробные примеры, разбор ошибок и исходники для скачивания.

Дерево руководства
Глава 95 · От первого форматирования к полному API
Intl: полный справочник языков, Unicode, чисел, дат и календарей
Все функции и классы интернационализации: locale, collation, нормализация, графемы, форматирование, календари, IDNA, кодировки и Unicode-свойства с постепенными примерами.
Первая задача: показать число по правилам читателя
В базе магазина хранится число 1234.5. Один посетитель ожидает 1,234.5, другой — 1.234,5. Это одно значение, но разные правила записи. Intl предоставляет готовые правила языков и регионов: числа, даты, алфавитный порядок, формы слов и обработку Unicode. Вам не нужно собирать сотни условий для каждого языка.
- Внутри программы: число 1234.5
- Настройка читателя: de_DE
- NumberFormatter применяет правила ICU
- На экране строка 1.234,5; число в базе не изменилось
Локаль (locale) — идентификатор набора языковых правил. В de_DE de означает немецкий, DE — регион Германия. Локаль не является переводом вашего интерфейса, валютой счёта или часовым поясом. Расширение Intl использует ICU — библиотеку правил Unicode и данных локалей; PHP обращается к ней через функции и объекты.
| Часть первого примера | Объяснение с нуля |
|---|---|
| $formatter = ... | Создаём переменную для подготовленного инструмента форматирования. |
| new NumberFormatter(...) | Создаём объект класса: он запоминает locale и стиль. Конструктор получает два аргумента в скобках. |
| "de_DE" | Строка с выбранными правилами языка и региона. |
| NumberFormatter::DECIMAL | Именованная константа стиля обычного десятичного числа; :: обращается к классу. |
| $formatter->format(1234.5) | Стрелка выбирает метод объекта; скобки вызывают его и передают число. Результат — строка. |
| echo ..., "\n"; | Печатаем результат и перевод строки. ; завершает инструкцию. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
echo $formatter->format(1234.5), "
";
Ожидаемый результат
1.234,5
Число передано как число с точкой в PHP-коде, а не как уже локализованная строка.
<?php
declare(strict_types=1);
$english = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$german = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
echo $english->format(1234.5), "
";
echo $german->format(1234.5), "
";
Ожидаемый результат
1,234.5
1.234,5
Каждый объект хранит свои настройки; изменение одного не требует менять глобальную locale всего приложения.
Если пока незнакомы объект, метод или аргумент, сначала откройте механизм вызова функции и введение в объекты. Дальше каждая карточка начинает с минимального вызова, затем показывает применение и ограничения. Справочник охватывает весь официальный раздел Intl и текущие методы, для которых на PHP.net пока есть только краткая сигнатура.
Установка Intl и проверка того процесса, который обслуживает сайт
Intl — расширение PHP, а ICU — его внешняя библиотека. Исторический минимум ICU был 4.0; с PHP 7.4 требуется ICU 50.1 или новее. Отдельные возможности требуют более новой ICU: номер PHP сам по себе не доказывает наличие всех алгоритмов и данных.
| Окружение | Как подготовить |
|---|---|
| Готовый Linux/контейнер | Установите пакет Intl для используемой версии PHP либо включите его в сборку образа. Название пакета зависит от дистрибутива. Не смешивайте версии CLI и PHP-FPM. |
| Windows | Подключите совместимый php_intl.dll через extension=intl в реально используемом php.ini; необходимы совместимые ICU DLL. Совпадают версия PHP, архитектура и TS/NTS. Перезапустите процесс, обслуживающий PHP. |
| Сборка из исходников | Configure --enable-intl включает расширение. Нужны библиотеки/заголовки ICU. При нестандартном каталоге загрузчик ОС должен находить библиотеки; официальный пример Linux использует LD_LIBRARY_PATH=/opt/icu/lib. |
| CLI и сайт | php --ini показывает конфигурацию консольного PHP. Веб-процесс может читать другую. Проверяйте extension_loaded("intl"), PHP_SAPI и php_ini_loaded_file в нужном процессе; диагностические пути не оставляйте на публичной странице. |
| Версии данных | INTL_ICU_VERSION и INTL_ICU_DATA_VERSION помогают объяснить отличия форматирования/сегментации. Они не равны PHP_VERSION. |
<?php
declare(strict_types=1);
var_dump(extension_loaded("intl"));
var_dump(class_exists(NumberFormatter::class));
echo INTL_ICU_VERSION, " / ", INTL_ICU_DATA_VERSION, "
";
Ожидаемый результат
bool(true)
bool(true)
77.1 / 77.1
Это результат учебного стенда PHP 8.5.11. На другом сервере номер ICU может отличаться; не заменяйте его в проверке на выдуманное совпадение.
Три настройки php.ini и границы глобального состояния
| Директива | Смысл и применение |
|---|---|
| intl.default_locale | string, INI_ALL. Пустое исходное значение использует default ICU из окружения. После явной установки нельзя просто вернуть тот же исходный неявный режим пустой строкой. Для воспроизводимости передавайте locale объектам явно; ICU locales отличаются от системного setlocale. |
| intl.error_level | int, default 0, INI_ALL. Уровень PHP-сообщения при ошибке ICU, например E_WARNING; 0 отключает такие сообщения. Возвращаемые false/null и статусы ошибок от этого не становятся успехом. |
| intl.use_exceptions | bool/int, default 0, INI_ALL, с PECL 3.0.0a1. Многие ошибки становятся IntlException, иногда одновременно с сообщением уровня error_level. Контракт конкретного метода может предусматривать исключение и без этой опции. |
| Долгоживущий процесс | Изменение default locale/ini внутри задачи может влиять на последующие операции процесса. Явные настройки объектов и восстановление временных режимов уменьшают скрытую зависимость. |
<?php
declare(strict_types=1);
$previous = Locale::getDefault();
try {
Locale::setDefault("de_DE");
$formatter = new NumberFormatter(Locale::getDefault(), NumberFormatter::DECIMAL);
echo $formatter->format(1234.5), "
";
} finally {
Locale::setDefault($previous);
}
Ожидаемый результат
1.234,5
Здесь возвращается предыдущее эффективное имя locale. Это не обещание восстановить изначально пустую ini-настройку ICU.
Отключить сообщения не значит обработать отказ. Пример $name = Normalizer::normalize($raw) нужно продолжать строгой проверкой false или подходящим catch. Иначе невалидное имя может попасть в базу как пустое.
Функция и метод: два способа вызвать одну операцию
Многие семейства предоставляют два интерфейса. Объектный стиль: $collator->compare($left, $right). Процедурный: collator_compare($collator, $left, $right). Во втором объект явно передаётся первым аргументом; правила сортировки остаются теми же. У некоторых новых семейств процедурной пары нет.
<?php
declare(strict_types=1);
$collator = collator_create("en_US");
$result = collator_compare($collator, "apple", "banana");
echo $result < 0 ? "apple first
" : "other order
";
Ожидаемый результат
apple first
compare возвращает знак отношения, а не обязательное число -1: нужно проверять меньше/равно/больше нуля.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$result = $collator->compare("apple", "banana");
echo $result < 0 ? "apple first
" : "other order
";
Ожидаемый результат
apple first
Объект объединяет настройки и операции. Он полезен, когда один и тот же профиль применяется в нескольких местах каталога.
Большинство текстовых API Intl принимает/возвращает UTF-8. Но UConverter специально работает с произвольными кодировками, getSortKey и getBinaryRules возвращают бинарные строки, а индексы некоторых API измеряются в UTF-16. Читайте договор конкретного метода: общая фраза «всё Unicode» не определяет единицы аргумента.
Выбрать семейство по реальной задаче
| Что требуется | Куда перейти |
|---|---|
| Каталог нужно сортировать по языку, а A2 должно идти перед A10 | Collator — языковые правила и numeric collation. |
| Показать цену/проценты или разобрать локализованное число | NumberFormatter — формат и parse; валюта задаётся отдельно. |
| Выбрать доступный перевод интерфейса | Locale — теги, lookup, Accept-Language; ResourceBundle — данные ресурсов. |
| Написать «1 товар / 2 товара / 5 товаров» | MessageFormatter — plural/select без ручных веток для всех языков. |
| Показать список товаров естественной фразой | IntlListFormatter — соединение частей с and/or/unit по локали. |
| Показать дату по языку и часовому поясу | IntlDateFormatter, IntlDatePatternGenerator, IntlTimeZone. |
| Считать календарные дни, границы месяца и переходы DST | IntlCalendar, IntlGregorianCalendar; не путать секунды PHP с миллисекундами ICU. |
| Сравнить два визуально одинаковых написания | Normalizer — NFC/NFD/NFKC/NFKD с явным выбором смысла. |
| Сделать преобразование письменности | Transliterator — правила и готовые преобразования; возможна потеря информации. |
| Прочитать старую кодировку поставщика | UConverter — входная/выходная кодировка и обработка потерь. |
| Не порвать эмодзи, выделить слово/предложение | Графемные функции и IntlBreakIterator. |
| Узнать свойства отдельной кодовой точки | IntlChar — категория, письменность, регистр, числовое значение. |
| Проверить домен или похожие имена | IDNA и Spoofchecker; это разные проверки. |
Collator: назначение, константы и операции
Языковая сортировка для каталога, адресной книги и поиска по названиям.
| Константа | Смысл и область применения |
|---|---|
Collator::DEFAULT_VALUE = -1 | Вернуть значение атрибута по умолчанию. |
Collator::PRIMARY = 0 | Базовые буквы. |
Collator::SECONDARY = 1 | Буквы и вторичные акценты. |
Collator::TERTIARY = 2 | Обычно также регистр и варианты. |
Collator::DEFAULT_STRENGTH = 2 | Начальная сила по ICU/locale. |
Collator::QUATERNARY = 3 | Четвёртый уровень дополнительных различий. |
Collator::IDENTICAL = 15 | Полное финальное различение. |
Collator::OFF = 16 | Выключить совместимый атрибут. |
Collator::ON = 17 | Включить совместимый атрибут. |
Collator::SHIFTED = 20 | Специальное обращение с variable-символами/пунктуацией. |
Collator::NON_IGNORABLE = 21 | Учитывать variable-символы обычным образом. |
Collator::LOWER_FIRST = 24 | Нижний регистр раньше верхнего. |
Collator::UPPER_FIRST = 25 | Верхний регистр раньше нижнего. |
Collator::FRENCH_COLLATION = 0 | ON сравнивает вторичные акценты в обратном направлении для соответствующих правил; OFF обычный порядок. |
Collator::ALTERNATE_HANDLING = 1 | NON_IGNORABLE учитывает пунктуацию, SHIFTED переносит часть различий на более слабый уровень. |
Collator::CASE_FIRST = 2 | UPPER_FIRST/LOWER_FIRST/OFF задают приоритет регистра, когда он учитывается. |
Collator::CASE_LEVEL = 3 | ON добавляет отдельный уровень регистра, например вместе с PRIMARY. |
Collator::NORMALIZATION_MODE = 4 | ON включает проверку/обработку канонической эквивалентности. |
Collator::STRENGTH = 5 | ID атрибута силы; значения PRIMARY..IDENTICAL. |
Collator::HIRAGANA_QUATERNARY_MODE = 6 | Исторический атрибут различения Hiragana/Katakana на четвёртом уровне; deprecated в ICU, современные правила японской сортировки задаются данными локали, не этим переключателем. |
Collator::NUMERIC_COLLATION = 7 | ON сравнивает последовательности цифр как числа. |
Collator::SORT_REGULAR = 0 | Обычные правила типов значений. |
Collator::SORT_STRING = 1 | Значения рассматриваются как строки. |
Collator::SORT_NUMERIC = 2 | Значения рассматриваются как числа. |
Collator связывает локаль и настройки с операциями. Процедурные collator_* функции используют тот же объект; это два интерфейса одного механизма. Ни один режим не делает строки безопасными для HTML и не решает права доступа. Версию ICU учитывайте при сохранении sort keys и воспроизводимых тестах.
Собственные операции: Collator::__construct, Collator::create, Collator::compare, Collator::sort, Collator::sortWithSortKeys, Collator::asort, Collator::getAttribute, Collator::setAttribute, Collator::getStrength, Collator::setStrength, Collator::getLocale, Collator::getErrorCode, Collator::getErrorMessage, Collator::getSortKey
NumberFormatter: назначение, константы и операции
Число остаётся числом в программе; локализованная строка появляется на границе интерфейса.
| Константа | Смысл и область применения |
|---|---|
NumberFormatter::PATTERN_DECIMAL = 0 | DecimalFormat по собственному шаблону. |
NumberFormatter::DECIMAL = 1 | Обычное десятичное число. |
NumberFormatter::DECIMAL_COMPACT_SHORT = 14 | Краткое компактное число, например 1K; зависит от locale и ICU. |
NumberFormatter::DECIMAL_COMPACT_LONG = 15 | Полная компактная запись, например 1 thousand. |
NumberFormatter::CURRENCY = 2 | Денежный формат. |
NumberFormatter::PERCENT = 3 | Процент: входная доля умножается на 100 при выводе. |
NumberFormatter::SCIENTIFIC = 4 | Научная экспоненциальная запись. |
NumberFormatter::SPELLOUT = 5 | Число словами. |
NumberFormatter::ORDINAL = 6 | Порядковое число. |
NumberFormatter::DURATION = 7 | Длительность по правилам ICU; не универсальный перевод секунд. |
NumberFormatter::PATTERN_RULEBASED = 9 | Собственный набор правил RBNF. |
NumberFormatter::IGNORE = 0 | Историческое значение 0 для стиля/правил; используйте константу нужного API. |
NumberFormatter::CURRENCY_ISO = 10 | Валюта с кодом ISO. |
NumberFormatter::CURRENCY_PLURAL = 11 | Локализованное имя валюты с правилами множественного числа. |
NumberFormatter::CURRENCY_ACCOUNTING = 12 | Бухгалтерское отображение отрицательных сумм. |
NumberFormatter::CASH_CURRENCY = 13 | Правила наличной валюты, включая округление минимальной единицы. |
NumberFormatter::CURRENCY_STANDARD = 16 | Стандартная валютная запись. |
NumberFormatter::DEFAULT_STYLE = 1 | Стиль по умолчанию: DECIMAL. |
NumberFormatter::ROUND_CEILING = 0 | К положительной бесконечности. |
NumberFormatter::ROUND_FLOOR = 1 | К отрицательной бесконечности. |
NumberFormatter::ROUND_DOWN = 2 | К нулю. |
NumberFormatter::ROUND_UP = 3 | От нуля. |
NumberFormatter::ROUND_TOWARD_ZERO = 2 | Алиас ROUND_DOWN. |
NumberFormatter::ROUND_AWAY_FROM_ZERO = 3 | Алиас ROUND_UP. |
NumberFormatter::ROUND_HALFEVEN = 4 | К ближайшему; половина к чётному. |
NumberFormatter::ROUND_HALFODD = 8 | К ближайшему; половина к нечётному. |
NumberFormatter::ROUND_HALFDOWN = 5 | К ближайшему; половина к нулю. |
NumberFormatter::ROUND_HALFUP = 6 | К ближайшему; половина от нуля. |
NumberFormatter::PAD_BEFORE_PREFIX = 0 | Дополнение перед префиксом. |
NumberFormatter::PAD_AFTER_PREFIX = 1 | Дополнение после префикса. |
NumberFormatter::PAD_BEFORE_SUFFIX = 2 | Дополнение перед суффиксом. |
NumberFormatter::PAD_AFTER_SUFFIX = 3 | Дополнение после суффикса. |
NumberFormatter::PARSE_INT_ONLY = 0 | При разборе принимать целую часть. |
NumberFormatter::GROUPING_USED = 1 | Включить группировку разрядов. |
NumberFormatter::DECIMAL_ALWAYS_SHOWN = 2 | Показывать десятичный разделитель даже без дроби. |
NumberFormatter::MAX_INTEGER_DIGITS = 3 | Максимум цифр целой части. |
NumberFormatter::MIN_INTEGER_DIGITS = 4 | Минимум цифр целой части. |
NumberFormatter::INTEGER_DIGITS = 5 | Общий атрибут числа цифр целой части. |
NumberFormatter::MAX_FRACTION_DIGITS = 6 | Максимум дробных разрядов. |
NumberFormatter::MIN_FRACTION_DIGITS = 7 | Минимум дробных разрядов. |
NumberFormatter::FRACTION_DIGITS = 8 | Задать минимум и максимум дробных разрядов. |
NumberFormatter::MULTIPLIER = 9 | Множитель для представления, например 100 для процента. |
NumberFormatter::GROUPING_SIZE = 10 | Основной размер группы. |
NumberFormatter::ROUNDING_MODE = 11 | Одна из констант ROUND_*. |
NumberFormatter::ROUNDING_INCREMENT = 12 | Шаг округления. |
NumberFormatter::FORMAT_WIDTH = 13 | Желаемая ширина с дополнением. |
NumberFormatter::PADDING_POSITION = 14 | Одна из позиций PAD_*. |
NumberFormatter::SECONDARY_GROUPING_SIZE = 15 | Размер следующих групп, например для индийской группировки. |
NumberFormatter::SIGNIFICANT_DIGITS_USED = 16 | Использовать значащие цифры. |
NumberFormatter::MIN_SIGNIFICANT_DIGITS = 17 | Минимум значащих цифр. |
NumberFormatter::MAX_SIGNIFICANT_DIGITS = 18 | Максимум значащих цифр. |
NumberFormatter::LENIENT_PARSE = 19 | Разрешить более терпимый разбор; не заменяет проверку формы. |
NumberFormatter::POSITIVE_PREFIX = 0 | Префикс положительной записи. |
NumberFormatter::POSITIVE_SUFFIX = 1 | Суффикс положительной записи. |
NumberFormatter::NEGATIVE_PREFIX = 2 | Префикс отрицательной записи. |
NumberFormatter::NEGATIVE_SUFFIX = 3 | Суффикс отрицательной записи. |
NumberFormatter::PADDING_CHARACTER = 4 | Строка дополнения. |
NumberFormatter::CURRENCY_CODE = 5 | Код валюты ISO. |
NumberFormatter::DEFAULT_RULESET = 6 | Выбранный публичный набор правил RBNF. |
NumberFormatter::PUBLIC_RULESETS = 7 | Список доступных публичных наборов RBNF. |
NumberFormatter::DECIMAL_SEPARATOR_SYMBOL = 0 | Десятичный разделитель. |
NumberFormatter::GROUPING_SEPARATOR_SYMBOL = 1 | Разделитель групп. |
NumberFormatter::PATTERN_SEPARATOR_SYMBOL = 2 | Разделитель частей шаблона. |
NumberFormatter::PERCENT_SYMBOL = 3 | Знак процента. |
NumberFormatter::ZERO_DIGIT_SYMBOL = 4 | Нулевая цифра системы нумерации. |
NumberFormatter::DIGIT_SYMBOL = 5 | Знак необязательной цифры в шаблоне. |
NumberFormatter::MINUS_SIGN_SYMBOL = 6 | Минус. |
NumberFormatter::PLUS_SIGN_SYMBOL = 7 | Плюс. |
NumberFormatter::CURRENCY_SYMBOL = 8 | Локальный символ валюты. |
NumberFormatter::INTL_CURRENCY_SYMBOL = 9 | Международный знак валюты. |
NumberFormatter::MONETARY_SEPARATOR_SYMBOL = 10 | Денежный десятичный разделитель. |
NumberFormatter::EXPONENTIAL_SYMBOL = 11 | Знак экспоненты. |
NumberFormatter::PERMILL_SYMBOL = 12 | Знак промилле. |
NumberFormatter::PAD_ESCAPE_SYMBOL = 13 | Знак экранирования дополнения. |
NumberFormatter::INFINITY_SYMBOL = 14 | Бесконечность. |
NumberFormatter::NAN_SYMBOL = 15 | Не число. |
NumberFormatter::SIGNIFICANT_DIGIT_SYMBOL = 16 | Значащая цифра в шаблоне. |
NumberFormatter::MONETARY_GROUPING_SEPARATOR_SYMBOL = 17 | Денежный разделитель групп. |
NumberFormatter::TYPE_DEFAULT = 0 | Выбор типа форматирования по входу. |
NumberFormatter::TYPE_INT32 = 1 | 32-битное целое. |
NumberFormatter::TYPE_INT64 = 2 | 64-битное целое. |
NumberFormatter::TYPE_DOUBLE = 3 | Двоичное число с плавающей точкой. |
NumberFormatter::TYPE_CURRENCY = 4 | Не поддерживается в format/parse; нужны валютные методы. |
Один объект связывает locale, style, pattern, атрибуты и символы. Повторно используйте его для набора значений с одинаковой политикой. Не изменяйте случайно общий объект настройками соседнего отчёта. Ни format, ни parse не переводят валюту и не делают float точным decimal.
Собственные операции: NumberFormatter::__construct, NumberFormatter::create, NumberFormatter::format, NumberFormatter::parse, NumberFormatter::formatCurrency, NumberFormatter::parseCurrency, NumberFormatter::setAttribute, NumberFormatter::getAttribute, NumberFormatter::setTextAttribute, NumberFormatter::getTextAttribute, NumberFormatter::setSymbol, NumberFormatter::getSymbol, NumberFormatter::setPattern, NumberFormatter::getPattern, NumberFormatter::getLocale, NumberFormatter::getErrorCode, NumberFormatter::getErrorMessage
Normalizer: назначение, константы и операции
Одна видимая буква может иметь несколько допустимых представлений Unicode. Класс предоставляет статические операции; создавать объект не требуется.
Класс
| Константа | Смысл и область применения |
|---|---|
| FORM_D = 4 | Каноническая декомпозиция; алиас NFD. |
| NFD = 4 | Разложение канонически составленных символов. |
| FORM_KD = 8 | Декомпозиция с учётом совместимости; алиас NFKD. |
| NFKD = 8 | Например, полноширинный символ может стать обычным. |
| FORM_C = 16 | Каноническое составление; алиас NFC, стандартный выбор многих приложений. |
| NFC = 16 | Составление после канонического упорядочивания и декомпозиции. |
| FORM_KC = 32 | Составление с учётом совместимости; алиас NFKC. |
| NFKC = 32 | Может стереть значимые для автора различия вида символов. |
| FORM_KC_CF = 48 | Совместимость и case folding; алиас NFKC_CF. |
| NFKC_CF = 48 | Подходит определённым профилям идентификаторов; не универсальная обработка любых строк. |
Нормализация отвечает за представление Unicode. Сортировку по языку выполняет Collator, видимые символы считает grapheme_strlen, перевод алфавитов делает Transliterator. Эти задачи нельзя подменять одной заменой байтов.
Собственные операции: Normalizer::normalize, Normalizer::isNormalized, Normalizer::getRawDecomposition
IntlListFormatter: назначение, константы и операции
Список имён в письме или вариантов доставки должен читаться естественно на языке адресата.
Класс final: нельзя наследовать.
| Константа | Смысл и область применения |
|---|---|
| TYPE_AND = 0 | Соединить элементы союзом «и». |
| TYPE_OR = 1 | Предложить альтернативы союзом «или». |
| TYPE_UNITS = 2 | Перечень величин/единиц без обычного союза. |
| WIDTH_WIDE = 0 | Полная запись. |
| WIDTH_SHORT = 1 | Более короткая языковая запись. |
| WIDTH_NARROW = 2 | Максимально компактная запись. |
Начните с массива строк, затем выберите локаль и вид соединения. Метод не переводит сами элементы: названия товаров уже должны быть подготовлены приложением.
Собственные операции: IntlListFormatter::__construct, IntlListFormatter::format, IntlListFormatter::getErrorCode, IntlListFormatter::getErrorMessage
Locale: назначение, константы и операции
Локаль — набор предпочтений представления, который приложение выбирает для человека и передаёт форматтерам.
| Константа | Смысл и область применения |
|---|---|
| ACTUAL_LOCALE = 0 | Реальная локаль данных форматтера после наследования/fallback. |
| VALID_LOCALE = 1 | Ближайшая допустимая локаль данных при разрешении запроса. |
| DEFAULT_LOCALE = None | null: использовать текущую локаль по умолчанию. |
| LANG_TAG = 'language' | Ключ language для составления/разбора. |
| EXTLANG_TAG = 'extlang' | Ключ extlang для расширенной языковой части. |
| SCRIPT_TAG = 'script' | Ключ script для письменности. |
| REGION_TAG = 'region' | Ключ region для региона. |
| VARIANT_TAG = 'variant' | Ключ variant для варианта. |
| GRANDFATHERED_LANG_TAG = 'grandfathered' | Ключ grandfathered для исторического тега. |
| PRIVATE_TAG = 'private' | Ключ private для частной части тега. |
Все операции Locale статические: Locale::getRegion("en_US") не требует new Locale. Начните с фиксированного списка переводов, затем учитывайте сохранённый выбор пользователя и только потом заголовок браузера. Locale не переводит ваши тексты автоматически.
Собственные операции: Locale::getDefault, Locale::setDefault, Locale::getPrimaryLanguage, Locale::getScript, Locale::getRegion, Locale::getKeywords, Locale::getDisplayScript, Locale::getDisplayRegion, Locale::getDisplayName, Locale::getDisplayLanguage, Locale::getDisplayVariant, Locale::composeLocale, Locale::parseLocale, Locale::getAllVariants, Locale::filterMatches, Locale::lookup, Locale::canonicalize, Locale::acceptFromHttp, Locale::isRightToLeft, Locale::addLikelySubtags, Locale::minimizeSubtags
MessageFormatter: назначение, константы и операции
Шаблон хранит целое переводимое предложение, а массив приносит переменные данные: имя, количество, сумму.
Путь данных: ["name" => "Anna"] → {name} → "Hello, Anna!". Вызов format возвращает строку; echo отдельно показывает её. Сначала освойте одну подстановку, затем число и plural, потом select и вложенные сообщения.
| Синтаксис | Назначение |
|---|---|
| {0} / {name} | Позиционная/именованная подстановка. |
| {n,number,integer} | Число в локальном формате; для других задач есть currency/percent. |
| {date,date,short} / {time,time,short} | Локализованные дата/время; не шаблон PHP date(). |
| {n,plural,one {...} other {...}} | Выбор категории по числу; # внутри ветки показывает число с учётом offset. |
| =0, offset:1 | Точное значение и смещение в plural для фраз вроде «вы и ещё N человек». Семантику нужно согласовать с текстом. |
| select / selectordinal | Выбор строковой ветки / порядковых числительных. |
| Апостроф и фигурные скобки | Синтаксические символы заключают в ASCII-апострофы; удвоенный ASCII-апостроф обозначает один. Обычный типографский ’ удобен в человеческом тексте. |
Подробности синтаксиса и совместимости: руководство ICU MessageFormat. PHP MessageFormatter использует этот API; не считайте его реализацией любой новой версии MessageFormat 2.0.
Собственные операции: MessageFormatter::__construct, MessageFormatter::create, MessageFormatter::format, MessageFormatter::formatMessage, MessageFormatter::parse, MessageFormatter::parseMessage, MessageFormatter::setPattern, MessageFormatter::getPattern, MessageFormatter::getLocale, MessageFormatter::getErrorCode, MessageFormatter::getErrorMessage
Transliterator: назначение, константы и операции
Преобразователь изменяет представление Unicode по правилам ICU; он полезен для поисковых ключей, совместимости и известной схемы транслитерации.
| Константа | Смысл и область применения |
|---|---|
| FORWARD = 0 | Прямое направление правил. |
| REVERSE = 1 | Обратное направление, если правила/ID его поддерживают. |
Свойство id описывает выбранное преобразование. Создавайте его через фабрику и повторно используйте для серии строк. Оригиналы сохраняйте: упрощение часто необратимо. Подробный синтаксис: ICU Transforms.
Собственные операции: Transliterator::__construct, Transliterator::create, Transliterator::createFromRules, Transliterator::createInverse, Transliterator::listIDs, Transliterator::transliterate, Transliterator::getErrorCode, Transliterator::getErrorMessage
ResourceBundle: назначение, константы и операции
ICU хранит данные локалей как дерево ресурсов; ResourceBundle открывает это дерево для чтения.
Класс Интерфейсы: IteratorAggregate, Traversable, Countable.
Обычные приложения чаще используют NumberFormatter/IntlDateFormatter, которые сами читают нужные ICU-данные. ResourceBundle нужен при прямом доступе к ресурсам или собственном подготовленном пакете. get("ключ") похож на выбор подписанного отделения органайзера: внутри может лежать значение или ещё одна коробка. Аналогия не означает, что здесь PHP array: сложная ветка остаётся ResourceBundle.
| Возможность | Как использовать |
|---|---|
| Countable | count($bundle) считает текущую ветку. |
| IteratorAggregate | foreach обходит текущую ветку; getIterator даёт явный итератор. |
| Доступ по смещению | Чтение $bundle[$key] поддерживает ресурсные значения; для управления fallback удобнее явный get. |
| Свой пакет | ICU .res/.dat готовятся инструментами ICU; это не исполнение PHP и не автоматическое чтение произвольного JSON. |
Собственные операции: ResourceBundle::__construct, ResourceBundle::create, ResourceBundle::get, ResourceBundle::count, ResourceBundle::getLocales, ResourceBundle::getErrorCode, ResourceBundle::getErrorMessage, ResourceBundle::getIterator
Байты, кодовые точки и графемы: выберите единицу задачи
Для подписи посетителя обычно нужны графемы; для ограничения сетевого сообщения — байты; для Unicode-свойств — кодовая точка. Их нельзя взаимозаменять. Правила графем приближают то, что человек считает символом, но не измеряют ширину шрифта и не определяют смысл слова.
| Операция | Единица |
|---|---|
| strlen / substr | Байты. |
| IntlChar | Одна кодовая точка. |
| grapheme_strlen / substr / поиск | Графемы. |
| grapheme_extract offset / next | Байты; size зависит от type. |
| Transliterator start/end | UTF-16 code units. |
IntlDateFormatter: назначение, константы и операции
Дата в базе — момент или согласованные поля; дата на экране — представление по языку, календарю и поясу.
| Константа | Смысл и область применения |
|---|---|
| FULL = 0 | Полная языковая запись. |
| LONG = 1 | Длинная запись. |
| MEDIUM = 2 | Средняя запись. |
| SHORT = 3 | Краткая запись. |
| NONE = -1 | Не выводить эту часть. |
| RELATIVE_FULL = 128 | Относительная полная дата, если locale/ICU поддерживают. |
| RELATIVE_LONG = 129 | Относительная длинная дата. |
| RELATIVE_MEDIUM = 130 | Относительная средняя дата. |
| RELATIVE_SHORT = 131 | Относительная краткая дата. |
| PATTERN = -2 | Формат определяется шаблоном; не путать с календарной константой. |
| GREGORIAN = 1 | Григорианская система календаря. |
| TRADITIONAL = 0 | Календарь, принятый для locale. |
Разделяйте четыре понятия: Unix timestamp в секундах; IntlCalendar time в миллисекундах; часовой пояс; календарные поля. Для человека выбирайте локализованный формат, для API — заранее оговорённый формат обмена. Таблица символов ICU объясняет шаблоны и отличия от PHP date().
Собственные операции: IntlDateFormatter::__construct, IntlDateFormatter::create, IntlDateFormatter::getDateType, IntlDateFormatter::getTimeType, IntlDateFormatter::getCalendar, IntlDateFormatter::setCalendar, IntlDateFormatter::getTimeZoneId, IntlDateFormatter::getCalendarObject, IntlDateFormatter::getTimeZone, IntlDateFormatter::setTimeZone, IntlDateFormatter::setPattern, IntlDateFormatter::getPattern, IntlDateFormatter::getLocale, IntlDateFormatter::setLenient, IntlDateFormatter::isLenient, IntlDateFormatter::format, IntlDateFormatter::formatObject, IntlDateFormatter::parse, IntlDateFormatter::parseToCalendar, IntlDateFormatter::localtime, IntlDateFormatter::getErrorCode, IntlDateFormatter::getErrorMessage
IntlDatePatternGenerator: назначение, константы и операции
Генератор превращает набор желаемых полей в локализованный шаблон ICU.
Нужны год, месяц и день → skeleton yMd → шаблон вроде M/d/y или d.M.y → IntlDateFormatter → готовая дата. Не используйте возвращённый шаблон в PHP date(): это разные языки форматирования.
Собственные операции: IntlDatePatternGenerator::__construct, IntlDatePatternGenerator::create, IntlDatePatternGenerator::getBestPattern
IntlTimeZone: назначение, константы и операции
Пояс хранит правила перевода момента в местные часы. Он не равен текущему числу «+3 часа», стране или языку.
| Константа | Смысл и область применения |
|---|---|
| DISPLAY_SHORT = 1 | Краткое стандартное/сезонное название. |
| DISPLAY_LONG = 2 | Полное стандартное/сезонное название. |
| DISPLAY_SHORT_GENERIC = 3 | Краткое общее название. |
| DISPLAY_LONG_GENERIC = 4 | Полное общее название. |
| DISPLAY_SHORT_GMT = 5 | Короткая запись GMT-смещения. |
| DISPLAY_LONG_GMT = 6 | Полная запись GMT-смещения. |
| DISPLAY_SHORT_COMMONLY_USED = 7 | Краткое распространённое/fallback имя. |
| DISPLAY_GENERIC_LOCATION = 8 | Общее название по локации. |
| TYPE_ANY = 0 | Все системные ID, включая алиасы. |
| TYPE_CANONICAL = 1 | Канонические ID. |
| TYPE_CANONICAL_LOCATION = 2 | Канонические ID географических локаций. |
Для событий сохраняйте момент и нужный ID пояса. Для расписания «каждый день в 09:00» нужны также правила локального времени, включая пропущенные и повторённые часы при DST. IntlCalendar описывает разрешение таких ситуаций. Часть страниц PHP содержит только сигнатуры; дополнительные контракты сверены с реализацией PHP 8.5.11 и ICU TimeZone.
Собственные операции: IntlTimeZone::__construct, IntlTimeZone::countEquivalentIDs, IntlTimeZone::createDefault, IntlTimeZone::createEnumeration, IntlTimeZone::createTimeZone, IntlTimeZone::createTimeZoneIDEnumeration, IntlTimeZone::fromDateTimeZone, IntlTimeZone::getCanonicalID, IntlTimeZone::getDisplayName, IntlTimeZone::getDSTSavings, IntlTimeZone::getEquivalentID, IntlTimeZone::getErrorCode, IntlTimeZone::getErrorMessage, IntlTimeZone::getGMT, IntlTimeZone::getIanaID, IntlTimeZone::getID, IntlTimeZone::getOffset, IntlTimeZone::getRawOffset, IntlTimeZone::getRegion, IntlTimeZone::getTZDataVersion, IntlTimeZone::getUnknown, IntlTimeZone::getWindowsID, IntlTimeZone::getIDForWindowsID, IntlTimeZone::hasSameRules, IntlTimeZone::toDateTimeZone, IntlTimeZone::useDaylightTime
IntlCalendar: назначение, константы и операции
Календарь связывает момент с полями выбранной системы и правилами местного времени. Все изменения полей выполняются в объекте, а вычисление момента может откладываться.
Класс
| Константа | Смысл и область применения |
|---|---|
| FIELD_ERA = 0 | Эра календарной системы. |
| FIELD_YEAR = 1 | Год внутри эры. |
| FIELD_MONTH = 2 | Месяц от 0. |
| FIELD_WEEK_OF_YEAR = 3 | Неделя недельного года. |
| FIELD_WEEK_OF_MONTH = 4 | Неделя месяца. |
| FIELD_DATE = 5 | День месяца; алиас FIELD_DAY_OF_MONTH. |
| FIELD_DAY_OF_YEAR = 6 | День года от 1. |
| FIELD_DAY_OF_WEEK = 7 | День недели DOW_*. |
| FIELD_DAY_OF_WEEK_IN_MONTH = 8 | Порядковое вхождение дня недели в месяц. |
| FIELD_AM_PM = 9 | Половина суток: 0 AM, 1 PM. |
| FIELD_HOUR = 10 | Часы 0…11; вместе с AM_PM. |
| FIELD_HOUR_OF_DAY = 11 | Часы 0…23. |
| FIELD_MINUTE = 12 | Минуты. |
| FIELD_SECOND = 13 | Секунды. |
| FIELD_MILLISECOND = 14 | Миллисекундная часть. |
| FIELD_ZONE_OFFSET = 15 | Базовое смещение пояса, миллисекунды. |
| FIELD_DST_OFFSET = 16 | Сезонная поправка, миллисекунды. |
| FIELD_YEAR_WOY = 17 | Год, которому принадлежит неделя. |
| FIELD_DOW_LOCAL = 18 | День недели относительно её настроенного начала. |
| FIELD_EXTENDED_YEAR = 19 | Расширенный год без разделения на эры. |
| FIELD_JULIAN_DAY = 20 | Номер юлианского дня, не Julian calendar year. |
| FIELD_MILLISECONDS_IN_DAY = 21 | Миллисекунды от местной полуночи. |
| FIELD_IS_LEAP_MONTH = 22 | Признак дополнительного месяца в поддерживающей его системе. |
| FIELD_FIELD_COUNT = 24 | Служебное число полей; не допустимое поле для get/set. |
| FIELD_DAY_OF_MONTH = 5 | День месяца от 1. |
| DOW_SUNDAY = 1 | Воскресенье. |
| DOW_MONDAY = 2 | Понедельник. |
| DOW_TUESDAY = 3 | Вторник. |
| DOW_WEDNESDAY = 4 | Среда. |
| DOW_THURSDAY = 5 | Четверг. |
| DOW_FRIDAY = 6 | Пятница. |
| DOW_SATURDAY = 7 | Суббота. |
| DOW_TYPE_WEEKDAY = 0 | Рабочий день по обычным правилам локали. |
| DOW_TYPE_WEEKEND = 1 | Полный выходной. |
| DOW_TYPE_WEEKEND_OFFSET = 2 | Внутри дня начинается выходной. |
| DOW_TYPE_WEEKEND_CEASE = 3 | Внутри дня заканчивается выходной. |
| WALLTIME_FIRST = 1 | Первый вариант при повторе/сторона до разрыва. |
| WALLTIME_LAST = 0 | Последний вариант/сторона после разрыва. |
| WALLTIME_NEXT_VALID = 2 | Ближайшее допустимое время после пропуска; только skipped. |
Начните с createInstance("UTC", "en_US"), затем setTime(0) и чтения года/месяца. Когда строите новую дату из полей, сначала clear(), затем задайте все значимые поля. Месяц от 0; время ICU в миллисекундах. В реальном сервисе отдельно решите, храните ли вы момент события или обещание «09:00 по местному времени».
Собственные операции: IntlCalendar::__construct, IntlCalendar::createInstance, IntlCalendar::equals, IntlCalendar::fieldDifference, IntlCalendar::add, IntlCalendar::after, IntlCalendar::before, IntlCalendar::clear, IntlCalendar::fromDateTime, IntlCalendar::get, IntlCalendar::getActualMaximum, IntlCalendar::getActualMinimum, IntlCalendar::getAvailableLocales, IntlCalendar::getDayOfWeekType, IntlCalendar::getErrorCode, IntlCalendar::getErrorMessage, IntlCalendar::getFirstDayOfWeek, IntlCalendar::getGreatestMinimum, IntlCalendar::getKeywordValuesForLocale, IntlCalendar::getLeastMaximum, IntlCalendar::getLocale, IntlCalendar::getMaximum, IntlCalendar::getMinimalDaysInFirstWeek, IntlCalendar::setMinimalDaysInFirstWeek, IntlCalendar::getMinimum, IntlCalendar::getNow, IntlCalendar::getRepeatedWallTimeOption, IntlCalendar::getSkippedWallTimeOption, IntlCalendar::getTime, IntlCalendar::getTimeZone, IntlCalendar::getType, IntlCalendar::getWeekendTransition, IntlCalendar::inDaylightTime, IntlCalendar::isEquivalentTo, IntlCalendar::isLenient, IntlCalendar::isWeekend, IntlCalendar::roll, IntlCalendar::isSet, IntlCalendar::set, IntlCalendar::setDate, IntlCalendar::setDateTime, IntlCalendar::setFirstDayOfWeek, IntlCalendar::setLenient, IntlCalendar::setRepeatedWallTimeOption, IntlCalendar::setSkippedWallTimeOption, IntlCalendar::setTime, IntlCalendar::setTimeZone, IntlCalendar::toDateTime
IntlGregorianCalendar: назначение, константы и операции
Конкретная реализация IntlCalendar для григорианской системы с настраиваемым историческим переходом от юлианской.
Класс Родитель: IntlCalendar.
Все поля, арифметика, timezone и правила недели наследуются из IntlCalendar. Дополнительные методы решают создание из полей, високосность и границу календарной реформы. Не путайте юлианский календарь с FIELD_JULIAN_DAY: последнее — числовой номер дня.
Собственные операции: IntlGregorianCalendar::createFromDate, IntlGregorianCalendar::createFromDateTime, IntlGregorianCalendar::__construct, IntlGregorianCalendar::setGregorianChange, IntlGregorianCalendar::getGregorianChange, IntlGregorianCalendar::isLeapYear
UConverter: назначение, константы и операции
Конвертер декодирует байты источника в Unicode, затем кодирует Unicode в целевые байты. Именно на этих двух границах возникают разные ошибки.
| Константа | Смысл и область применения |
|---|---|
| REASON_UNASSIGNED = 0 | Символ/байты не имеют соответствия. |
| REASON_ILLEGAL = 1 | Недопустимая последовательность. |
| REASON_IRREGULAR = 2 | Нерегулярная последовательность. |
| REASON_RESET = 3 | Сброс состояния конвертера. |
| REASON_CLOSE = 4 | Закрытие конвертера. |
| REASON_CLONE = 5 | Клонирование конвертера. |
| UNSUPPORTED_CONVERTER = -1 | Неизвестный/неподдержанный тип. |
| SBCS = 0 | Однобайтовая таблица. |
| DBCS = 1 | Двухбайтовая таблица. |
| MBCS = 2 | Многобайтовая таблица. |
| LATIN_1 = 3 | Специальный ISO-8859-1 конвертер. |
| UTF8 = 4 | UTF-8. |
| UTF16_BigEndian = 5 | UTF-16, старший байт первым. |
| UTF16_LittleEndian = 6 | UTF-16, младший байт первым. |
| UTF32_BigEndian = 7 | UTF-32, старший байт первым. |
| UTF32_LittleEndian = 8 | UTF-32, младший байт первым. |
| EBCDIC_STATEFUL = 9 | EBCDIC с состоянием. |
| ISO_2022 = 10 | ISO-2022 с переключением наборов. |
| LMBCS_1 = 11 | Вариант Lotus Multi-Byte Character Set 1. |
| LMBCS_2 = 12 | Вариант Lotus Multi-Byte Character Set 2. |
| LMBCS_3 = 13 | Вариант Lotus Multi-Byte Character Set 3. |
| LMBCS_4 = 14 | Вариант Lotus Multi-Byte Character Set 4. |
| LMBCS_5 = 15 | Вариант Lotus Multi-Byte Character Set 5. |
| LMBCS_6 = 16 | Вариант Lotus Multi-Byte Character Set 6. |
| LMBCS_8 = 17 | Вариант Lotus Multi-Byte Character Set 8. |
| LMBCS_11 = 18 | Вариант Lotus Multi-Byte Character Set 11. |
| LMBCS_16 = 19 | Вариант Lotus Multi-Byte Character Set 16. |
| LMBCS_17 = 20 | Вариант Lotus Multi-Byte Character Set 17. |
| LMBCS_18 = 21 | Вариант Lotus Multi-Byte Character Set 18. |
| LMBCS_19 = 22 | Вариант Lotus Multi-Byte Character Set 19. |
| LMBCS_LAST = 22 | Верхняя граница группы типов LMBCS. |
| HZ = 23 | HZ-кодирование. |
| SCSU = 24 | Standard Compression Scheme for Unicode. |
| ISCII = 25 | Индийские наборы ISCII. |
| US_ASCII = 26 | 7-битный ASCII. |
| UTF7 = 27 | UTF-7; для нового веб-контента предпочитайте UTF-8. |
| BOCU1 = 28 | Binary Ordered Compression for Unicode. |
| UTF16 = 29 | UTF-16 с определением порядка байтов. |
| UTF32 = 30 | UTF-32 с определением порядка байтов. |
| CESU8 = 31 | CESU-8, не обычный UTF-8. |
| IMAP_MAILBOX = 32 | Модифицированный UTF-7 имён IMAP mailbox. |
Схема: Latin-1 E9 → Unicode U+00E9 → UTF-8 C3 A9. from/to в имени callback относятся к Unicode, а не к направлению бизнес-интеграции. Сначала используйте известную пару кодировок, затем явную политику замены и только при необходимости наследник с callbacks. Документация многих методов содержит лишь synopsis; детали сверены с исходниками PHP 8.5.11 UConverter.
Собственные операции: UConverter::__construct, UConverter::convert, UConverter::fromUCallback, UConverter::getAliases, UConverter::getAvailable, UConverter::getDestinationEncoding, UConverter::getDestinationType, UConverter::getErrorCode, UConverter::getErrorMessage, UConverter::getSourceEncoding, UConverter::getSourceType, UConverter::getStandards, UConverter::getSubstChars, UConverter::reasonText, UConverter::setDestinationEncoding, UConverter::setSourceEncoding, UConverter::setSubstChars, UConverter::toUCallback, UConverter::transcode
Spoofchecker: назначение, константы и операции
Проверка помогает заметить, что новое имя похоже на существующее или нарушает разрешённый профиль символов.
| Константа | Смысл и область применения |
|---|---|
| SINGLE_SCRIPT_CONFUSABLE = 1 | Маска: смешиваемость в одной письменности. |
| MIXED_SCRIPT_CONFUSABLE = 2 | Маска: похожесть при смешении письменностей. |
| WHOLE_SCRIPT_CONFUSABLE = 4 | Маска: целиком разные письменности выглядят похоже. |
| ANY_CASE = 8 | Исторический флаг работы с регистром; в современных ICU устарел/не влияет как прежде. Не подменяет профиль регистра приложения. |
| SINGLE_SCRIPT = 16 | Проверка ограничения письменностей/уровня restriction. |
| INVISIBLE = 32 | Проверка подозрительно невидимых комбинаций. |
| CHAR_LIMIT = 64 | Проверка разрешённого набора символов. |
| ASCII = 268435456 | Уровень: только ASCII. |
| HIGHLY_RESTRICTIVE = 805306368 | Уровень: строго ограниченные сочетания; default. |
| MODERATELY_RESTRICTIVE = 1073741824 | Уровень: умеренно ограниченные сочетания. |
| MINIMALLY_RESTRICTIVE = 1342177280 | Уровень: минимальные ограничения. |
| UNRESTRICTIVE = 1610612736 | Уровень: без ограничения сочетаний данным механизмом. |
| SINGLE_SCRIPT_RESTRICTIVE = 536870912 | Уровень: одна допустимая письменность. |
| MIXED_NUMBERS = 128 | Смешение разных систем десятичных цифр. |
| HIDDEN_OVERLAY = 256 | Подозрительные перекрывающие комбинируемые знаки. |
| IGNORE_SPACE = 1 | Опция UnicodeSet: игнорировать пробелы синтаксиса набора. |
| CASE_INSENSITIVE = 2 | Опция UnicodeSet: замыкание по регистру. |
| ADD_CASE_MAPPINGS = 4 | Опция UnicodeSet: добавить отображения регистра. |
| SIMPLE_CASE_INSENSITIVE = 6 | Опция UnicodeSet: простое замыкание по регистру, ICU 73+. |
Не смешивайте три пространства констант: setChecks принимает маску проверок, setRestrictionLevel один уровень, setAllowedChars свои опции UnicodeSet. Переменная errorCode у isSuspicious/areConfusable получает маску найденных признаков при успешном вызове, несмотря на неоднозначное имя. Это подтверждается реализацией PHP.
Собственные операции: Spoofchecker::__construct, Spoofchecker::isSuspicious, Spoofchecker::areConfusable, Spoofchecker::setAllowedLocales, Spoofchecker::setChecks, Spoofchecker::setRestrictionLevel, Spoofchecker::setAllowedChars
Граница — место между символами, а не сам символ
Редактору нужно поставить курсор после целого символа, поиску — выделить слово, аннотации — взять первое предложение. Разрезать UTF-8 по случайному байту нельзя: одна буква может занимать несколько байтов, а один видимый знак — несколько кодовых точек. Итератор хранит исходный текст и текущее место между его частями; next передвигает это место.
| Текст A я B | Перед A | После A | После я | После B |
|---|---|---|---|---|
| Позиция в байтах UTF-8 | 0 | 1 | 3 | 4 |
Именно байтовые позиции возвращает PHP IntlBreakIterator. Поэтому найденные начала и длины можно передавать substr, но нельзя без преобразования передавать как символьные индексы mb_substr. Character работает с границами графем, CodePoint — кодовых точек. Границы слова включают пробелы и пунктуацию: чтобы считать только слова, используйте статус сегмента.
Последовательность: создать подходящий итератор → setText → first/next или foreach → получить позиции либо getPartsIterator для готовых фрагментов. Объект хранит изменяемую позицию: два вложенных обхода одного объекта мешают друг другу. Для независимых обходов используйте разные объекты/копии. Повторно используйте настроенный объект для последовательных текстов: создание анализатора дороже смены текста. Результаты языковых правил могут меняться с ICU и словарями.
IntlBreakIterator: назначение, константы и операции
Базовый API поиска границ графем, кодовых точек, слов, строк и предложений.
Класс Интерфейсы: IteratorAggregate, Traversable.
| Константа | Смысл и область применения |
|---|---|
| DONE = -1 | Нет следующей/предыдущей границы; -1, не 0. |
| WORD_NONE = 0 | Начало диапазона сегментов без слова: пробелы/пунктуация. |
| WORD_NONE_LIMIT = 100 | Верхняя НЕ включённая граница диапазона WORD_NONE. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
| WORD_NUMBER = 100 | Начало диапазона числовых сегментов. |
| WORD_NUMBER_LIMIT = 200 | Верхняя НЕ включённая граница диапазона WORD_NUMBER. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
| WORD_LETTER = 200 | Начало диапазона буквенных слов. |
| WORD_LETTER_LIMIT = 300 | Верхняя НЕ включённая граница диапазона WORD_LETTER. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
| WORD_KANA = 300 | Начало диапазона сегментов kana. |
| WORD_KANA_LIMIT = 400 | Верхняя НЕ включённая граница диапазона WORD_KANA. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
| WORD_IDEO = 400 | Начало диапазона идеографических сегментов. |
| WORD_IDEO_LIMIT = 500 | Верхняя НЕ включённая граница диапазона WORD_IDEO. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
| LINE_SOFT = 0 | Начало диапазона необязательных переносов. |
| LINE_SOFT_LIMIT = 100 | Верхняя НЕ включённая граница диапазона LINE_SOFT. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
| LINE_HARD = 100 | Начало диапазона обязательных разрывов. |
| LINE_HARD_LIMIT = 200 | Верхняя НЕ включённая граница диапазона LINE_HARD. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
| SENTENCE_TERM = 0 | Начало диапазона границ после знака окончания предложения. |
| SENTENCE_TERM_LIMIT = 100 | Верхняя НЕ включённая граница диапазона SENTENCE_TERM. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
| SENTENCE_SEP = 100 | Начало диапазона границ, вызванных разделителем. |
| SENTENCE_SEP_LIMIT = 200 | Верхняя НЕ включённая граница диапазона SENTENCE_SEP. Проверяйте status >= начало && status < LIMIT, а не равенство одному значению. |
0 и конец текста — полноценные границы. Результаты сегментации не доказывают, что слово существует в словаре или что произвольная строка написана грамматически верно. Для поискового морфологического анализа нужен другой уровень обработки. IntlRuleBasedBreakIterator добавляет статусы правил, IntlPartsIterator возвращает текст сегментов.
Собственные операции: IntlBreakIterator::createCharacterInstance, IntlBreakIterator::createCodePointInstance, IntlBreakIterator::createLineInstance, IntlBreakIterator::createSentenceInstance, IntlBreakIterator::createTitleInstance, IntlBreakIterator::createWordInstance, IntlBreakIterator::__construct, IntlBreakIterator::current, IntlBreakIterator::first, IntlBreakIterator::following, IntlBreakIterator::getErrorCode, IntlBreakIterator::getErrorMessage, IntlBreakIterator::getLocale, IntlBreakIterator::getPartsIterator, IntlBreakIterator::getText, IntlBreakIterator::isBoundary, IntlBreakIterator::last, IntlBreakIterator::next, IntlBreakIterator::preceding, IntlBreakIterator::previous, IntlBreakIterator::setText, IntlBreakIterator::getIterator
IntlRuleBasedBreakIterator: назначение, константы и операции
Анализатор с правилами ICU: стандартные word/line/sentence фабрики часто возвращают именно его.
Класс Родитель: IntlBreakIterator. Интерфейсы: Traversable, IteratorAggregate.
Методы границ наследуются из IntlBreakIterator. Дополнительные операции позволяют получить грамматику, её бинарное представление и метки сработавших правил. Это полезно для объяснимой классификации каждого сегмента. Для переносимых собственных правил храните текст и версию ICU вместе с контрольными примерами.
Собственные операции: IntlRuleBasedBreakIterator::__construct, IntlRuleBasedBreakIterator::getBinaryRules, IntlRuleBasedBreakIterator::getRules, IntlRuleBasedBreakIterator::getRuleStatus, IntlRuleBasedBreakIterator::getRuleStatusVec
Почему next() и next(n) различаются при чтении кодовой точки
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCodePointInstance();
$iterator->setText("Aя");
$iterator->next();
$iterator->next();
echo $iterator->getLastCodePoint(), "
";
Ожидаемый результат
1103
1103 — U+044F. Одиночный next сохраняет пройденную точку; перегрузка next(n) в PHP 8.5.11 читает точку уже в новом месте.
IntlCodePointBreakIterator: назначение, константы и операции
Специализация для обхода отдельных кодовых точек UTF-8.
Класс Родитель: IntlBreakIterator. Интерфейсы: Traversable, IteratorAggregate.
Получается фабрикой createCodePointInstance. Не используйте такой обход для удаления «последнего видимого символа»: можно оставить оторванный комбинируемый знак; для пользовательского текста нужна графемная граница.
Собственные операции: IntlCodePointBreakIterator::getLastCodePoint
IntlIterator: назначение, константы и операции
Общий объект последовательного обхода, который возвращают различные фабрики Intl.
Класс Интерфейсы: Iterator, Traversable.
Обычно вы получаете его из операции другого класса, а не создаёте пустой объект вручную. Например, IntlTimeZone возвращает перечисления зон, а IntlPartsIterator отдаёт части текста. Iterator — договор из пяти методов; foreach вызывает их за вас. Для маленького набора iterator_to_array удобен, но сохраняет все элементы в памяти.
Собственные операции: IntlIterator::current, IntlIterator::key, IntlIterator::next, IntlIterator::rewind, IntlIterator::valid
IntlPartsIterator: назначение, константы и операции
Готовые текстовые фрагменты между границами; наследует методы Iterator от IntlIterator.
Класс Родитель: IntlIterator. Интерфейсы: Traversable, Iterator.
| Константа | Смысл и область применения |
|---|---|
| KEY_SEQUENTIAL = 0 | Ключ 0, 1, 2… — номер сегмента. |
| KEY_LEFT = 1 | Ключ — начало фрагмента в байтах. |
| KEY_RIGHT = 2 | Ключ — конец фрагмента в байтах, не включённый в него. |
Получайте через getPartsIterator. KEY_LEFT/RIGHT измеряются в байтах исходного UTF-8. Справа граница не включена: substr(text, left, right - left). Чтение частей не нормализует строку и не удаляет пробелы автоматически.
Собственные операции: IntlPartsIterator::getBreakIterator, IntlPartsIterator::getRuleStatus
IntlChar: от непонятного символа к его номеру и свойствам
В выгрузке пришёл внешне обычный пробел, но поиск его не находит. Для человека он похож на другой, а Unicode присвоил каждому свой номер. IntlChar позволяет посмотреть одну кодовую точку: номер, имя, категорию, числовое значение, регистр и свойства. Это похоже на справочную карточку отдельной детали. Ограничение модели: один видимый знак может состоять из нескольких деталей — буква плюс акцент или emoji sequence.
| Представление | Конкретный пример |
|---|---|
| Байты UTF-8 | é занимает 2 байта; e + combining accent занимает 3. |
| Кодовые точки | é — U+00E9; составной вариант — U+0065 и U+0301. IntlChar за раз принимает только одну. |
| Графема | Оба варианта могут выглядеть как одна буква. Для этого уровня нужны grapheme_* / BreakIterator. |
| Строка | Содержит последовательность байтов. $text[0] читает один байт, а не первую Unicode точку. |
<?php
declare(strict_types=1);
echo IntlChar::ord("А"), "
";
Ожидаемый результат
1040
IntlChar — имя класса со статическими методами; :: вызывает операцию без создания объекта. ord — имя операции, скобки передают одну букву, echo показывает возвращённый integer.
<?php
declare(strict_types=1);
$points = ["e", "\u{0301}"];
foreach ($points as $point) printf("U+%04X\n", IntlChar::ord($point));
echo 'Графем: ', grapheme_strlen(implode('', $points)), "\n";
Ожидаемый результат
U+0065
U+0301
Графем: 1
Массив тут задан явно, поэтому ни один байт не разрезан. Важное следствие: не передавайте всё e+accent одним аргументом IntlChar.
Почти все методы с codepoint возвращают null при некорректном входе. Ошибку читают сразу через intl_get_error_code/message; поведение exception/error_level зависит от настройки intl. false у предиката обычно означает корректный символ без свойства. Методы именования свойств возвращают false, digit имеет false, forDigit возвращает integer0, числовое отсутствие — NO_NUMERIC_VALUE: универсальное if(!$result) ошибочно. Подробнее intl_get_error_code.
Таблица кодовых точек включает surrogate диапазон D800–DFFF, но это не самостоятельные Unicode scalar values. PHP8.5 wrapper проверяет общий диапазон, поэтому для генерации UTF-8 из недоверенного integer сначала исключают surrogate значения. Присвоенность isdefined не заменяет эту проверку. Noncharacters и private use тоже требуют политики конкретного протокола. Этот класс не доказывает язык текста, наличие глифа, безопасность логина или правильность HTML.
Применение к форме и импорту: от строки к понятной диагностике
Теперь применим справочник к целому значению из импорта. Сначала строку UTF-8 разделяют на кодовые точки, затем у каждого элемента спрашивают нужное свойство. Программа ниже только объясняет подозрительный промежуток: она не удаляет форматирующие знаки из имени клиента и не меняет данные без выбранного правила.
<?php
declare(strict_types=1);
$input = "ID\u{00A0}A42";
$points = preg_split('//u', $input, -1, PREG_SPLIT_NO_EMPTY);
if ($points === false) throw new InvalidArgumentException('Ожидался корректный UTF-8');
foreach ($points as $index => $char) {
if (IntlChar::isUWhiteSpace($char)) {
printf("Позиция %d: U+%04X %s\n", $index, IntlChar::ord($char), IntlChar::charName($char));
}
}
Ожидаемый результат
Позиция 2: U+00A0 NO-BREAK SPACE
Позиция считается в кодовых точках, не байтах и не графемах. Пустое регулярное выражение с u используется здесь для корректного UTF-8 разбиения; для больших потоков нужен порционный подход.
<?php
declare(strict_types=1);
$input = '٢٣';
$points = preg_split('//u', $input, -1, PREG_SPLIT_NO_EMPTY);
if ($points === false || $points === [] || count($points) > 3) throw new InvalidArgumentException('Нужны от1 до3 цифр');
$quantity = 0;
foreach ($points as $char) {
$digit = IntlChar::charDigitValue($char);
if ($digit === null || $digit < 0) throw new InvalidArgumentException('Разрешены только десятичные цифры');
$quantity = $quantity * 10 + $digit;
}
echo "Количество: $quantity\n";
Ожидаемый результат
Количество: 23
Предел 3 цифры исключает переполнение этого учебного значения. Пример сознательно разрешает все Nd; если интеграция требует только ASCII или одну письменность, добавляют именно такое правило. Это не parser денежных дробей.
Упражнение: дополните отчёт названиями категорий, сохраняя исходную строку. Для каждого элемента получите charType и передайте результат в getPropertyValueName с PROPERTY_GENERAL_CATEGORY. Проверьте текст с обычным пробелом, NBSP и буквой с отдельным акцентом. Объясните, почему последняя видимая буква может дать две строки отчёта. Решение строится из уже показанного обхода и карточек charType/getPropertyValueName; строковое исправление выполняют только после согласования правил импорта.
IntlChar: назначение, константы и операции
Справочник одной Unicode точки: номер, имя, свойства, преобразования и все константы.
| Константа | Смысл и область применения |
|---|---|
IntlChar::UNICODE_VERSION = "16.0" | Строка версии Unicode данных при сборке ICU, не версия PHP. |
IntlChar::CODEPOINT_MIN = 0 | Нижняя граница 0 включительно. |
IntlChar::CODEPOINT_MAX = 1114111 | Верхняя граница 0x10FFFF включительно; surrogate range внутри неё отдельно исключают при генерации UTF-8. |
IntlChar::NO_NUMERIC_VALUE = -123456789 | Sentinel отсутствующего Numeric_Value. Сравнивать с float результатом getNumericValue. |
IntlChar::PROPERTY_ALPHABETIC = 0 | Алфавитное свойство, шире категории L. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_BINARY_START = 0 | Начальная включённая граница семейства BINARY. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_ASCII_HEX_DIGIT = 1 | Только ASCII0–9/A–F/a–f. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_BIDI_CONTROL = 2 | Управляющий знак алгоритма двунаправленного текста. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_BIDI_MIRRORED = 3 | В RTL контексте может требоваться зеркальный глиф. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_DASH = 4 | Unicode признак тире/дефисоподобного знака. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_DEFAULT_IGNORABLE_CODE_POINT = 5 | Может игнорироваться отображением; это не команда удалять знак из данных. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_DEPRECATED = 6 | Unicode помечает применение точки как устаревшее. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_DIACRITIC = 7 | Диакритический знак или точка с соответствующим свойством. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_EXTENDER = 8 | Модификатор, расширяющий применение предшествующей буквы. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_FULL_COMPOSITION_EXCLUSION = 9 | Исключена из полной canonical composition. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_GRAPHEME_BASE = 10 | Может служить базой графемы по этому UCD свойству. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_GRAPHEME_EXTEND = 11 | Продолжает графему; не обязательно отдельный видимый знак. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_GRAPHEME_LINK = 12 | Историческое свойство связи графем, не современный полный алгоритм сегментации. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_HEX_DIGIT = 13 | ASCII или полноширинная hexadecimal форма; не только ASCII. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_HYPHEN = 14 | Историческое свойство дефисных знаков. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_ID_CONTINUE = 15 | Unicode правило продолжения идентификатора. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_ID_START = 16 | Начальная включённая граница семейства ID. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_IDEOGRAPHIC = 17 | Идеографическое свойство, не определение языка. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_IDS_BINARY_OPERATOR = 18 | Двухоперандный оператор структуры идеограммы. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_IDS_TRINARY_OPERATOR = 19 | Трёхоперандный оператор структуры идеограммы. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_IDS_UNARY_OPERATOR = 72 | Однооперандный оператор структуры идеограммы. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_ID_COMPAT_MATH_START = 73 | Начальная включённая граница семейства ID_COMPAT_MATH. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_ID_COMPAT_MATH_CONTINUE = 74 | Математические дополнения для продолжения идентификатора. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_JOIN_CONTROL = 20 | Управляет соединением знаков, например ZWJ/ZWNJ. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_LOGICAL_ORDER_EXCEPTION = 21 | Исключение из обычного логического порядка хранения. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_LOWERCASE = 22 | Полное свойство строчного регистра, шире Ll. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_MATH = 23 | Математический знак или буква с этим свойством. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NONCHARACTER_CODE_POINT = 24 | Зарезервированный noncharacter; не surrogate. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_QUOTATION_MARK = 25 | Кавычечный знак по Unicode. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_RADICAL = 26 | Радикал CJK. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_SOFT_DOTTED = 27 | Точка буквы может исчезать при добавлении диакритики. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_TERMINAL_PUNCTUATION = 28 | Пунктуация, потенциально завершающая текстовую единицу. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_UNIFIED_IDEOGRAPH = 29 | Унифицированная CJK идеограмма. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_UPPERCASE = 30 | Полное свойство прописного регистра, шире Lu. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_WHITE_SPACE = 31 | Unicode White_Space, отличное от нескольких исторических ICU space функций. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_XID_CONTINUE = 32 | ID_Continue с устойчивостью к указанным Unicode правилам нормализации. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_XID_START = 33 | Начальная включённая граница семейства XID. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_CASE_SENSITIVE = 34 | Точка участвует в регистровых различиях. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_S_TERM = 35 | Sentence_Terminal: признак завершения предложения. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_VARIATION_SELECTOR = 36 | Модифицирует вариант отображения предшествующего знака. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NFD_INERT = 37 | Инертна относительно NFD по определению ICU. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NFKD_INERT = 38 | Инертна относительно NFKD. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NFC_INERT = 39 | Инертна относительно NFC. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NFKC_INERT = 40 | Инертна относительно NFKC. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_SEGMENT_STARTER = 41 | Начинает сегмент нормализации. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_PATTERN_SYNTAX = 42 | Unicode Pattern_Syntax; не автоматически regex метасимвол PHP. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_PATTERN_WHITE_SPACE = 43 | Стабильные пробелы для синтаксиса шаблонов, не весь White_Space. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_POSIX_ALNUM = 44 | ICU POSIX-like буквенно-числовое свойство. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_POSIX_BLANK = 45 | ICU горизонтальные промежутки. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_POSIX_GRAPH = 46 | ICU POSIX-like графические точки. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_POSIX_PRINT = 47 | ICU POSIX-like печатные точки. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_POSIX_XDIGIT = 48 | ICU POSIX-like hexadecimal цифры. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CASED = 49 | Точка имеет регистр. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CASE_IGNORABLE = 50 | Может игнорироваться в определении регистрового контекста. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CHANGES_WHEN_LOWERCASED = 51 | Изменяется при Unicode lowercase mapping. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CHANGES_WHEN_UPPERCASED = 52 | Изменяется при uppercase mapping. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CHANGES_WHEN_TITLECASED = 53 | Изменяется при titlecase mapping. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CHANGES_WHEN_CASEFOLDED = 54 | Изменяется при case folding. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CHANGES_WHEN_CASEMAPPED = 55 | Изменяется хотя бы при одном указанном case mapping. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CHANGES_WHEN_NFKC_CASEFOLDED = 56 | Изменяется при NFKC case folding. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_BINARY_LIMIT = 76 | Конечная исключённая граница семейства BINARY. Не отдельное рабочее свойство. |
IntlChar::PROPERTY_BIDI_CLASS = 4096 | Bidi категория; результаты CHAR_DIRECTION_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_INT_START = 4096 | Начальная включённая граница семейства INT. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_BLOCK = 4097 | Блок диапазона; результаты BLOCK_CODE_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CANONICAL_COMBINING_CLASS = 4098 | Порядок canonical combining class; не пиксельная координата. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_DECOMPOSITION_TYPE = 4099 | Тип разложения; результаты DT_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_EAST_ASIAN_WIDTH = 4100 | Класс East Asian Width; EA_*, не готовая ширина шрифта. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_GENERAL_CATEGORY = 4101 | Единичная общая категория; CHAR_CATEGORY_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_JOINING_GROUP = 4102 | Группа соединения букв; JG_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_JOINING_TYPE = 4103 | Способ соединения с соседями; JT_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_LINE_BREAK = 4104 | Класс алгоритма переноса; LB_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NUMERIC_TYPE = 4105 | Вид численного значения; NT_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_SCRIPT = 4106 | Письменность точки, не язык. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_HANGUL_SYLLABLE_TYPE = 4107 | Составная роль Hangul; HST_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NFD_QUICK_CHECK = 4108 | Быстрая проверка NFD, не полная нормализация. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NFKD_QUICK_CHECK = 4109 | Быстрая проверка NFKD. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NFC_QUICK_CHECK = 4110 | Быстрая проверка NFC; может потребоваться полный алгоритм. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NFKC_QUICK_CHECK = 4111 | Быстрая проверка NFKC. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_LEAD_CANONICAL_COMBINING_CLASS = 4112 | Начальный CCC canonical decomposition. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_TRAIL_CANONICAL_COMBINING_CLASS = 4113 | Конечный CCC canonical decomposition. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_GRAPHEME_CLUSTER_BREAK = 4114 | Класс границы графемы; GCB_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_SENTENCE_BREAK = 4115 | Класс границы предложения; SB_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_WORD_BREAK = 4116 | Класс границы слова; WB_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_BIDI_PAIRED_BRACKET_TYPE = 4117 | Нет/открывающая/закрывающая скобка; BPT_*. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_INT_LIMIT = 4123 | Конечная исключённая граница семейства INT. Не отдельное рабочее свойство. |
IntlChar::PROPERTY_GENERAL_CATEGORY_MASK = 8192 | Маска категорий, не единичный integer код категории. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_MASK_START = 8192 | Начальная включённая граница семейства MASK. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_MASK_LIMIT = 8193 | Конечная исключённая граница семейства MASK. Не отдельное рабочее свойство. |
IntlChar::PROPERTY_NUMERIC_VALUE = 12288 | Дробное numeric значение; getter getNumericValue. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_DOUBLE_START = 12288 | Начальная включённая граница семейства DOUBLE. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_DOUBLE_LIMIT = 12289 | Конечная исключённая граница семейства DOUBLE. Не отдельное рабочее свойство. |
IntlChar::PROPERTY_AGE = 16384 | Версия первого назначения; getter charAge. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_STRING_START = 16384 | Начальная включённая граница семейства STRING. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_BIDI_MIRRORING_GLYPH = 16385 | Простой mapping зеркального глифа; charMirror. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_CASE_FOLDING = 16386 | Полный casefold mapping; результат может включать несколько точек. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_ISO_COMMENT = 16387 | Историческое поле ISO comment; современные данные могут быть пустыми. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_LOWERCASE_MAPPING = 16388 | Полный lowercase mapping, потенциально многоточечный. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_NAME = 16389 | Современное имя символа; charName. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_SIMPLE_CASE_FOLDING = 16390 | Одноточечное case folding; foldCase. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_SIMPLE_LOWERCASE_MAPPING = 16391 | Одноточечный lowercase; tolower. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_SIMPLE_TITLECASE_MAPPING = 16392 | Одноточечный titlecase; totitle. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_SIMPLE_UPPERCASE_MAPPING = 16393 | Одноточечный uppercase; toupper. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_TITLECASE_MAPPING = 16394 | Полный titlecase mapping. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_UNICODE_1_NAME = 16395 | Историческое Unicode1 имя; наличие данных ограничено. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_UPPERCASE_MAPPING = 16396 | Полный uppercase mapping. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_BIDI_PAIRED_BRACKET = 16397 | Mapping парной скобки; getBidiPairedBracket. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_STRING_LIMIT = 16398 | Конечная исключённая граница семейства STRING. Не отдельное рабочее свойство. |
IntlChar::PROPERTY_SCRIPT_EXTENSIONS = 28672 | Набор письменностей, не одно значение Script; IntlChar не предоставляет полноценный getter массива этого свойства. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду. |
IntlChar::PROPERTY_OTHER_PROPERTY_START = 28672 | Начальная включённая граница семейства OTHER_PROPERTY. Может совпадать с реальным первым selector, но описывает диапазон. |
IntlChar::PROPERTY_OTHER_PROPERTY_LIMIT = 28674 | Конечная исключённая граница семейства OTHER_PROPERTY. Не отдельное рабочее свойство. |
IntlChar::PROPERTY_INVALID_CODE = -1 | Sentinel неразрешённого property/value alias; проверяется до следующего вызова. |
IntlChar::CHAR_CATEGORY_UNASSIGNED = 0 | Cn: не назначена. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_GENERAL_OTHER_TYPES = 0 | Alias Cn/UNASSIGNED, не общее объединение всех C. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_UPPERCASE_LETTER = 1 | Lu: прописная буква. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_LOWERCASE_LETTER = 2 | Ll: строчная буква. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_TITLECASE_LETTER = 3 | Lt: отдельная titlecase буква. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_MODIFIER_LETTER = 4 | Lm: модифицирующая буква. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_OTHER_LETTER = 5 | Lo: другая буква. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_NON_SPACING_MARK = 6 | Mn: mark без собственного места. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_ENCLOSING_MARK = 7 | Me: охватывающий mark. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_COMBINING_SPACING_MARK = 8 | Mc: комбинируемый spacing mark. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_DECIMAL_DIGIT_NUMBER = 9 | Nd: десятичная цифра. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_LETTER_NUMBER = 10 | Nl: буквенный числовой знак. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_OTHER_NUMBER = 11 | No: иной числовой знак, например дробь. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_SPACE_SEPARATOR = 12 | Zs: пробельный разделитель. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_LINE_SEPARATOR = 13 | Zl: разделитель строк. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_PARAGRAPH_SEPARATOR = 14 | Zp: разделитель абзацев. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_CONTROL_CHAR = 15 | Cc: управляющая точка. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_FORMAT_CHAR = 16 | Cf: форматирующая точка. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_PRIVATE_USE_CHAR = 17 | Co: private use. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_SURROGATE = 18 | Cs: surrogate, не самостоятельное scalar value UTF-8. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_DASH_PUNCTUATION = 19 | Pd: тире/дефисная пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_START_PUNCTUATION = 20 | Ps: открывающая пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_END_PUNCTUATION = 21 | Pe: закрывающая пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_CONNECTOR_PUNCTUATION = 22 | Pc: соединительная пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_OTHER_PUNCTUATION = 23 | Po: другая пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_MATH_SYMBOL = 24 | Sm: математический символ. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_CURRENCY_SYMBOL = 25 | Sc: валютный знак. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_MODIFIER_SYMBOL = 26 | Sk: модифицирующий символ. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_OTHER_SYMBOL = 27 | So: другой символ. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_INITIAL_PUNCTUATION = 28 | Pi: начальная кавычечная пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_FINAL_PUNCTUATION = 29 | Pf: конечная кавычечная пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY. |
IntlChar::CHAR_CATEGORY_CHAR_CATEGORY_COUNT = 30 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT = 0 | L, сильное направление слева направо. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT = 1 | R, сильное направление справа налево. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER = 2 | EN, европейская числовая форма. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR = 3 | ES, разделитель европейских чисел. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_TERMINATOR = 4 | ET, примыкающий к европейскому числу знак. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_ARABIC_NUMBER = 5 | AN, арабская числовая форма. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR = 6 | CS, общий числовой разделитель. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_BLOCK_SEPARATOR = 7 | B, разделитель абзаца. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_SEGMENT_SEPARATOR = 8 | S, разделитель сегмента. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_WHITE_SPACE_NEUTRAL = 9 | WS, нейтральный пробел. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_OTHER_NEUTRAL = 10 | ON, другой нейтральный знак. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_EMBEDDING = 11 | LRE, вложенный LTR контекст. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_OVERRIDE = 12 | LRO, принудительный LTR контекст. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ARABIC = 13 | AL, арабский strong RTL. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_EMBEDDING = 14 | RLE, вложенный RTL контекст. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_OVERRIDE = 15 | RLO, принудительный RTL контекст. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_FORMAT = 16 | PDF, завершение embedding/override. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_DIR_NON_SPACING_MARK = 17 | NSM, nonspacing mark. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_BOUNDARY_NEUTRAL = 18 | BN, нейтральная граница. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_FIRST_STRONG_ISOLATE = 19 | FSI, направление изолята по первому strong символу. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_ISOLATE = 20 | LRI, LTR изолят. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ISOLATE = 21 | RLI, RTL изолят. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_ISOLATE = 22 | PDI, завершение изолята. Значение charDirection / PROPERTY_BIDI_CLASS. |
IntlChar::CHAR_DIRECTION_CHAR_DIRECTION_COUNT = 23 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::BLOCK_CODE_NO_BLOCK = 0 | Точка не относится к именованному Unicode блоку. |
IntlChar::BLOCK_CODE_BASIC_LATIN = 1 | Блок Unicode «Basic Latin»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LATIN_1_SUPPLEMENT = 2 | Блок Unicode «Latin 1 Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LATIN_EXTENDED_A = 3 | Блок Unicode «Latin Extended A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LATIN_EXTENDED_B = 4 | Блок Unicode «Latin Extended B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_IPA_EXTENSIONS = 5 | Блок Unicode «Ipa Extensions»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SPACING_MODIFIER_LETTERS = 6 | Блок Unicode «Spacing Modifier Letters»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COMBINING_DIACRITICAL_MARKS = 7 | Блок Unicode «Combining Diacritical Marks»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GREEK = 8 | Блок Unicode «Greek»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CYRILLIC = 9 | Блок Unicode «Cyrillic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ARMENIAN = 10 | Блок Unicode «Armenian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HEBREW = 11 | Блок Unicode «Hebrew»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ARABIC = 12 | Блок Unicode «Arabic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SYRIAC = 13 | Блок Unicode «Syriac»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_THAANA = 14 | Блок Unicode «Thaana»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_DEVANAGARI = 15 | Блок Unicode «Devanagari»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BENGALI = 16 | Блок Unicode «Bengali»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GURMUKHI = 17 | Блок Unicode «Gurmukhi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GUJARATI = 18 | Блок Unicode «Gujarati»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ORIYA = 19 | Блок Unicode «Oriya»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAMIL = 20 | Блок Unicode «Tamil»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TELUGU = 21 | Блок Unicode «Telugu»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KANNADA = 22 | Блок Unicode «Kannada»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MALAYALAM = 23 | Блок Unicode «Malayalam»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SINHALA = 24 | Блок Unicode «Sinhala»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_THAI = 25 | Блок Unicode «Thai»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LAO = 26 | Блок Unicode «Lao»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TIBETAN = 27 | Блок Unicode «Tibetan»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MYANMAR = 28 | Блок Unicode «Myanmar»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GEORGIAN = 29 | Блок Unicode «Georgian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HANGUL_JAMO = 30 | Блок Unicode «Hangul Jamo»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ETHIOPIC = 31 | Блок Unicode «Ethiopic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CHEROKEE = 32 | Блок Unicode «Cherokee»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS = 33 | Блок Unicode «Unified Canadian Aboriginal Syllabics»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OGHAM = 34 | Блок Unicode «Ogham»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_RUNIC = 35 | Блок Unicode «Runic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KHMER = 36 | Блок Unicode «Khmer»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MONGOLIAN = 37 | Блок Unicode «Mongolian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LATIN_EXTENDED_ADDITIONAL = 38 | Блок Unicode «Latin Extended Additional»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GREEK_EXTENDED = 39 | Блок Unicode «Greek Extended»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GENERAL_PUNCTUATION = 40 | Блок Unicode «General Punctuation»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUPERSCRIPTS_AND_SUBSCRIPTS = 41 | Блок Unicode «Superscripts And Subscripts»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CURRENCY_SYMBOLS = 42 | Блок Unicode «Currency Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COMBINING_MARKS_FOR_SYMBOLS = 43 | Блок Unicode «Combining Marks For Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LETTERLIKE_SYMBOLS = 44 | Блок Unicode «Letterlike Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_NUMBER_FORMS = 45 | Блок Unicode «Number Forms»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ARROWS = 46 | Блок Unicode «Arrows»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MATHEMATICAL_OPERATORS = 47 | Блок Unicode «Mathematical Operators»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MISCELLANEOUS_TECHNICAL = 48 | Блок Unicode «Miscellaneous Technical»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CONTROL_PICTURES = 49 | Блок Unicode «Control Pictures»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OPTICAL_CHARACTER_RECOGNITION = 50 | Блок Unicode «Optical Character Recognition»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ENCLOSED_ALPHANUMERICS = 51 | Блок Unicode «Enclosed Alphanumerics»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BOX_DRAWING = 52 | Блок Unicode «Box Drawing»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BLOCK_ELEMENTS = 53 | Блок Unicode «Block Elements»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GEOMETRIC_SHAPES = 54 | Блок Unicode «Geometric Shapes»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MISCELLANEOUS_SYMBOLS = 55 | Блок Unicode «Miscellaneous Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_DINGBATS = 56 | Блок Unicode «Dingbats»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BRAILLE_PATTERNS = 57 | Блок Unicode «Braille Patterns»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_RADICALS_SUPPLEMENT = 58 | Блок Unicode «Cjk Radicals Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KANGXI_RADICALS = 59 | Блок Unicode «Kangxi Radicals»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_IDEOGRAPHIC_DESCRIPTION_CHARACTERS = 60 | Блок Unicode «Ideographic Description Characters»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_SYMBOLS_AND_PUNCTUATION = 61 | Блок Unicode «Cjk Symbols And Punctuation»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HIRAGANA = 62 | Блок Unicode «Hiragana»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KATAKANA = 63 | Блок Unicode «Katakana»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BOPOMOFO = 64 | Блок Unicode «Bopomofo»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HANGUL_COMPATIBILITY_JAMO = 65 | Блок Unicode «Hangul Compatibility Jamo»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KANBUN = 66 | Блок Unicode «Kanbun»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BOPOMOFO_EXTENDED = 67 | Блок Unicode «Bopomofo Extended»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ENCLOSED_CJK_LETTERS_AND_MONTHS = 68 | Блок Unicode «Enclosed Cjk Letters And Months»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_COMPATIBILITY = 69 | Блок Unicode «Cjk Compatibility»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A = 70 | Блок Unicode «Cjk Unified Ideographs Extension A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS = 71 | Блок Unicode «Cjk Unified Ideographs»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_YI_SYLLABLES = 72 | Блок Unicode «Yi Syllables»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_YI_RADICALS = 73 | Блок Unicode «Yi Radicals»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HANGUL_SYLLABLES = 74 | Блок Unicode «Hangul Syllables»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HIGH_SURROGATES = 75 | Блок Unicode «High Surrogates»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HIGH_PRIVATE_USE_SURROGATES = 76 | Блок Unicode «High Private Use Surrogates»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LOW_SURROGATES = 77 | Блок Unicode «Low Surrogates»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PRIVATE_USE_AREA = 78 | Блок Unicode «Private Use Area»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PRIVATE_USE = 78 | Блок Unicode «Private Use»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS = 79 | Блок Unicode «Cjk Compatibility Ideographs»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ALPHABETIC_PRESENTATION_FORMS = 80 | Блок Unicode «Alphabetic Presentation Forms»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ARABIC_PRESENTATION_FORMS_A = 81 | Блок Unicode «Arabic Presentation Forms A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COMBINING_HALF_MARKS = 82 | Блок Unicode «Combining Half Marks»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_COMPATIBILITY_FORMS = 83 | Блок Unicode «Cjk Compatibility Forms»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SMALL_FORM_VARIANTS = 84 | Блок Unicode «Small Form Variants»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ARABIC_PRESENTATION_FORMS_B = 85 | Блок Unicode «Arabic Presentation Forms B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SPECIALS = 86 | Блок Unicode «Specials»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HALFWIDTH_AND_FULLWIDTH_FORMS = 87 | Блок Unicode «Halfwidth And Fullwidth Forms»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OLD_ITALIC = 88 | Блок Unicode «Old Italic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GOTHIC = 89 | Блок Unicode «Gothic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_DESERET = 90 | Блок Unicode «Deseret»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BYZANTINE_MUSICAL_SYMBOLS = 91 | Блок Unicode «Byzantine Musical Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MUSICAL_SYMBOLS = 92 | Блок Unicode «Musical Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MATHEMATICAL_ALPHANUMERIC_SYMBOLS = 93 | Блок Unicode «Mathematical Alphanumeric Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B = 94 | Блок Unicode «Cjk Unified Ideographs Extension B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_COMPATIBILITY_IDEOGRAPHS_SUPPLEMENT = 95 | Блок Unicode «Cjk Compatibility Ideographs Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAGS = 96 | Блок Unicode «Tags»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CYRILLIC_SUPPLEMENT = 97 | Блок Unicode «Cyrillic Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CYRILLIC_SUPPLEMENTARY = 97 | Блок Unicode «Cyrillic Supplementary»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAGALOG = 98 | Блок Unicode «Tagalog»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HANUNOO = 99 | Блок Unicode «Hanunoo»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BUHID = 100 | Блок Unicode «Buhid»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAGBANWA = 101 | Блок Unicode «Tagbanwa»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_A = 102 | Блок Unicode «Miscellaneous Mathematical Symbols A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUPPLEMENTAL_ARROWS_A = 103 | Блок Unicode «Supplemental Arrows A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUPPLEMENTAL_ARROWS_B = 104 | Блок Unicode «Supplemental Arrows B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MISCELLANEOUS_MATHEMATICAL_SYMBOLS_B = 105 | Блок Unicode «Miscellaneous Mathematical Symbols B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUPPLEMENTAL_MATHEMATICAL_OPERATORS = 106 | Блок Unicode «Supplemental Mathematical Operators»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KATAKANA_PHONETIC_EXTENSIONS = 107 | Блок Unicode «Katakana Phonetic Extensions»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_VARIATION_SELECTORS = 108 | Блок Unicode «Variation Selectors»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_A = 109 | Блок Unicode «Supplementary Private Use Area A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUPPLEMENTARY_PRIVATE_USE_AREA_B = 110 | Блок Unicode «Supplementary Private Use Area B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LIMBU = 111 | Блок Unicode «Limbu»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAI_LE = 112 | Блок Unicode «Tai Le»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KHMER_SYMBOLS = 113 | Блок Unicode «Khmer Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PHONETIC_EXTENSIONS = 114 | Блок Unicode «Phonetic Extensions»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_ARROWS = 115 | Блок Unicode «Miscellaneous Symbols And Arrows»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_YIJING_HEXAGRAM_SYMBOLS = 116 | Блок Unicode «Yijing Hexagram Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LINEAR_B_SYLLABARY = 117 | Блок Unicode «Linear B Syllabary»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LINEAR_B_IDEOGRAMS = 118 | Блок Unicode «Linear B Ideograms»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_AEGEAN_NUMBERS = 119 | Блок Unicode «Aegean Numbers»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_UGARITIC = 120 | Блок Unicode «Ugaritic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SHAVIAN = 121 | Блок Unicode «Shavian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OSMANYA = 122 | Блок Unicode «Osmanya»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CYPRIOT_SYLLABARY = 123 | Блок Unicode «Cypriot Syllabary»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAI_XUAN_JING_SYMBOLS = 124 | Блок Unicode «Tai Xuan Jing Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_VARIATION_SELECTORS_SUPPLEMENT = 125 | Блок Unicode «Variation Selectors Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ANCIENT_GREEK_MUSICAL_NOTATION = 126 | Блок Unicode «Ancient Greek Musical Notation»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ANCIENT_GREEK_NUMBERS = 127 | Блок Unicode «Ancient Greek Numbers»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ARABIC_SUPPLEMENT = 128 | Блок Unicode «Arabic Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BUGINESE = 129 | Блок Unicode «Buginese»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_STROKES = 130 | Блок Unicode «Cjk Strokes»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_SUPPLEMENT = 131 | Блок Unicode «Combining Diacritical Marks Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COPTIC = 132 | Блок Unicode «Coptic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ETHIOPIC_EXTENDED = 133 | Блок Unicode «Ethiopic Extended»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ETHIOPIC_SUPPLEMENT = 134 | Блок Unicode «Ethiopic Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GEORGIAN_SUPPLEMENT = 135 | Блок Unicode «Georgian Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GLAGOLITIC = 136 | Блок Unicode «Glagolitic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KHAROSHTHI = 137 | Блок Unicode «Kharoshthi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MODIFIER_TONE_LETTERS = 138 | Блок Unicode «Modifier Tone Letters»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_NEW_TAI_LUE = 139 | Блок Unicode «New Tai Lue»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OLD_PERSIAN = 140 | Блок Unicode «Old Persian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PHONETIC_EXTENSIONS_SUPPLEMENT = 141 | Блок Unicode «Phonetic Extensions Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUPPLEMENTAL_PUNCTUATION = 142 | Блок Unicode «Supplemental Punctuation»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SYLOTI_NAGRI = 143 | Блок Unicode «Syloti Nagri»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TIFINAGH = 144 | Блок Unicode «Tifinagh»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_VERTICAL_FORMS = 145 | Блок Unicode «Vertical Forms»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_NKO = 146 | Блок Unicode «Nko»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BALINESE = 147 | Блок Unicode «Balinese»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LATIN_EXTENDED_C = 148 | Блок Unicode «Latin Extended C»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LATIN_EXTENDED_D = 149 | Блок Unicode «Latin Extended D»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PHAGS_PA = 150 | Блок Unicode «Phags Pa»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PHOENICIAN = 151 | Блок Unicode «Phoenician»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CUNEIFORM = 152 | Блок Unicode «Cuneiform»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CUNEIFORM_NUMBERS_AND_PUNCTUATION = 153 | Блок Unicode «Cuneiform Numbers And Punctuation»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COUNTING_ROD_NUMERALS = 154 | Блок Unicode «Counting Rod Numerals»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUNDANESE = 155 | Блок Unicode «Sundanese»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LEPCHA = 156 | Блок Unicode «Lepcha»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OL_CHIKI = 157 | Блок Unicode «Ol Chiki»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CYRILLIC_EXTENDED_A = 158 | Блок Unicode «Cyrillic Extended A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_VAI = 159 | Блок Unicode «Vai»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CYRILLIC_EXTENDED_B = 160 | Блок Unicode «Cyrillic Extended B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SAURASHTRA = 161 | Блок Unicode «Saurashtra»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KAYAH_LI = 162 | Блок Unicode «Kayah Li»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_REJANG = 163 | Блок Unicode «Rejang»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CHAM = 164 | Блок Unicode «Cham»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ANCIENT_SYMBOLS = 165 | Блок Unicode «Ancient Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PHAISTOS_DISC = 166 | Блок Unicode «Phaistos Disc»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LYCIAN = 167 | Блок Unicode «Lycian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CARIAN = 168 | Блок Unicode «Carian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LYDIAN = 169 | Блок Unicode «Lydian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MAHJONG_TILES = 170 | Блок Unicode «Mahjong Tiles»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_DOMINO_TILES = 171 | Блок Unicode «Domino Tiles»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SAMARITAN = 172 | Блок Unicode «Samaritan»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_UNIFIED_CANADIAN_ABORIGINAL_SYLLABICS_EXTENDED = 173 | Блок Unicode «Unified Canadian Aboriginal Syllabics Extended»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAI_THAM = 174 | Блок Unicode «Tai Tham»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_VEDIC_EXTENSIONS = 175 | Блок Unicode «Vedic Extensions»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LISU = 176 | Блок Unicode «Lisu»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BAMUM = 177 | Блок Unicode «Bamum»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COMMON_INDIC_NUMBER_FORMS = 178 | Блок Unicode «Common Indic Number Forms»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_DEVANAGARI_EXTENDED = 179 | Блок Unicode «Devanagari Extended»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HANGUL_JAMO_EXTENDED_A = 180 | Блок Unicode «Hangul Jamo Extended A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_JAVANESE = 181 | Блок Unicode «Javanese»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MYANMAR_EXTENDED_A = 182 | Блок Unicode «Myanmar Extended A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAI_VIET = 183 | Блок Unicode «Tai Viet»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MEETEI_MAYEK = 184 | Блок Unicode «Meetei Mayek»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_HANGUL_JAMO_EXTENDED_B = 185 | Блок Unicode «Hangul Jamo Extended B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_IMPERIAL_ARAMAIC = 186 | Блок Unicode «Imperial Aramaic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OLD_SOUTH_ARABIAN = 187 | Блок Unicode «Old South Arabian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_AVESTAN = 188 | Блок Unicode «Avestan»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_INSCRIPTIONAL_PARTHIAN = 189 | Блок Unicode «Inscriptional Parthian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_INSCRIPTIONAL_PAHLAVI = 190 | Блок Unicode «Inscriptional Pahlavi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OLD_TURKIC = 191 | Блок Unicode «Old Turkic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_RUMI_NUMERAL_SYMBOLS = 192 | Блок Unicode «Rumi Numeral Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KAITHI = 193 | Блок Unicode «Kaithi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_EGYPTIAN_HIEROGLYPHS = 194 | Блок Unicode «Egyptian Hieroglyphs»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ENCLOSED_ALPHANUMERIC_SUPPLEMENT = 195 | Блок Unicode «Enclosed Alphanumeric Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ENCLOSED_IDEOGRAPHIC_SUPPLEMENT = 196 | Блок Unicode «Enclosed Ideographic Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C = 197 | Блок Unicode «Cjk Unified Ideographs Extension C»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MANDAIC = 198 | Блок Unicode «Mandaic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BATAK = 199 | Блок Unicode «Batak»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ETHIOPIC_EXTENDED_A = 200 | Блок Unicode «Ethiopic Extended A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BRAHMI = 201 | Блок Unicode «Brahmi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BAMUM_SUPPLEMENT = 202 | Блок Unicode «Bamum Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KANA_SUPPLEMENT = 203 | Блок Unicode «Kana Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PLAYING_CARDS = 204 | Блок Unicode «Playing Cards»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MISCELLANEOUS_SYMBOLS_AND_PICTOGRAPHS = 205 | Блок Unicode «Miscellaneous Symbols And Pictographs»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_EMOTICONS = 206 | Блок Unicode «Emoticons»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TRANSPORT_AND_MAP_SYMBOLS = 207 | Блок Unicode «Transport And Map Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ALCHEMICAL_SYMBOLS = 208 | Блок Unicode «Alchemical Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D = 209 | Блок Unicode «Cjk Unified Ideographs Extension D»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ARABIC_EXTENDED_A = 210 | Блок Unicode «Arabic Extended A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ARABIC_MATHEMATICAL_ALPHABETIC_SYMBOLS = 211 | Блок Unicode «Arabic Mathematical Alphabetic Symbols»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CHAKMA = 212 | Блок Unicode «Chakma»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MEETEI_MAYEK_EXTENSIONS = 213 | Блок Unicode «Meetei Mayek Extensions»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MEROITIC_CURSIVE = 214 | Блок Unicode «Meroitic Cursive»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MEROITIC_HIEROGLYPHS = 215 | Блок Unicode «Meroitic Hieroglyphs»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MIAO = 216 | Блок Unicode «Miao»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SHARADA = 217 | Блок Unicode «Sharada»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SORA_SOMPENG = 218 | Блок Unicode «Sora Sompeng»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUNDANESE_SUPPLEMENT = 219 | Блок Unicode «Sundanese Supplement»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TAKRI = 220 | Блок Unicode «Takri»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_BASSA_VAH = 221 | Блок Unicode «Bassa Vah»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_CAUCASIAN_ALBANIAN = 222 | Блок Unicode «Caucasian Albanian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COPTIC_EPACT_NUMBERS = 223 | Блок Unicode «Coptic Epact Numbers»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COMBINING_DIACRITICAL_MARKS_EXTENDED = 224 | Блок Unicode «Combining Diacritical Marks Extended»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_DUPLOYAN = 225 | Блок Unicode «Duployan»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ELBASAN = 226 | Блок Unicode «Elbasan»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GEOMETRIC_SHAPES_EXTENDED = 227 | Блок Unicode «Geometric Shapes Extended»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_GRANTHA = 228 | Блок Unicode «Grantha»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KHOJKI = 229 | Блок Unicode «Khojki»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_KHUDAWADI = 230 | Блок Unicode «Khudawadi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LATIN_EXTENDED_E = 231 | Блок Unicode «Latin Extended E»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_LINEAR_A = 232 | Блок Unicode «Linear A»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MAHAJANI = 233 | Блок Unicode «Mahajani»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MANICHAEAN = 234 | Блок Unicode «Manichaean»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MENDE_KIKAKUI = 235 | Блок Unicode «Mende Kikakui»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MODI = 236 | Блок Unicode «Modi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MRO = 237 | Блок Unicode «Mro»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_MYANMAR_EXTENDED_B = 238 | Блок Unicode «Myanmar Extended B»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_NABATAEAN = 239 | Блок Unicode «Nabataean»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OLD_NORTH_ARABIAN = 240 | Блок Unicode «Old North Arabian»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_OLD_PERMIC = 241 | Блок Unicode «Old Permic»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_ORNAMENTAL_DINGBATS = 242 | Блок Unicode «Ornamental Dingbats»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PAHAWH_HMONG = 243 | Блок Unicode «Pahawh Hmong»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PALMYRENE = 244 | Блок Unicode «Palmyrene»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PAU_CIN_HAU = 245 | Блок Unicode «Pau Cin Hau»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_PSALTER_PAHLAVI = 246 | Блок Unicode «Psalter Pahlavi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SHORTHAND_FORMAT_CONTROLS = 247 | Блок Unicode «Shorthand Format Controls»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SIDDHAM = 248 | Блок Unicode «Siddham»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SINHALA_ARCHAIC_NUMBERS = 249 | Блок Unicode «Sinhala Archaic Numbers»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_SUPPLEMENTAL_ARROWS_C = 250 | Блок Unicode «Supplemental Arrows C»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_TIRHUTA = 251 | Блок Unicode «Tirhuta»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_WARANG_CITI = 252 | Блок Unicode «Warang Citi»: именованный диапазон кодов. Результат getBlockCode / PROPERTY_BLOCK, не определение языка и не набор разрешённых знаков формы. |
IntlChar::BLOCK_CODE_COUNT = 339 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::BLOCK_CODE_INVALID_CODE = -1 | Недопустимый block code sentinel ICU; не имя диапазона. |
IntlChar::BPT_NONE = 0 | Не скобочная пара. Значение PROPERTY_BIDI_PAIRED_BRACKET_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::BPT_OPEN = 1 | Открывающая парная скобка. Значение PROPERTY_BIDI_PAIRED_BRACKET_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::BPT_CLOSE = 2 | Закрывающая парная скобка. Значение PROPERTY_BIDI_PAIRED_BRACKET_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::BPT_COUNT = 3 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::EA_NEUTRAL = 0 | Нейтральная ширина East Asian Width. Значение PROPERTY_EAST_ASIAN_WIDTH, не самостоятельное правило полного алгоритма. |
IntlChar::EA_AMBIGUOUS = 1 | Ширина зависит от контекста. Значение PROPERTY_EAST_ASIAN_WIDTH, не самостоятельное правило полного алгоритма. |
IntlChar::EA_HALFWIDTH = 2 | Полуширинная форма. Значение PROPERTY_EAST_ASIAN_WIDTH, не самостоятельное правило полного алгоритма. |
IntlChar::EA_FULLWIDTH = 3 | Полноширинная форма. Значение PROPERTY_EAST_ASIAN_WIDTH, не самостоятельное правило полного алгоритма. |
IntlChar::EA_NARROW = 4 | Узкий класс. Значение PROPERTY_EAST_ASIAN_WIDTH, не самостоятельное правило полного алгоритма. |
IntlChar::EA_WIDE = 5 | Широкий класс. Значение PROPERTY_EAST_ASIAN_WIDTH, не самостоятельное правило полного алгоритма. |
IntlChar::EA_COUNT = 6 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::UNICODE_CHAR_NAME = 0 | Современное Unicode имя символа. |
IntlChar::UNICODE_10_CHAR_NAME = 1 | Историческое Unicode1 имя, если данные есть и отличаются. |
IntlChar::EXTENDED_CHAR_NAME = 2 | Расширенное имя, включая служебные обозначения unnamed точек. |
IntlChar::CHAR_NAME_ALIAS = 3 | Корректирующий alias имени, если определён. |
IntlChar::CHAR_NAME_CHOICE_COUNT = 4 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::SHORT_PROPERTY_NAME = 0 | Короткий alias свойства/значения. |
IntlChar::LONG_PROPERTY_NAME = 1 | Длинное стандартное имя свойства/значения. |
IntlChar::PROPERTY_NAME_CHOICE_COUNT = 2 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::DT_NONE = 0 | Нет разложения. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_CANONICAL = 1 | Каноническое разложение. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_COMPAT = 2 | Общее совместимое разложение. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_CIRCLE = 3 | Обведённая форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_FINAL = 4 | Конечная позиционная форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_FONT = 5 | Шрифтовый вариант. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_FRACTION = 6 | Дробная форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_INITIAL = 7 | Начальная позиционная форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_ISOLATED = 8 | Изолированная форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_MEDIAL = 9 | Срединная форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_NARROW = 10 | Узкий вариант. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_NOBREAK = 11 | Неразрывная форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_SMALL = 12 | Малая форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_SQUARE = 13 | Квадратная форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_SUB = 14 | Нижний индекс. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_SUPER = 15 | Верхний индекс. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_VERTICAL = 16 | Вертикальная форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_WIDE = 17 | Широкая форма. Значение PROPERTY_DECOMPOSITION_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::DT_COUNT = 18 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::JT_NON_JOINING = 0 | Не соединяется. Значение PROPERTY_JOINING_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::JT_JOIN_CAUSING = 1 | Вызывает соединение соседей. Значение PROPERTY_JOINING_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::JT_DUAL_JOINING = 2 | Соединяется с обеих сторон. Значение PROPERTY_JOINING_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::JT_LEFT_JOINING = 3 | Соединяется слева. Значение PROPERTY_JOINING_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::JT_RIGHT_JOINING = 4 | Соединяется справа. Значение PROPERTY_JOINING_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::JT_TRANSPARENT = 5 | Прозрачна для определения соединения. Значение PROPERTY_JOINING_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::JT_COUNT = 6 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::JG_NO_JOINING_GROUP = 0 | Отсутствует именованная Joining_Group. |
IntlChar::JG_AIN = 1 | Joining_Group «Ain»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_ALAPH = 2 | Joining_Group «Alaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_ALEF = 3 | Joining_Group «Alef»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_BEH = 4 | Joining_Group «Beh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_BETH = 5 | Joining_Group «Beth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_DAL = 6 | Joining_Group «Dal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_DALATH_RISH = 7 | Joining_Group «Dalath Rish»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_E = 8 | Joining_Group «E»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_FEH = 9 | Joining_Group «Feh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_FINAL_SEMKATH = 10 | Joining_Group «Final Semkath»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_GAF = 11 | Joining_Group «Gaf»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_GAMAL = 12 | Joining_Group «Gamal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_HAH = 13 | Joining_Group «Hah»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_TEH_MARBUTA_GOAL = 14 | Joining_Group «Teh Marbuta Goal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_HAMZA_ON_HEH_GOAL = 14 | Joining_Group «Hamza On Heh Goal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_HE = 15 | Joining_Group «He»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_HEH = 16 | Joining_Group «Heh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_HEH_GOAL = 17 | Joining_Group «Heh Goal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_HETH = 18 | Joining_Group «Heth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_KAF = 19 | Joining_Group «Kaf»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_KAPH = 20 | Joining_Group «Kaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_KNOTTED_HEH = 21 | Joining_Group «Knotted Heh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_LAM = 22 | Joining_Group «Lam»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_LAMADH = 23 | Joining_Group «Lamadh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MEEM = 24 | Joining_Group «Meem»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MIM = 25 | Joining_Group «Mim»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_NOON = 26 | Joining_Group «Noon»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_NUN = 27 | Joining_Group «Nun»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_PE = 28 | Joining_Group «Pe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_QAF = 29 | Joining_Group «Qaf»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_QAPH = 30 | Joining_Group «Qaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_REH = 31 | Joining_Group «Reh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_REVERSED_PE = 32 | Joining_Group «Reversed Pe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_SAD = 33 | Joining_Group «Sad»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_SADHE = 34 | Joining_Group «Sadhe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_SEEN = 35 | Joining_Group «Seen»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_SEMKATH = 36 | Joining_Group «Semkath»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_SHIN = 37 | Joining_Group «Shin»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_SWASH_KAF = 38 | Joining_Group «Swash Kaf»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_SYRIAC_WAW = 39 | Joining_Group «Syriac Waw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_TAH = 40 | Joining_Group «Tah»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_TAW = 41 | Joining_Group «Taw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_TEH_MARBUTA = 42 | Joining_Group «Teh Marbuta»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_TETH = 43 | Joining_Group «Teth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_WAW = 44 | Joining_Group «Waw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_YEH = 45 | Joining_Group «Yeh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_YEH_BARREE = 46 | Joining_Group «Yeh Barree»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_YEH_WITH_TAIL = 47 | Joining_Group «Yeh With Tail»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_YUDH = 48 | Joining_Group «Yudh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_YUDH_HE = 49 | Joining_Group «Yudh He»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_ZAIN = 50 | Joining_Group «Zain»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_FE = 51 | Joining_Group «Fe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_KHAPH = 52 | Joining_Group «Khaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_ZHAIN = 53 | Joining_Group «Zhain»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_BURUSHASKI_YEH_BARREE = 54 | Joining_Group «Burushaski Yeh Barree»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_FARSI_YEH = 55 | Joining_Group «Farsi Yeh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_NYA = 56 | Joining_Group «Nya»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_ROHINGYA_YEH = 57 | Joining_Group «Rohingya Yeh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_ALEPH = 58 | Joining_Group «Manichaean Aleph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_AYIN = 59 | Joining_Group «Manichaean Ayin»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_BETH = 60 | Joining_Group «Manichaean Beth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_DALETH = 61 | Joining_Group «Manichaean Daleth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_DHAMEDH = 62 | Joining_Group «Manichaean Dhamedh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_FIVE = 63 | Joining_Group «Manichaean Five»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_GIMEL = 64 | Joining_Group «Manichaean Gimel»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_HETH = 65 | Joining_Group «Manichaean Heth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_HUNDRED = 66 | Joining_Group «Manichaean Hundred»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_KAPH = 67 | Joining_Group «Manichaean Kaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_LAMEDH = 68 | Joining_Group «Manichaean Lamedh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_MEM = 69 | Joining_Group «Manichaean Mem»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_NUN = 70 | Joining_Group «Manichaean Nun»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_ONE = 71 | Joining_Group «Manichaean One»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_PE = 72 | Joining_Group «Manichaean Pe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_QOPH = 73 | Joining_Group «Manichaean Qoph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_RESH = 74 | Joining_Group «Manichaean Resh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_SADHE = 75 | Joining_Group «Manichaean Sadhe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_SAMEKH = 76 | Joining_Group «Manichaean Samekh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_TAW = 77 | Joining_Group «Manichaean Taw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_TEN = 78 | Joining_Group «Manichaean Ten»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_TETH = 79 | Joining_Group «Manichaean Teth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_THAMEDH = 80 | Joining_Group «Manichaean Thamedh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_TWENTY = 81 | Joining_Group «Manichaean Twenty»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_WAW = 82 | Joining_Group «Manichaean Waw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_YODH = 83 | Joining_Group «Manichaean Yodh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_MANICHAEAN_ZAYIN = 84 | Joining_Group «Manichaean Zayin»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_STRAIGHT_WAW = 85 | Joining_Group «Straight Waw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык. |
IntlChar::JG_COUNT = 105 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::GCB_OTHER = 0 | Прочая точка для границ графем. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_CONTROL = 1 | Управляющая точка. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_CR = 2 | Carriage Return. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_EXTEND = 3 | Продолжение текущей графемы. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_L = 4 | Hangul L. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_LF = 5 | Line Feed. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_LV = 6 | Hangul LV. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_LVT = 7 | Hangul LVT. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_T = 8 | Hangul T. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_V = 9 | Hangul V. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_SPACING_MARK = 10 | Spacing mark графемы. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_PREPEND = 11 | Предшествующий компонент графемы. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_REGIONAL_INDICATOR = 12 | Региональный индикатор; пары могут формировать флаг. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::GCB_COUNT = 18 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::WB_OTHER = 0 | Прочий word-break класс. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_ALETTER = 1 | Алфавитная буква для границ слов. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_FORMAT = 2 | Форматирующий знак. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_KATAKANA = 3 | Катакана. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_MIDLETTER = 4 | Разделитель внутри буквенного контекста. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_MIDNUM = 5 | Разделитель внутри числового контекста. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_NUMERIC = 6 | Числовая точка. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_EXTENDNUMLET = 7 | Связывающий компонент числа/букв. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_CR = 8 | Carriage Return. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_EXTEND = 9 | Продолжающий компонент. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_LF = 10 | Line Feed. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_MIDNUMLET = 11 | Разделитель буквенно-числового контекста. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_NEWLINE = 12 | Новая строка. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_REGIONAL_INDICATOR = 13 | Региональный индикатор. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_HEBREW_LETTER = 14 | Еврейская буква. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_SINGLE_QUOTE = 15 | Одинарная кавычка. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_DOUBLE_QUOTE = 16 | Двойная кавычка. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::WB_COUNT = 23 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::SB_OTHER = 0 | Прочий sentence-break класс. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_ATERM = 1 | Неоднозначный терминатор предложения. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_CLOSE = 2 | Закрывающий знак. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_FORMAT = 3 | Форматирующий знак. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_LOWER = 4 | Строчная буква. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_NUMERIC = 5 | Числовой знак. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_OLETTER = 6 | Прочая буква. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_SEP = 7 | Разделитель. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_SP = 8 | Пробел. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_STERM = 9 | Терминатор предложения. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_UPPER = 10 | Прописная буква. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_CR = 11 | Carriage Return. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_EXTEND = 12 | Продолжающий компонент. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_LF = 13 | Line Feed. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_SCONTINUE = 14 | Продолжение после терминатора. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::SB_COUNT = 15 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::LB_UNKNOWN = 0 | Класс неизвестен. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_AMBIGUOUS = 1 | Неоднозначный класс переноса. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_ALPHABETIC = 2 | Алфавитный класс. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_BREAK_BOTH = 3 | Возможная граница с обеих сторон по алгоритму. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_BREAK_AFTER = 4 | Возможный перенос после. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_BREAK_BEFORE = 5 | Возможный перенос перед. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_MANDATORY_BREAK = 6 | Обязательный разрыв. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_CONTINGENT_BREAK = 7 | Разрыв определяется внешними условиями. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_CLOSE_PUNCTUATION = 8 | Закрывающая пунктуация. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_COMBINING_MARK = 9 | Комбинируемый знак. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_CARRIAGE_RETURN = 10 | Возврат каретки. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_EXCLAMATION = 11 | Восклицательная пунктуация. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_GLUE = 12 | Связывающий неразрывный класс. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_HYPHEN = 13 | Дефис. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_IDEOGRAPHIC = 14 | Идеографический класс. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_INSEPARABLE = 15 | Неразделимый по алгоритму класс. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_INSEPERABLE = 15 | Историческое написание alias INSEPARABLE. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_INFIX_NUMERIC = 16 | Внутренний разделитель числа. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_LINE_FEED = 17 | Перевод строки. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_NONSTARTER = 18 | Знак, с которого нельзя начинать строку по правилам. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_NUMERIC = 19 | Числовой класс. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_OPEN_PUNCTUATION = 20 | Открывающая пунктуация. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_POSTFIX_NUMERIC = 21 | Числовой суффикс. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_PREFIX_NUMERIC = 22 | Числовой префикс. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_QUOTATION = 23 | Кавычка. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_COMPLEX_CONTEXT = 24 | Нужен контекстный анализ письменности. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_SURROGATE = 25 | Surrogate диапазон; не самостоятельный UTF-8 scalar. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_SPACE = 26 | Пробел. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_BREAK_SYMBOLS = 27 | Знак, допускающий указанную границу переноса. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_ZWSPACE = 28 | Zero Width Space. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_NEXT_LINE = 29 | Next Line. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_WORD_JOINER = 30 | Запрет разрыва между соседями. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_H2 = 31 | Hangul слог LV. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_H3 = 32 | Hangul слог LVT. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_JL = 33 | Hangul leading Jamo. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_JT = 34 | Hangul trailing Jamo. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_JV = 35 | Hangul vowel Jamo. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_CLOSE_PARENTHESIS = 36 | Закрывающая скобка. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_CONDITIONAL_JAPANESE_STARTER = 37 | Условное начало строки японского текста. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_HEBREW_LETTER = 38 | Еврейская буква. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_REGIONAL_INDICATOR = 39 | Региональный индикатор. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма. |
IntlChar::LB_COUNT = 48 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::NT_NONE = 0 | Нет числового типа. Значение PROPERTY_NUMERIC_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::NT_DECIMAL = 1 | Десятичная цифра Nd. Значение PROPERTY_NUMERIC_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::NT_DIGIT = 2 | Цифровое значение вне Decimal, например надстрочная цифра. Значение PROPERTY_NUMERIC_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::NT_NUMERIC = 3 | Прочее численное значение, включая дроби и римские числа. Значение PROPERTY_NUMERIC_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::NT_COUNT = 4 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::HST_NOT_APPLICABLE = 0 | Не Hangul роль. Значение PROPERTY_HANGUL_SYLLABLE_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::HST_LEADING_JAMO = 1 | Начальный Jamo L. Значение PROPERTY_HANGUL_SYLLABLE_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::HST_VOWEL_JAMO = 2 | Гласный Jamo V. Значение PROPERTY_HANGUL_SYLLABLE_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::HST_TRAILING_JAMO = 3 | Конечный Jamo T. Значение PROPERTY_HANGUL_SYLLABLE_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::HST_LV_SYLLABLE = 4 | Слог L+V. Значение PROPERTY_HANGUL_SYLLABLE_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::HST_LVT_SYLLABLE = 5 | Слог L+V+T. Значение PROPERTY_HANGUL_SYLLABLE_TYPE, не самостоятельное правило полного алгоритма. |
IntlChar::HST_COUNT = 6 | Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант. |
IntlChar::FOLD_CASE_DEFAULT = 0 | Обычное simple case folding. |
IntlChar::FOLD_CASE_EXCLUDE_SPECIAL_I = 1 | Turkic вариант case folding для I/İ; не определение locale. |
Константы читаются как IntlChar::PROPERTY_SCRIPT без скобок. PROPERTY_* выбирает вопрос; CHAR_CATEGORY_*, BLOCK_CODE_* и другие enum группы описывают ответ. SHORT/LONG_PROPERTY_NAME выбирает форму подписи. COUNT/LIMIT — служебные границы, а не ещё один допустимый вариант. Выше показаны все 666 констант текущего PHP8.5 / ICU77.1 снимка с назначением.
| Семейство | Как использовать |
|---|---|
| PROPERTY_* | Selector для hasBinaryProperty/getIntPropertyValue либо профильного getter. |
| CHAR_CATEGORY / CHAR_DIRECTION / BLOCK_CODE | Результаты категории, направления, блока. |
| BPT / EA / DT / JT / JG / NT / HST | Скобки, ширина, разложение, соединение, числовой тип, роль Hangul. |
| GCB / WB / SB / LB | Классы алгоритмов графем, слов, предложений и переносов; сами по себе не реализуют эти алгоритмы. |
| Имена / FOLD_CASE / границы | Опции lookup/case folding и служебные sentinel значения. |
Имена блоков и joining groups сохранены как стандартные Unicode обозначения. ICU может знать более новые значения, для которых PHP обёртка ещё не экспортирует отдельную константу: используйте getPropertyEnum/getPropertyValueEnum и проверяйте результат. Не считайте COUNT размером плотного списка имён. Некоторые старые aliases остаются для совместимости. Все методы статические: создавать IntlChar объект для каждого символа не нужно.
Практический маршрут: неизвестный знак → ord + charName → charType / нужное property → понятное решение импорта. Для всей строки не используйте $text[$i] как Unicode обход. Выберите разбиение по кодовым точкам или BreakIterator и ограничьте длину входа. Для видимой длины — grapheme_strlen, для нормализации — Normalizer::normalize, для похожих знаков в логинах — Spoofchecker::isSuspicious. Эти операции дополняют друг друга.
Собственные операции: IntlChar::hasBinaryProperty, IntlChar::charAge, IntlChar::charDigitValue, IntlChar::charDirection, IntlChar::charFromName, IntlChar::charMirror, IntlChar::charName, IntlChar::charType, IntlChar::chr, IntlChar::digit, IntlChar::enumCharNames, IntlChar::enumCharTypes, IntlChar::foldCase, IntlChar::forDigit, IntlChar::getBidiPairedBracket, IntlChar::getBlockCode, IntlChar::getCombiningClass, IntlChar::getFC_NFKC_Closure, IntlChar::getIntPropertyMaxValue, IntlChar::getIntPropertyMinValue, IntlChar::getIntPropertyValue, IntlChar::getNumericValue, IntlChar::getPropertyEnum, IntlChar::getPropertyName, IntlChar::getPropertyValueEnum, IntlChar::getPropertyValueName, IntlChar::getUnicodeVersion, IntlChar::isalnum, IntlChar::isalpha, IntlChar::isbase, IntlChar::isblank, IntlChar::iscntrl, IntlChar::isdefined, IntlChar::isdigit, IntlChar::isgraph, IntlChar::isIDIgnorable, IntlChar::isIDPart, IntlChar::isIDStart, IntlChar::isISOControl, IntlChar::isJavaIDPart, IntlChar::isJavaIDStart, IntlChar::isJavaSpaceChar, IntlChar::islower, IntlChar::isMirrored, IntlChar::isprint, IntlChar::ispunct, IntlChar::isspace, IntlChar::istitle, IntlChar::isUAlphabetic, IntlChar::isULowercase, IntlChar::isupper, IntlChar::isUUppercase, IntlChar::isUWhiteSpace, IntlChar::isWhitespace, IntlChar::isxdigit, IntlChar::ord, IntlChar::tolower, IntlChar::totitle, IntlChar::toupper
IntlException: назначение, константы и операции
Исключение для ошибок расширения Intl; наследует обычный Exception.
Класс Родитель: Exception. Интерфейсы: Throwable, Stringable.
Включение intl.use_exceptions переводит многие ICU-ошибки в IntlException. Однако не все случаи зависят только от этой настройки: например, конструктор IntlRuleBasedBreakIterator явно бросает IntlException при неверных правилах. Ошибка типа или недопустимый PHP-аргумент могут быть TypeError/ValueError. Не перехватывайте только IntlException и не считайте все другие ошибки невозможными.
| Унаследованный элемент | Для чего нужен |
|---|---|
| getMessage(), getCode() | Техническое сообщение и код исключения. Не гарантируйте, что getCode каждого конструктора равен ожидаемому UErrorCode: некоторые создают exception с кодом 0. |
| getFile(), getLine(), getTrace(), getTraceAsString() | Диагностика места возникновения для закрытого журнала. |
| getPrevious() | Предыдущее исключение в цепочке при оборачивании ошибки приложения. |
| __construct(message, code, previous), __toString() | Создание/текстовое представление по правилам Exception. Клонирование исключения запрещено. |
<?php
declare(strict_types=1);
$before = ini_set("intl.use_exceptions", "1");
try {
Normalizer::normalize("\xFF");
} catch (IntlException $error) {
echo "conversion failed
";
} finally {
if ($before !== false) { ini_set("intl.use_exceptions", $before); }
}
Ожидаемый результат
conversion failed
finally возвращает настройку, даже если преобразование не удалось.
<?php
declare(strict_types=1);
$before = ini_set("intl.use_exceptions", "0");
try {
new IntlRuleBasedBreakIterator("[");
} catch (IntlException $error) {
echo "rules rejected
";
} finally {
if ($before !== false) { ini_set("intl.use_exceptions", $before); }
}
Ожидаемый результат
rules rejected
Поэтому контракт конкретной операции важнее общей фразы «исключения только при включённой ini».
Собственные операции: Собственных методов нет; используйте унаследованные.
Все глобальные константы Intl: режимы, версии и ошибки
Имена важнее чисел: значения отражают PHP 8.5.11 / ICU 77.1, а в другом окружении зависящие от библиотеки константы могут отличаться. Три разных договора: режим операции, код состояния ICU и битовая маска ошибок IDNA. Их нельзя взаимозаменять. Для кода ICU используйте intl_is_failure; для IDNA errors — побитовую проверку конкретного флага.
Версии, локали и графемы
| Константа и значение стенда | Значение для разработчика |
|---|---|
INTL_MAX_LOCALE_LEN = 156 | Предел длины locale ID в текущей сборке. Проверяйте константу, не копируйте историческое число 80: в PHP 8.5.11/ICU 77.1 здесь 156. |
INTL_ICU_VERSION = 77.1 | Версия библиотеки ICU, определяющей правила Unicode и алгоритмы. |
INTL_ICU_DATA_VERSION = 77.1 | Версия поставленных данных ICU/CLDR; данные локалей могут меняться независимо от вашего текста программы. |
GRAPHEME_EXTR_COUNT = 0 | Единица size у grapheme_extract: число графем. |
GRAPHEME_EXTR_MAXBYTES = 1 | Единица size у grapheme_extract: максимум байтов без разрыва графемы. |
GRAPHEME_EXTR_MAXCHARS = 2 | Единица size у grapheme_extract: максимум кодовых точек без разрыва графемы. |
ULOC_ACTUAL_LOCALE = 0 | Локаль, из которой фактически пришли использованные данные ICU. |
ULOC_VALID_LOCALE = 1 | Наиболее конкретная поддержанная локаль после fallback. |
IDNA: режимы и отдельная маска errors
| Константа и значение стенда | Значение для разработчика |
|---|---|
IDNA_DEFAULT = 48 | Режим IDNA по умолчанию данной ICU. На стенде 77.1 равен 48: NONTRANSITIONAL_TO_ASCII | NONTRANSITIONAL_TO_UNICODE. Старые таблицы могут говорить о transitional default; не переносите их на новую сборку. |
IDNA_ALLOW_UNASSIGNED = 1 | Историческая опция допуска ещё не назначенных точек; UTS46 не использует её как обход собственных правил допустимости. |
IDNA_USE_STD3_RULES = 2 | Дополнительно требовать ASCII-правила STD3 для доменного имени. |
IDNA_CHECK_BIDI = 4 | Проверять правила направления письма BiDi. |
IDNA_CHECK_CONTEXTJ = 8 | Проверять контекстное использование соединительных символов. |
IDNA_NONTRANSITIONAL_TO_ASCII = 16 | Непереходный профиль UTS46 при преобразовании в ASCII; отдельные символы не сводятся по старым переходным соответствиям. |
IDNA_NONTRANSITIONAL_TO_UNICODE = 32 | Непереходный профиль UTS46 при преобразовании в Unicode. |
INTL_IDNA_VARIANT_UTS46 = 1 | Поддерживаемый современный алгоритм доменных имён. В PHP 8.4+ другой variant вызывает ValueError. |
IDNA_ERROR_EMPTY_LABEL = 1 | В errors обнаружена пустая доменная метка. |
IDNA_ERROR_LABEL_TOO_LONG = 2 | Метка превышает допустимую длину. |
IDNA_ERROR_DOMAIN_NAME_TOO_LONG = 4 | Полное имя домена превышает допустимую длину. |
IDNA_ERROR_LEADING_HYPHEN = 8 | Метка начинается дефисом. |
IDNA_ERROR_TRAILING_HYPHEN = 16 | Метка заканчивается дефисом. |
IDNA_ERROR_HYPHEN_3_4 = 32 | Недопустимая последовательность дефисов в третьей и четвёртой позициях. |
IDNA_ERROR_LEADING_COMBINING_MARK = 64 | Метка начинается комбинируемым знаком без основы. |
IDNA_ERROR_DISALLOWED = 128 | Найден символ, запрещённый выбранными правилами. |
IDNA_ERROR_PUNYCODE = 256 | Неверная структура Punycode. |
IDNA_ERROR_LABEL_HAS_DOT = 512 | Точка обнаружена внутри отдельной метки. |
IDNA_ERROR_INVALID_ACE_LABEL = 1024 | Некорректная ASCII-совместимая метка ACE. |
IDNA_ERROR_BIDI = 2048 | Нарушение двунаправленных правил письма. |
IDNA_ERROR_CONTEXTJ = 4096 | Нарушение контекстных правил joiner-символов. |
UErrorCode: статусы ICU и границы диапазонов
| Константа и значение стенда | Значение для разработчика |
|---|---|
U_USING_FALLBACK_WARNING = -128 | Успешный результат получен из запасной локали; это предупреждение, не отказ. |
U_ERROR_WARNING_START = -128 | Начало диапазона; может совпадать с первым реальным статусом. Информационные предупреждения ICU: отрицательные статусы означают успех с замечанием. |
U_USING_DEFAULT_WARNING = -127 | Результат получен из корневых/default данных вместо конкретных запрошенных. |
U_SAFECLONE_ALLOCATED_WARNING = -126 | Для клонирования понадобилось выделение памяти; информационный статус. |
U_STATE_OLD_WARNING = -125 | Использован слой совместимости старого состояния; возможны дополнительные затраты памяти/времени. |
U_STRING_NOT_TERMINATED_WARNING = -124 | Результат поместился, но в низкоуровневом буфере не осталось места для завершающего NUL. |
U_SORT_KEY_TOO_SHORT_WARNING = -123 | Запрошено больше уровней сортировки, чем содержит ключ. |
U_AMBIGUOUS_ALIAS_WARNING = -122 | Имя кодировки/алиас неоднозначно и может обозначать разные реализации конвертера. |
U_DIFFERENT_UCA_VERSION = -121 | Версия UCA не совпала с готовым образом Collator; ICU восстановил его из правил. |
U_ERROR_WARNING_LIMIT = -119 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Информационные предупреждения ICU: отрицательные статусы означают успех с замечанием. |
U_ZERO_ERROR = 0 | Успех без предупреждений. |
U_ILLEGAL_ARGUMENT_ERROR = 1 | Недопустимое значение аргумента операции ICU. |
U_MISSING_RESOURCE_ERROR = 2 | Не найден запрошенный ресурс/пакет данных. |
U_INVALID_FORMAT_ERROR = 3 | Данные не соответствуют ожидаемому формату. |
U_FILE_ACCESS_ERROR = 4 | Нужный файл не найден или недоступен. |
U_INTERNAL_PROGRAM_ERROR = 5 | Внутренняя ошибка библиотеки, а не обычный неверный пользовательский формат. |
U_MESSAGE_PARSE_ERROR = 6 | Не удалось разобрать сообщение/шаблон MessageFormat. |
U_MEMORY_ALLOCATION_ERROR = 7 | Не удалось выделить память. |
U_INDEX_OUTOFBOUNDS_ERROR = 8 | Индекс вне допустимого диапазона. |
U_PARSE_ERROR = 9 | Общая ошибка разбора. |
U_INVALID_CHAR_FOUND = 10 | Неотображаемая последовательность при конверсии или недопустимый символ в другом API. |
U_TRUNCATED_CHAR_FOUND = 11 | Ввод оборвался внутри последовательности кодировки. |
U_ILLEGAL_CHAR_FOUND = 12 | Недопустимая входная последовательность кодировки. |
U_INVALID_TABLE_FORMAT = 13 | Таблица преобразования найдена, но повреждена/имеет неверный формат. |
U_INVALID_TABLE_FILE = 14 | Не найден файл таблицы преобразования. |
U_BUFFER_OVERFLOW_ERROR = 15 | Результат больше предоставленного низкоуровневого буфера; в preflight API может служить способом узнать требуемый размер. |
U_UNSUPPORTED_ERROR = 16 | Операция не поддерживается в данном контексте. |
U_RESOURCE_TYPE_MISMATCH = 17 | Ресурс имеет тип, который не поддерживает запрошенную операцию. |
U_ILLEGAL_ESCAPE_SEQUENCE = 18 | Неверная escape-последовательность ISO-2022. |
U_UNSUPPORTED_ESCAPE_SEQUENCE = 19 | Escape-последовательность ISO-2022 распознана, но не поддерживается. |
U_NO_SPACE_AVAILABLE = 20 | Не хватает места для расширения внутри буфера, например Arabic shaping. |
U_CE_NOT_FOUND_ERROR = 21 | Не найден нужный элемент collation, например при установке variable top. |
U_PRIMARY_TOO_LONG_ERROR = 22 | Первичный вес для variable top слишком длинный для соответствующего API. |
U_STATE_TOO_OLD_ERROR = 23 | Сохранённое состояние настолько старое, что ICU уже не может его использовать. |
U_TOO_MANY_ALIASES_ERROR = 24 | Слишком много переходов по алиасам ресурса; возможен цикл. |
U_ENUM_OUT_OF_SYNC_ERROR = 25 | Перечисление рассинхронизировано с исходной коллекцией. |
U_INVARIANT_CONVERSION_ERROR = 26 | Не удалось преобразование ограниченного invariant-набора символов. |
U_INVALID_STATE_ERROR = 27 | Состояние объекта не допускает запрошенную операцию. |
U_COLLATOR_VERSION_MISMATCH = 28 | Версия Collator несовместима с базовыми данными. |
U_USELESS_COLLATOR_ERROR = 29 | Заданы только опции Collator без необходимой базы. |
U_NO_WRITE_PERMISSION = 30 | Попытка изменить неизменяемые/доступные только для чтения данные. |
U_STANDARD_ERROR_LIMIT = 32 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Общие ошибки ICU. |
U_BAD_VARIABLE_DEFINITION = 65536 | В определении переменной правил нет $ либо имя повторяется. |
U_PARSE_ERROR_START = 65536 | Начало диапазона; может совпадать с первым реальным статусом. Ошибки правил транслитерации. |
U_MALFORMED_RULE = 65537 | Элементы правила стоят в неверном порядке. |
U_MALFORMED_SET = 65538 | Неверная грамматика UnicodeSet. |
U_MALFORMED_SYMBOL_REFERENCE = 65539 | Историческая ошибка ссылки на символ; не используется с ICU 2.4. |
U_MALFORMED_UNICODE_ESCAPE = 65540 | Неверная Unicode escape-последовательность в правиле. |
U_MALFORMED_VARIABLE_DEFINITION = 65541 | Неверное определение переменной правила. |
U_MALFORMED_VARIABLE_REFERENCE = 65542 | Неверная ссылка на переменную правила. |
U_MISMATCHED_SEGMENT_DELIMITERS = 65543 | Историческая ошибка разделителей сегмента; не используется с ICU 2.4. |
U_MISPLACED_ANCHOR_START = 65544 | Начало диапазона; может совпадать с первым реальным статусом. Общий диапазон кодов ICU, включая расширенные семейства. |
U_MISPLACED_CURSOR_OFFSET = 65545 | Смещение курсора стоит в неверном месте. |
U_MISPLACED_QUANTIFIER = 65546 | Квантификатор стоит после неподходящего закрывающего разделителя. |
U_MISSING_OPERATOR = 65547 | В правиле отсутствует оператор. |
U_MISSING_SEGMENT_CLOSE = 65548 | Исторический код незакрытого сегмента; не используется с ICU 2.4. |
U_MULTIPLE_ANTE_CONTEXTS = 65549 | Указано больше одного предваряющего контекста. |
U_MULTIPLE_CURSORS = 65550 | В одном правиле указано несколько курсоров. |
U_MULTIPLE_POST_CONTEXTS = 65551 | Указано больше одного последующего контекста. |
U_TRAILING_BACKSLASH = 65552 | Правило заканчивается одиночным обратным слешем. |
U_UNDEFINED_SEGMENT_REFERENCE = 65553 | Ссылка на сегмент, который не был определён. |
U_UNDEFINED_VARIABLE = 65554 | Ссылка на неопределённую переменную правила. |
U_UNQUOTED_SPECIAL = 65555 | Специальный символ не заключён в кавычки и не экранирован. |
U_UNTERMINATED_QUOTE = 65556 | Не закрыта одинарная кавычка. |
U_RULE_MASK_ERROR = 65557 | Предыдущее более общее правило полностью скрывает последующее. |
U_MISPLACED_COMPOUND_FILTER = 65558 | Составной фильтр находится в неверном месте. |
U_MULTIPLE_COMPOUND_FILTERS = 65559 | Указано несколько составных фильтров. |
U_INVALID_RBT_SYNTAX = 65560 | Ссылка ::id передана парсеру, ожидающему собственно RuleBasedTransliterator-правило. |
U_INVALID_PROPERTY_PATTERN = 65561 | Историческая ошибка шаблона свойства; не используется с ICU 2.4. |
U_MALFORMED_PRAGMA = 65562 | Неверная директива use в правилах. |
U_UNCLOSED_SEGMENT = 65563 | Не закрыта круглая скобка сегмента. |
U_ILLEGAL_CHAR_IN_SEGMENT = 65564 | Исторический код недопустимого символа сегмента; не используется с ICU 2.4. |
U_VARIABLE_RANGE_EXHAUSTED = 65565 | Не хватает зарезервированных служебных символов для переменных правил. |
U_VARIABLE_RANGE_OVERLAP = 65566 | Диапазон служебных символов пересекается с символами самих правил. |
U_ILLEGAL_CHARACTER = 65567 | Специальный символ оказался вне допустимого контекста. |
U_INTERNAL_TRANSLITERATOR_ERROR = 65568 | Внутренняя ошибка системы транслитерации. |
U_INVALID_ID = 65569 | В правиле ::id указан неизвестный транслитератор. |
U_INVALID_FUNCTION = 65570 | В правиле &fn() указан неизвестный транслитератор. |
U_PARSE_ERROR_LIMIT = 65571 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Ошибки правил транслитерации. |
U_UNEXPECTED_TOKEN = 65792 | Неожиданный элемент в шаблоне форматирования. |
U_FMT_PARSE_ERROR_START = 65792 | Начало диапазона; может совпадать с первым реальным статусом. Ошибки форматирования. |
U_MULTIPLE_DECIMAL_SEPARATORS = 65793 | В числовом шаблоне несколько десятичных разделителей. |
U_MULTIPLE_DECIMAL_SEPERATORS = 65793 | Историческое написание-алиас U_MULTIPLE_DECIMAL_SEPARATORS. |
U_MULTIPLE_EXPONENTIAL_SYMBOLS = 65794 | В шаблоне несколько экспоненциальных маркеров. |
U_MALFORMED_EXPONENTIAL_PATTERN = 65795 | Неверный экспоненциальный шаблон, например разделитель группировки в экспоненте. |
U_MULTIPLE_PERCENT_SYMBOLS = 65796 | В шаблоне несколько процентных знаков. |
U_MULTIPLE_PERMILL_SYMBOLS = 65797 | В шаблоне несколько знаков промилле. |
U_MULTIPLE_PAD_SPECIFIERS = 65798 | В шаблоне несколько указаний заполнения. |
U_PATTERN_SYNTAX_ERROR = 65799 | Общая синтаксическая ошибка шаблона форматирования. |
U_ILLEGAL_PAD_POSITION = 65800 | Маркер заполнения стоит в неверном месте числового шаблона. |
U_UNMATCHED_BRACES = 65801 | Не совпадают фигурные скобки шаблона сообщения. |
U_UNSUPPORTED_PROPERTY = 65802 | Исторический неподдерживаемый property; не используется с ICU 2.4. |
U_UNSUPPORTED_ATTRIBUTE = 65803 | Исторический неподдерживаемый attribute; не используется с ICU 2.4. |
U_FMT_PARSE_ERROR_LIMIT = 65825 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Ошибки форматирования. |
U_BRK_INTERNAL_ERROR = 66048 | Внутренняя ошибка анализатора границ. |
U_BRK_ERROR_START = 66048 | Начало диапазона; может совпадать с первым реальным статусом. Ошибки правил границ. |
U_BRK_HEX_DIGITS_EXPECTED = 66049 | В escape правила границ ожидались шестнадцатеричные цифры. |
U_BRK_SEMICOLON_EXPECTED = 66050 | В конце правила границ отсутствует ;. |
U_BRK_RULE_SYNTAX = 66051 | Неверный синтаксис правила границ. |
U_BRK_UNCLOSED_SET = 66052 | Не закрыта квадратная скобка UnicodeSet. |
U_BRK_ASSIGN_ERROR = 66053 | Неверная запись присваивания в RBBI. |
U_BRK_VARIABLE_REDFINITION = 66054 | Переменная RBBI определена повторно. |
U_BRK_MISMATCHED_PAREN = 66055 | Не совпадают круглые скобки RBBI. |
U_BRK_NEW_LINE_IN_QUOTED_STRING = 66056 | Новая строка внутри незавершённой quoted-строки правила. |
U_BRK_UNDEFINED_VARIABLE = 66057 | Использована неопределённая переменная RBBI. |
U_BRK_INIT_ERROR = 66058 | Не удалось создать анализатор, возможно отсутствуют данные ICU. |
U_BRK_RULE_EMPTY_SET = 66059 | Правило содержит пустой набор UnicodeSet. |
U_BRK_UNRECOGNIZED_OPTION = 66060 | Неизвестная опция правил RBBI. |
U_BRK_MALFORMED_RULE_TAG = 66061 | Неверная числовая метка {nnn} правила. |
U_BRK_ERROR_LIMIT = 66062 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Ошибки правил границ. |
U_REGEX_INTERNAL_ERROR = 66304 | Внутренняя ошибка ICU regex; это не код PCRE preg_last_error. |
U_REGEX_ERROR_START = 66304 | Начало диапазона; может совпадать с первым реальным статусом. Ошибки ICU regex. |
U_REGEX_RULE_SYNTAX = 66305 | Синтаксическая ошибка ICU regex. |
U_REGEX_INVALID_STATE = 66306 | RegexMatcher находится в неподходящем состоянии. |
U_REGEX_BAD_ESCAPE_SEQUENCE = 66307 | Неизвестная escape-последовательность ICU regex. |
U_REGEX_PROPERTY_SYNTAX = 66308 | Неверная запись Unicode property в regex. |
U_REGEX_UNIMPLEMENTED = 66309 | Использована ещё не реализованная возможность ICU regex. |
U_REGEX_MISMATCHED_PAREN = 66310 | Неверная вложенность круглых скобок regex. |
U_REGEX_NUMBER_TOO_BIG = 66311 | Число в regex выходит за поддерживаемый диапазон. |
U_REGEX_BAD_INTERVAL = 66312 | Неверный интервал повторений {min,max}. |
U_REGEX_MAX_LT_MIN = 66313 | Максимум повторений меньше минимума. |
U_REGEX_INVALID_BACK_REF = 66314 | Ссылка на несуществующую захватывающую группу. |
U_REGEX_INVALID_FLAG = 66315 | Неверные флаги режима regex. |
U_REGEX_LOOK_BEHIND_LIMIT = 66316 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Общий диапазон кодов ICU, включая расширенные семейства. |
U_REGEX_SET_CONTAINS_STRING = 66317 | Набор UnicodeSet в regex содержит неподдерживаемую строку. |
U_REGEX_ERROR_LIMIT = 66326 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Ошибки ICU regex. |
U_IDNA_PROHIBITED_ERROR = 66560 | Исторический IDNA/Stringprep: запрещённая кодовая точка. |
U_IDNA_ERROR_START = 66560 | Начало диапазона; может совпадать с первым реальным статусом. Исторические статусы IDNA/Stringprep, отличные от современной битовой маски IDNA_ERROR_*. |
U_IDNA_UNASSIGNED_ERROR = 66561 | Исторический IDNA/Stringprep: ещё не назначенная точка. |
U_IDNA_CHECK_BIDI_ERROR = 66562 | Исторический IDNA/Stringprep: нарушение BiDi. |
U_IDNA_STD3_ASCII_RULES_ERROR = 66563 | Нарушение ASCII-правил STD3 в старом IDNA API. |
U_IDNA_ACE_PREFIX_ERROR = 66564 | Неверный ACE-префикс старого IDNA API. |
U_IDNA_VERIFICATION_ERROR = 66565 | Неудача проверки обратного преобразования старого IDNA API. |
U_IDNA_LABEL_TOO_LONG_ERROR = 66566 | Слишком длинная метка в старом IDNA API. |
U_IDNA_ZERO_LENGTH_LABEL_ERROR = 66567 | Пустая метка в старом IDNA API. |
U_IDNA_DOMAIN_NAME_TOO_LONG_ERROR = 66568 | Слишком длинное имя домена в старом IDNA API. |
U_IDNA_ERROR_LIMIT = 66569 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Исторические статусы IDNA/Stringprep, отличные от современной битовой маски IDNA_ERROR_*. |
U_STRINGPREP_PROHIBITED_ERROR = 66560 | Алиас U_IDNA_PROHIBITED_ERROR. |
U_STRINGPREP_UNASSIGNED_ERROR = 66561 | Алиас U_IDNA_UNASSIGNED_ERROR. |
U_STRINGPREP_CHECK_BIDI_ERROR = 66562 | Алиас U_IDNA_CHECK_BIDI_ERROR. |
U_ERROR_LIMIT = 66818 | Верхняя служебная граница диапазона, сама не является обычной ошибкой. Общий диапазон кодов ICU, включая расширенные семейства. |
Историческая INTL_IDNA_VARIANT_2003 отсутствует в текущем runtime. Она была deprecated с PHP 7.2; сегодня выбирайте UTS46. Не объявляйте её вручную, чтобы обойти несовместимость. Историческая документация также указывает limit locale 80 и transitional default; текущие значения выше получены из установленной ICU, поэтому справочник явно показывает разницу.
Домен в Unicode и ASCII: куда относится IDNA
Читатель видит bücher.example, а система может ожидать xn--bcher-kva.example. idn_to_ascii и idn_to_utf8 преобразуют именно имя домена. URL содержит также схему, порт, путь, query; их нельзя целиком передать в IDNA. После преобразования отдельно проверяются допустимость адреса вашей интеграцией и ограничения сетевого доступа.
| Данные | Операция |
|---|---|
| UTF-8 домен → ASCII | idn_to_ascii с явным профилем и idna_info. |
| ASCII ACE → понятное отображение | idn_to_utf8; успешное преобразование не гарантирует отсутствие визуальной подмены. |
| errors из idna_info | Битовая маска IDNA_ERROR_*. Это не UErrorCode для intl_is_failure. |
| Международное имя пользователя | Это вообще не доменное имя. Нужны правила продукта, нормализация, возможно Spoofchecker; не применяйте IDNA ко всем строкам. |
Ошибки, единицы измерения и воспроизводимость результата
| Граница | Что проверять |
|---|---|
| UTF-8 на входе | Не исправляйте неизвестный мусор заменой каждого байта. Сначала выясните кодировку, при необходимости примените UConverter; затем нормализацию. Нормализация не декодирует случайный Windows-1251. |
| Технический отказ | Строго проверяйте false/null по договору метода; 0, пустая строка и отрицательное сравнение могут быть корректными результатами. Считывайте диагностику сразу. |
| Глобальный статус/объект | intl_get_error_code/message полезны фабрикам и статическим операциям; для конкретного объекта читайте его getErrorCode/getErrorMessage. |
| Предупреждение ICU | Отрицательный UErrorCode часто означает рабочий fallback, а не отказ; intl_is_failure различает. Приложение отдельно решает, допустим ли fallback. |
| Позиция строки | IntlBreakIterator: байты UTF-8; grapheme_substr: графемы; offsets парсинга форматтеров и Transliterator: единицы UTF-16. Одна и та же кириллическая строка имеет разные числа в этих системах. |
| Время | IntlCalendar и IntlTimeZone::getOffset используют миллисекунды; Unix timestamp в PHP обычно секунды. Для одного и того же момента ошибочная единица даёт совсем другую дату. |
| Числа и деньги | NumberFormatter занимается представлением/разбором, не точной денежной арифметикой. Для сумм храните целые минимальные единицы или десятичную модель с явной точностью. |
| Версия ICU | Пробелы, валютные символы, сортировка, словари и Unicode-данные меняются. Сохраняйте окружение вместе с чувствительными snapshot/ключами; перестраивайте sort keys после соответствующей миграции. |
Последовательность надёжной интеграции: понять формат поставщика → ограничить размер входа → проверить кодировку и структуру → получить смысловые значения → применить правила продукта → оформить для выбранного читателя. Intl решает языковые операции в середине этой цепочки; авторизация, HTML-экранирование, SQL-параметры и бизнес-проверки остаются отдельными шагами.
Какие операции могут быть дорогими
| Расход | Практическое решение |
|---|---|
| Создание форматтеров/анализаторов в цикле | Для пачки однотипных значений создайте настроенный объект один раз и используйте повторно. Если меняете свойства, не разделяйте такое состояние между независимыми задачами. |
| Нормализация/транслитерация длинного текста | Они обходят текст и создают результат. Не повторяйте одну и ту же конверсию на каждом поле шаблона; храните согласованную форму по правилам данных. |
| Сортировка каталога | compare вызывается много раз. Sort keys могут помочь повторным сравнениям, но занимают память и зависят от настроек/ICU. |
| Графемное расстояние | grapheme_levenshtein требует существенно больше работы, чем сравнение равенства. Ограничивайте длину и число кандидатов перед нечётким поиском. |
| Обход всего Unicode | IntlChar::enumCharNames/enumCharTypes работают по диапазону. Не запускайте полный диапазон на каждый запрос формы; используйте точечную проверку нужных кодовых точек. |
| Материализация итератора | iterator_to_array удерживает весь набор; потоковый foreach уместнее для больших перечислений. Не вкладывайте два обхода одного изменяемого IntlIterator. |
Сначала измеряйте свой объём и результат, затем оптимизируйте. Нельзя обещать одинаковую скорость для ICU разных версий и разных языков. Повторное использование объектов не означает бесконтрольный глобальный singleton с постоянно меняющейся locale.
Вопросы из практики и разобранные решения
Обсуждения ниже дали реальные ситуации, в которых синтаксиса функции недостаточно. Ответы разных лет не являются нормативным источником: контракты сверены с PHP Manual, текущим PHP и ICU; учебные примеры написаны отдельно.
| Обсуждение | Что разбирать |
|---|---|
| Stack Overflow: 69669207 | Денежная строка выглядит привычно, но не разбирается. Разбираем направление parse/format, выходной параметр currency и значимые Unicode-пробелы. NumberFormatter::parseCurrency |
| Stack Overflow: 52207262 | Один и тот же PHP-код форматирует число по-разному на серверах. Разбираем отдельные версии ICU и CLDR, а не ищем причину только в setlocale. NumberFormatter::getPattern |
| Stack Overflow: 45916540 | Совместимые декоративные символы нужно превратить в обычные. Различаем каноническую NFC и потенциально меняющую смысл NFKC. Normalizer::normalize |
| Stack Overflow: 74743369 | Буква с тильдой может быть одной точкой или буквой плюс отдельным знаком. Сначала определяем нужный уровень Unicode, затем выбираем нормализацию/свойства. IntlChar::hasBinaryProperty |
| Stack Overflow: 70669461 | Часть старой интеграции требует ISO-8859-1, а приложение работает в UTF-8. Показываем явную границу кодировки, проверку результата и заголовок как отдельный договор HTTP. UConverter::transcode |
| Stack Overflow: 79141357 | Файл ошибочно декодирован и между буквами появляются replacement characters. Объясняем, почему нужно знать исходную кодировку и почему повторная перекодировка уже повреждённой строки не восстанавливает потерянные байты. UConverter::convert |
| Stack Overflow: 2955251 | Из заголовка нужен URL-slug, но транслитерация сама не решает коллизии, пустой результат и уникальность. Пример сохраняет исходное название и добавляет стабильный ID при совпадении slug. Transliterator::transliterate |
| Stack Overflow: 67571235 | Готовое преобразование меняет знак, который интеграция должна сохранить. Разбираем собственные правила, allowlist и обратимость вместо цепочки случайных str_replace. Transliterator::createFromRules |
Полный указатель Intl: классы, методы и процедурные формы
Сначала выберите класс по назначению. В таблице перечислены все собственные методы, включая фабрики и служебные операции; унаследованные методы связаны через родительский класс. Ниже отдельно перечислены все процедурные функции текущего расширения — пары методов и самостоятельные операции.
Функции и методы этой темы
Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.
Collator::__constructПодготовить сортировку имён/названий, которую ожидает читатель выбранного языка.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::__construct(string $locale)| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Строка вроде ru_RU или en_US выбирает языковые правила. Пустая строка использует default, root — общее Unicode Collation Algorithm без конкретной языковой настройки. Явная локаль делает намерение приложения понятнее. |
| Объект | new создаёт Collator с начальными настройками локали; затем compare/sort используют этот же набор правил. Ошибка создания отражается диагностикой Intl; для проверяемого null используйте Collator::create. |
| Когда нужен | Обычный strcmp/sort сравнивает байты или общие значения, а не культурный порядок букв. Выбор локали влияет и на порядок, и на стоимость/размер sort keys. |
Начинаем с задачи и одного вызова
Поставщик прислал Banana, Apple, Cherry в случайном порядке. В списке покупателя хотим Apple, Banana, Cherry. Collator хранит правила выбранного языка и применяет их к названиям.
| Запись в примере | Что именно происходит |
|---|---|
| new Collator("en_US") | Готовит объект с английскими правилами США. Сам ещё не меняет список. |
| Collator::create("en_US") | Фабрика для той же задачи; при неудаче может вернуть null. |
| $collator->sort($names) | Передаёт массив имён по ссылке: порядок меняется внутри names. |
| implode(" → ", $names) | Склеивает готовый список в видимую строку; стрелки здесь только разделители показа. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$names = ["Banana", "Apple", "Cherry"];
$collator->sort($names);
echo implode(" → ", $names), "
";
Ожидаемый результат
Apple → Banana → Cherry
Результат не возвращается новым массивом: список names уже изменён. Его можно вывести в select или карточках товаров.
<?php
declare(strict_types=1);
$german = new Collator("de_DE");
$swedish = new Collator("sv_SE");
$germanNames = ["z", "ä", "a"];
$swedishNames = $germanNames;
$german->sort($germanNames);
$swedish->sort($swedishNames);
echo "Немецкий: ", implode(", ", $germanNames), "
";
echo "Шведский: ", implode(", ", $swedishNames), "
";
Ожидаемый результат
Немецкий: a, ä, z
Шведский: a, z, ä
В шведских правилах ä идёт после z. Это причина пользоваться языковым сравнением, а не пытаться угадать порядок кодов UTF-8.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
echo $collator->compare("Apple", "Banana") < 0 ? "Apple first\n" : "other order\n";
Ожидаемый результат
Apple first
new выбирает инструмент один раз; стрелка -> вызывает его операцию с двумя строками.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$names = ["Banana", "Apple", "Cherry"];
$collator->sort($names);
echo implode(",", $names), "\n";
Ожидаемый результат
Apple,Banana,Cherry
Сортировка меняет переданный массив; возвращает bool, а не новый список.
Рядом по задаче: Collator::create, Collator::sort.
Collator::createСоздать объект через фабрику и обработать отсутствие результата до сортировки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Collator::create(string $locale): ?Collator| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Строка вроде ru_RU или en_US выбирает языковые правила. Пустая строка использует default, root — общее Unicode Collation Algorithm без конкретной языковой настройки. Явная локаль делает намерение приложения понятнее. |
| Возврат | Collator либо null при ошибке. collator_create — процедурная фабрика с теми же аргументами; это не операция над существующим объектом. |
Начинаем с задачи и одного вызова
Поставщик прислал Banana, Apple, Cherry в случайном порядке. В списке покупателя хотим Apple, Banana, Cherry. Collator хранит правила выбранного языка и применяет их к названиям.
| Запись в примере | Что именно происходит |
|---|---|
| new Collator("en_US") | Готовит объект с английскими правилами США. Сам ещё не меняет список. |
| Collator::create("en_US") | Фабрика для той же задачи; при неудаче может вернуть null. |
| $collator->sort($names) | Передаёт массив имён по ссылке: порядок меняется внутри names. |
| implode(" → ", $names) | Склеивает готовый список в видимую строку; стрелки здесь только разделители показа. |
<?php
declare(strict_types=1);
$collator = Collator::create("en_US");
$names = ["Banana", "Apple", "Cherry"];
$collator->sort($names);
echo implode(" → ", $names), "
";
Ожидаемый результат
Apple → Banana → Cherry
Результат не возвращается новым массивом: список names уже изменён. Его можно вывести в select или карточках товаров.
<?php
declare(strict_types=1);
$german = new Collator("de_DE");
$swedish = new Collator("sv_SE");
$germanNames = ["z", "ä", "a"];
$swedishNames = $germanNames;
$german->sort($germanNames);
$swedish->sort($swedishNames);
echo "Немецкий: ", implode(", ", $germanNames), "
";
echo "Шведский: ", implode(", ", $swedishNames), "
";
Ожидаемый результат
Немецкий: a, ä, z
Шведский: a, z, ä
В шведских правилах ä идёт после z. Это причина пользоваться языковым сравнением, а не пытаться угадать порядок кодов UTF-8.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = Collator::create("en_US");
echo $collator instanceof Collator ? "ready\n" : "failed\n";
Ожидаемый результат
ready
Проверка instanceof понятна и защищает следующий вызов метода.
<?php
declare(strict_types=1);
$collator = collator_create("en_US");
if ($collator === null) { throw new RuntimeException(intl_get_error_message()); }
echo collator_compare($collator, "A", "B") < 0 ? "A first\n" : "other\n";
Ожидаемый результат
A first
Процедурный стиль тоже использует объект состояния; просто передаёт его в скобках.
Тот же механизм в процедурной форме: collator_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::__construct, intl_get_error_message.
collator_createСоздать объект через фабрику и обработать отсутствие результата до сортировки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_create(string $locale): ?CollatorПроцедурная форма Collator::create. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Строка вроде ru_RU или en_US выбирает языковые правила. Пустая строка использует default, root — общее Unicode Collation Algorithm без конкретной языковой настройки. Явная локаль делает намерение приложения понятнее. |
| Возврат | Collator либо null при ошибке. collator_create — процедурная фабрика с теми же аргументами; это не операция над существующим объектом. |
Начинаем с задачи и одного вызова
Поставщик прислал Banana, Apple, Cherry в случайном порядке. В списке покупателя хотим Apple, Banana, Cherry. Collator хранит правила выбранного языка и применяет их к названиям.
| Запись в примере | Что именно происходит |
|---|---|
| new Collator("en_US") | Готовит объект с английскими правилами США. Сам ещё не меняет список. |
| Collator::create("en_US") | Фабрика для той же задачи; при неудаче может вернуть null. |
| $collator->sort($names) | Передаёт массив имён по ссылке: порядок меняется внутри names. |
| implode(" → ", $names) | Склеивает готовый список в видимую строку; стрелки здесь только разделители показа. |
<?php
declare(strict_types=1);
$collator = Collator::create("en_US");
$names = ["Banana", "Apple", "Cherry"];
$collator->sort($names);
echo implode(" → ", $names), "
";
Ожидаемый результат
Apple → Banana → Cherry
Результат не возвращается новым массивом: список names уже изменён. Его можно вывести в select или карточках товаров.
<?php
declare(strict_types=1);
$german = new Collator("de_DE");
$swedish = new Collator("sv_SE");
$germanNames = ["z", "ä", "a"];
$swedishNames = $germanNames;
$german->sort($germanNames);
$swedish->sort($swedishNames);
echo "Немецкий: ", implode(", ", $germanNames), "
";
echo "Шведский: ", implode(", ", $swedishNames), "
";
Ожидаемый результат
Немецкий: a, ä, z
Шведский: a, z, ä
В шведских правилах ä идёт после z. Это причина пользоваться языковым сравнением, а не пытаться угадать порядок кодов UTF-8.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = Collator::create("en_US");
echo $collator instanceof Collator ? "ready\n" : "failed\n";
Ожидаемый результат
ready
Проверка instanceof понятна и защищает следующий вызов метода.
<?php
declare(strict_types=1);
$collator = collator_create("en_US");
if ($collator === null) { throw new RuntimeException(intl_get_error_message()); }
echo collator_compare($collator, "A", "B") < 0 ? "A first\n" : "other\n";
Ожидаемый результат
A first
Процедурный стиль тоже использует объект состояния; просто передаёт его в скобках.
Тот же механизм в процедурной форме: collator_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::__construct, intl_get_error_message.
Collator::compareСравнить два названия по языковым правилам, не меняя сами строки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::compare(string $string1, string $string2): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| string1,string2 | Две UTF-8 строки; сравнение следует locale, strength и attributes текущего Collator. |
| Возврат | Отрицательное int — первая раньше,0 — равны по выбранным правилам, положительное — позже; false при ошибке. Всегда отделяйте ===false от 0. Равенство при PRIMARY не означает совпадение байтов. |
Начинаем с задачи и одного вызова
Иногда нужно сравнить только две строки: например, решить, в каком порядке показать два названия, или сопоставить поисковый запрос с названием.
| Запись в примере | Что именно происходит |
|---|---|
| compare("Apple", "Banana") | Принимает две строки и возвращает знак отношения. |
| $order < 0 | Первая строка раньше второй. Значение не обязано быть ровно -1. |
| $order === 0 | Строки равны по выбранным правилам, это не ошибка и не обязательно совпадение байтов. |
| $order === false | Отдельный отказ операции; перед обработкой внешнего текста его нужно отделить от нуля. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("Apple", "Banana");
if ($order < 0) { echo "Сначала Apple, затем Banana.
"; }
Ожидаемый результат
Сначала Apple, затем Banana.
Метод не меняет строки, он сообщает отношение между ними.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
$query = "CAFE";
$productName = "café";
if ($collator->compare($query, $productName) === 0) {
echo "Найден товар: ", $productName, "
";
}
Ожидаемый результат
Найден товар: café
Вход пользователя CAFE совпал по выбранным поисковым правилам, но оригинальное название café сохранилось для показа. Такой режим нельзя переносить на пароли или подписи.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
echo $collator->compare("Apple", "Banana") < 0 ? "before\n" : "after\n";
var_dump($collator->compare("Apple", "Apple"));
Ожидаемый результат
before
int(0)
Нулевой результат — нормальное равенство, не отказ.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
var_dump(collator_compare($collator, "café", "CAFE"));
Ожидаемый результат
int(0)
Это полезно для поиска по понятным названиям, но опасно как правило уникальности логина без явно выбранной политики.
Тот же механизм в процедурной форме: collator_compare. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::setStrength, Collator::getSortKey.
collator_compareСравнить два названия по языковым правилам, не меняя сами строки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_compare(Collator $object, string $string1, string $string2): int|falseПроцедурная форма Collator::compare. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string1,string2 | Две UTF-8 строки; сравнение следует locale, strength и attributes текущего Collator. |
| Возврат | Отрицательное int — первая раньше,0 — равны по выбранным правилам, положительное — позже; false при ошибке. Всегда отделяйте ===false от 0. Равенство при PRIMARY не означает совпадение байтов. |
Начинаем с задачи и одного вызова
Иногда нужно сравнить только две строки: например, решить, в каком порядке показать два названия, или сопоставить поисковый запрос с названием.
| Запись в примере | Что именно происходит |
|---|---|
| compare("Apple", "Banana") | Принимает две строки и возвращает знак отношения. |
| $order < 0 | Первая строка раньше второй. Значение не обязано быть ровно -1. |
| $order === 0 | Строки равны по выбранным правилам, это не ошибка и не обязательно совпадение байтов. |
| $order === false | Отдельный отказ операции; перед обработкой внешнего текста его нужно отделить от нуля. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("Apple", "Banana");
if ($order < 0) { echo "Сначала Apple, затем Banana.
"; }
Ожидаемый результат
Сначала Apple, затем Banana.
Метод не меняет строки, он сообщает отношение между ними.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
$query = "CAFE";
$productName = "café";
if ($collator->compare($query, $productName) === 0) {
echo "Найден товар: ", $productName, "
";
}
Ожидаемый результат
Найден товар: café
Вход пользователя CAFE совпал по выбранным поисковым правилам, но оригинальное название café сохранилось для показа. Такой режим нельзя переносить на пароли или подписи.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
echo $collator->compare("Apple", "Banana") < 0 ? "before\n" : "after\n";
var_dump($collator->compare("Apple", "Apple"));
Ожидаемый результат
before
int(0)
Нулевой результат — нормальное равенство, не отказ.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
var_dump(collator_compare($collator, "café", "CAFE"));
Ожидаемый результат
int(0)
Это полезно для поиска по понятным названиям, но опасно как правило уникальности логина без явно выбранной политики.
Тот же механизм в процедурной форме: collator_compare. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::setStrength, Collator::getSortKey.
Collator::sortУпорядочить список для интерфейса по языковому порядку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::sort(array &$array, int $flags = Collator::SORT_REGULAR): bool| Аргумент или результат | Что означает на практике |
|---|---|
| array | Массив передаётся по ссылке и меняется на месте. sort сбрасывает числовые/строковые ключи и переиндексирует список; asort сохраняет связь ключа с названием. |
| flags | flags: SORT_REGULAR(default) учитывает типы как обычное сравнение, SORT_STRING трактует значения строками, SORT_NUMERIC числами; для однородного списка названий явно SORT_STRING. |
| Возврат | bool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов. |
Начинаем с задачи и одного вызова
Нужно вывести список товаров по алфавиту. Получим конкретный порядок, который увидит покупатель.
| Запись в примере | Что именно происходит |
|---|---|
| $names / $products | Исходный массив. Операция меняет его на месте. |
| sort / sortWithSortKeys | Переиндексируют список с нуля; прежние ID нельзя считать сохранёнными. |
| asort | Сохраняет связь ключ → значение; подходит, когда ключ является ID товара. |
| Возвращаемый bool | Сообщает успех; список находится в переданном массиве, а не в этом bool. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$names = ["Banana", "Apple", "Cherry"];
echo "Получено: ", implode(", ", $names), "
";
$collator->sort($names, Collator::SORT_STRING);
echo "На странице: ", implode(", ", $names), "
";
Ожидаемый результат
Получено: Banana, Apple, Cherry
На странице: Apple, Banana, Cherry
Строки не потеряны и не переведены: изменился только порядок вывода.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$products = [20 => "Banana", 10 => "Apple"];
$collator->sort($products, Collator::SORT_STRING);
foreach ($products as $id => $name) {
echo "ID ", $id, ": ", $name, "
";
}
Ожидаемый результат
ID 0: Apple
ID 1: Banana
Полученные 0 и 1 — новые позиции, а не исходные ID 10 и 20. Для массива «ID → название» выбирайте asort, иначе ссылка может открыть чужой товар.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$shelves = ["Shelf10", "Shelf2", "Shelf1"];
$collator->sort($shelves, Collator::SORT_STRING);
echo "Порядок обхода: ", implode(" → ", $shelves), "
";
Ожидаемый результат
Порядок обхода: Shelf1 → Shelf2 → Shelf10
NUMERIC_COLLATION учитывает последовательности цифр внутри текста. Это не SORT_NUMERIC, который сравнивал бы целые значения как числа. Для sortWithSortKeys дополнительно расходуется память на ключи сортировки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$items = [20 => "Banana", 10 => "Apple"];
$collator->sort($items, Collator::SORT_STRING);
echo implode(",", $items), "\n";
echo implode(",", array_keys($items)), "\n";
Ожидаемый результат
Apple,Banana
0,1
Если ключи являются ID товаров, выбор asort является частью корректности, а не оформления.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$items = ["Item10", "Item2", "Item1"];
collator_sort($collator, $items, Collator::SORT_STRING);
echo implode(",", $items), "\n";
Ожидаемый результат
Item1,Item2,Item10
NUMERIC_COLLATION сравнивает последовательности цифр как числовые части текста, а SORT_NUMERIC означал бы преобразование всего значения в число.
Тот же механизм в процедурной форме: collator_sort. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::setAttribute, Collator::getSortKey.
collator_sortУпорядочить список для интерфейса по языковому порядку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_sort(Collator $object, array &$array, int $flags = Collator::SORT_REGULAR): boolПроцедурная форма Collator::sort. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| array | Массив передаётся по ссылке и меняется на месте. sort сбрасывает числовые/строковые ключи и переиндексирует список; asort сохраняет связь ключа с названием. |
| flags | flags: SORT_REGULAR(default) учитывает типы как обычное сравнение, SORT_STRING трактует значения строками, SORT_NUMERIC числами; для однородного списка названий явно SORT_STRING. |
| Возврат | bool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов. |
Начинаем с задачи и одного вызова
Нужно вывести список товаров по алфавиту. Получим конкретный порядок, который увидит покупатель.
| Запись в примере | Что именно происходит |
|---|---|
| $names / $products | Исходный массив. Операция меняет его на месте. |
| sort / sortWithSortKeys | Переиндексируют список с нуля; прежние ID нельзя считать сохранёнными. |
| asort | Сохраняет связь ключ → значение; подходит, когда ключ является ID товара. |
| Возвращаемый bool | Сообщает успех; список находится в переданном массиве, а не в этом bool. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$names = ["Banana", "Apple", "Cherry"];
echo "Получено: ", implode(", ", $names), "
";
$collator->sort($names, Collator::SORT_STRING);
echo "На странице: ", implode(", ", $names), "
";
Ожидаемый результат
Получено: Banana, Apple, Cherry
На странице: Apple, Banana, Cherry
Строки не потеряны и не переведены: изменился только порядок вывода.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$products = [20 => "Banana", 10 => "Apple"];
$collator->sort($products, Collator::SORT_STRING);
foreach ($products as $id => $name) {
echo "ID ", $id, ": ", $name, "
";
}
Ожидаемый результат
ID 0: Apple
ID 1: Banana
Полученные 0 и 1 — новые позиции, а не исходные ID 10 и 20. Для массива «ID → название» выбирайте asort, иначе ссылка может открыть чужой товар.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$shelves = ["Shelf10", "Shelf2", "Shelf1"];
$collator->sort($shelves, Collator::SORT_STRING);
echo "Порядок обхода: ", implode(" → ", $shelves), "
";
Ожидаемый результат
Порядок обхода: Shelf1 → Shelf2 → Shelf10
NUMERIC_COLLATION учитывает последовательности цифр внутри текста. Это не SORT_NUMERIC, который сравнивал бы целые значения как числа. Для sortWithSortKeys дополнительно расходуется память на ключи сортировки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$items = [20 => "Banana", 10 => "Apple"];
$collator->sort($items, Collator::SORT_STRING);
echo implode(",", $items), "\n";
echo implode(",", array_keys($items)), "\n";
Ожидаемый результат
Apple,Banana
0,1
Если ключи являются ID товаров, выбор asort является частью корректности, а не оформления.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$items = ["Item10", "Item2", "Item1"];
collator_sort($collator, $items, Collator::SORT_STRING);
echo implode(",", $items), "\n";
Ожидаемый результат
Item1,Item2,Item10
NUMERIC_COLLATION сравнивает последовательности цифр как числовые части текста, а SORT_NUMERIC означал бы преобразование всего значения в число.
Тот же механизм в процедурной форме: collator_sort. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::setAttribute, Collator::getSortKey.
Collator::asortУпорядочить список для интерфейса и сохранить ID каждого элемента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::asort(array &$array, int $flags = Collator::SORT_REGULAR): bool| Аргумент или результат | Что означает на практике |
|---|---|
| array | Массив передаётся по ссылке и меняется на месте. sort сбрасывает числовые/строковые ключи и переиндексирует список; asort сохраняет связь ключа с названием. |
| flags | flags: SORT_REGULAR(default) учитывает типы как обычное сравнение, SORT_STRING трактует значения строками, SORT_NUMERIC числами; для однородного списка названий явно SORT_STRING. |
| Возврат | bool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов. |
Начинаем с задачи и одного вызова
Нужно вывести список товаров по алфавиту и сохранить ID, по которым строятся ссылки на карточки.
| Запись в примере | Что именно происходит |
|---|---|
| $names / $products | Исходный массив. Операция меняет его на месте. |
| sort / sortWithSortKeys | Переиндексируют список с нуля; прежние ID нельзя считать сохранёнными. |
| asort | Сохраняет связь ключ → значение; подходит, когда ключ является ID товара. |
| Возвращаемый bool | Сообщает успех; список находится в переданном массиве, а не в этом bool. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$names = ["Banana", "Apple", "Cherry"];
echo "Получено: ", implode(", ", $names), "
";
$collator->asort($names, Collator::SORT_STRING);
echo "На странице: ", implode(", ", $names), "
";
Ожидаемый результат
Получено: Banana, Apple, Cherry
На странице: Apple, Banana, Cherry
Строки не потеряны и не переведены: изменился только порядок вывода.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$products = [20 => "Banana", 10 => "Apple"];
$collator->asort($products, Collator::SORT_STRING);
foreach ($products as $id => $name) {
echo "ID ", $id, ": ", $name, "
";
}
Ожидаемый результат
ID 10: Apple
ID 20: Banana
Здесь ключи остаются настоящими ID: сортировка не ломает ссылки на товары.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$shelves = ["Shelf10", "Shelf2", "Shelf1"];
$collator->asort($shelves, Collator::SORT_STRING);
echo "Порядок обхода: ", implode(" → ", $shelves), "
";
Ожидаемый результат
Порядок обхода: Shelf1 → Shelf2 → Shelf10
NUMERIC_COLLATION учитывает последовательности цифр внутри текста. Это не SORT_NUMERIC, который сравнивал бы целые значения как числа. Для sortWithSortKeys дополнительно расходуется память на ключи сортировки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$items = [20 => "Banana", 10 => "Apple"];
$collator->asort($items, Collator::SORT_STRING);
echo implode(",", $items), "\n";
echo implode(",", array_keys($items)), "\n";
Ожидаемый результат
Apple,Banana
10,20
Если ключи являются ID товаров, выбор asort является частью корректности, а не оформления.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$items = ["Item10", "Item2", "Item1"];
collator_asort($collator, $items, Collator::SORT_STRING);
echo implode(",", $items), "\n";
Ожидаемый результат
Item1,Item2,Item10
NUMERIC_COLLATION сравнивает последовательности цифр как числовые части текста, а SORT_NUMERIC означал бы преобразование всего значения в число.
Тот же механизм в процедурной форме: collator_asort. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::setAttribute, Collator::getSortKey.
collator_asortУпорядочить список для интерфейса и сохранить ID каждого элемента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_asort(Collator $object, array &$array, int $flags = Collator::SORT_REGULAR): boolПроцедурная форма Collator::asort. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| array | Массив передаётся по ссылке и меняется на месте. sort сбрасывает числовые/строковые ключи и переиндексирует список; asort сохраняет связь ключа с названием. |
| flags | flags: SORT_REGULAR(default) учитывает типы как обычное сравнение, SORT_STRING трактует значения строками, SORT_NUMERIC числами; для однородного списка названий явно SORT_STRING. |
| Возврат | bool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов. |
Начинаем с задачи и одного вызова
Нужно вывести список товаров по алфавиту и сохранить ID, по которым строятся ссылки на карточки.
| Запись в примере | Что именно происходит |
|---|---|
| $names / $products | Исходный массив. Операция меняет его на месте. |
| sort / sortWithSortKeys | Переиндексируют список с нуля; прежние ID нельзя считать сохранёнными. |
| asort | Сохраняет связь ключ → значение; подходит, когда ключ является ID товара. |
| Возвращаемый bool | Сообщает успех; список находится в переданном массиве, а не в этом bool. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$names = ["Banana", "Apple", "Cherry"];
echo "Получено: ", implode(", ", $names), "
";
$collator->asort($names, Collator::SORT_STRING);
echo "На странице: ", implode(", ", $names), "
";
Ожидаемый результат
Получено: Banana, Apple, Cherry
На странице: Apple, Banana, Cherry
Строки не потеряны и не переведены: изменился только порядок вывода.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$products = [20 => "Banana", 10 => "Apple"];
$collator->asort($products, Collator::SORT_STRING);
foreach ($products as $id => $name) {
echo "ID ", $id, ": ", $name, "
";
}
Ожидаемый результат
ID 10: Apple
ID 20: Banana
Здесь ключи остаются настоящими ID: сортировка не ломает ссылки на товары.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$shelves = ["Shelf10", "Shelf2", "Shelf1"];
$collator->asort($shelves, Collator::SORT_STRING);
echo "Порядок обхода: ", implode(" → ", $shelves), "
";
Ожидаемый результат
Порядок обхода: Shelf1 → Shelf2 → Shelf10
NUMERIC_COLLATION учитывает последовательности цифр внутри текста. Это не SORT_NUMERIC, который сравнивал бы целые значения как числа. Для sortWithSortKeys дополнительно расходуется память на ключи сортировки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$items = [20 => "Banana", 10 => "Apple"];
$collator->asort($items, Collator::SORT_STRING);
echo implode(",", $items), "\n";
echo implode(",", array_keys($items)), "\n";
Ожидаемый результат
Apple,Banana
10,20
Если ключи являются ID товаров, выбор asort является частью корректности, а не оформления.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$items = ["Item10", "Item2", "Item1"];
collator_asort($collator, $items, Collator::SORT_STRING);
echo implode(",", $items), "\n";
Ожидаемый результат
Item1,Item2,Item10
NUMERIC_COLLATION сравнивает последовательности цифр как числовые части текста, а SORT_NUMERIC означал бы преобразование всего значения в число.
Тот же механизм в процедурной форме: collator_asort. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::setAttribute, Collator::getSortKey.
Collator::sortWithSortKeysУпорядочить список для интерфейса по языковому порядку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::sortWithSortKeys(array &$array): bool| Аргумент или результат | Что означает на практике |
|---|---|
| array | Массив передаётся по ссылке и меняется на месте. Сортирует строковые значения через предварительно вычисленные sort keys; переиндексирует. Это может помочь длинным спискам, но требует памяти для ключей. |
| flags | Отдельного flags нет; предназначен для строковой сортировки. |
| Возврат | bool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов. |
Начинаем с задачи и одного вызова
Нужно вывести список товаров по алфавиту. Получим конкретный порядок, который увидит покупатель.
| Запись в примере | Что именно происходит |
|---|---|
| $names / $products | Исходный массив. Операция меняет его на месте. |
| sort / sortWithSortKeys | Переиндексируют список с нуля; прежние ID нельзя считать сохранёнными. |
| asort | Сохраняет связь ключ → значение; подходит, когда ключ является ID товара. |
| Возвращаемый bool | Сообщает успех; список находится в переданном массиве, а не в этом bool. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$names = ["Banana", "Apple", "Cherry"];
echo "Получено: ", implode(", ", $names), "
";
$collator->sortWithSortKeys($names);
echo "На странице: ", implode(", ", $names), "
";
Ожидаемый результат
Получено: Banana, Apple, Cherry
На странице: Apple, Banana, Cherry
Строки не потеряны и не переведены: изменился только порядок вывода.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$products = [20 => "Banana", 10 => "Apple"];
$collator->sortWithSortKeys($products);
foreach ($products as $id => $name) {
echo "ID ", $id, ": ", $name, "
";
}
Ожидаемый результат
ID 0: Apple
ID 1: Banana
Полученные 0 и 1 — новые позиции, а не исходные ID 10 и 20. Для массива «ID → название» выбирайте asort, иначе ссылка может открыть чужой товар.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$shelves = ["Shelf10", "Shelf2", "Shelf1"];
$collator->sortWithSortKeys($shelves);
echo "Порядок обхода: ", implode(" → ", $shelves), "
";
Ожидаемый результат
Порядок обхода: Shelf1 → Shelf2 → Shelf10
NUMERIC_COLLATION учитывает последовательности цифр внутри текста. Это не SORT_NUMERIC, который сравнивал бы целые значения как числа. Для sortWithSortKeys дополнительно расходуется память на ключи сортировки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$items = [20 => "Banana", 10 => "Apple"];
$collator->sortWithSortKeys($items);
echo implode(",", $items), "\n";
echo implode(",", array_keys($items)), "\n";
Ожидаемый результат
Apple,Banana
0,1
Если ключи являются ID товаров, выбор asort является частью корректности, а не оформления.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$items = ["Item10", "Item2", "Item1"];
collator_sort_with_sort_keys($collator, $items);
echo implode(",", $items), "\n";
Ожидаемый результат
Item1,Item2,Item10
NUMERIC_COLLATION сравнивает последовательности цифр как числовые части текста, а SORT_NUMERIC означал бы преобразование всего значения в число.
Тот же механизм в процедурной форме: collator_sort_with_sort_keys. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::setAttribute, Collator::getSortKey.
collator_sort_with_sort_keysУпорядочить список для интерфейса по языковому порядку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_sort_with_sort_keys(Collator $object, array &$array): boolПроцедурная форма Collator::sortWithSortKeys. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| array | Массив передаётся по ссылке и меняется на месте. Сортирует строковые значения через предварительно вычисленные sort keys; переиндексирует. Это может помочь длинным спискам, но требует памяти для ключей. |
| flags | Отдельного flags нет; предназначен для строковой сортировки. |
| Возврат | bool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов. |
Начинаем с задачи и одного вызова
Нужно вывести список товаров по алфавиту. Получим конкретный порядок, который увидит покупатель.
| Запись в примере | Что именно происходит |
|---|---|
| $names / $products | Исходный массив. Операция меняет его на месте. |
| sort / sortWithSortKeys | Переиндексируют список с нуля; прежние ID нельзя считать сохранёнными. |
| asort | Сохраняет связь ключ → значение; подходит, когда ключ является ID товара. |
| Возвращаемый bool | Сообщает успех; список находится в переданном массиве, а не в этом bool. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$names = ["Banana", "Apple", "Cherry"];
echo "Получено: ", implode(", ", $names), "
";
$collator->sortWithSortKeys($names);
echo "На странице: ", implode(", ", $names), "
";
Ожидаемый результат
Получено: Banana, Apple, Cherry
На странице: Apple, Banana, Cherry
Строки не потеряны и не переведены: изменился только порядок вывода.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$products = [20 => "Banana", 10 => "Apple"];
$collator->sortWithSortKeys($products);
foreach ($products as $id => $name) {
echo "ID ", $id, ": ", $name, "
";
}
Ожидаемый результат
ID 0: Apple
ID 1: Banana
Полученные 0 и 1 — новые позиции, а не исходные ID 10 и 20. Для массива «ID → название» выбирайте asort, иначе ссылка может открыть чужой товар.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$shelves = ["Shelf10", "Shelf2", "Shelf1"];
$collator->sortWithSortKeys($shelves);
echo "Порядок обхода: ", implode(" → ", $shelves), "
";
Ожидаемый результат
Порядок обхода: Shelf1 → Shelf2 → Shelf10
NUMERIC_COLLATION учитывает последовательности цифр внутри текста. Это не SORT_NUMERIC, который сравнивал бы целые значения как числа. Для sortWithSortKeys дополнительно расходуется память на ключи сортировки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$items = [20 => "Banana", 10 => "Apple"];
$collator->sortWithSortKeys($items);
echo implode(",", $items), "\n";
echo implode(",", array_keys($items)), "\n";
Ожидаемый результат
Apple,Banana
0,1
Если ключи являются ID товаров, выбор asort является частью корректности, а не оформления.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$items = ["Item10", "Item2", "Item1"];
collator_sort_with_sort_keys($collator, $items);
echo implode(",", $items), "\n";
Ожидаемый результат
Item1,Item2,Item10
NUMERIC_COLLATION сравнивает последовательности цифр как числовые части текста, а SORT_NUMERIC означал бы преобразование всего значения в число.
Тот же механизм в процедурной форме: collator_sort_with_sort_keys. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::setAttribute, Collator::getSortKey.
Collator::getSortKeyЗаранее получить двоичный ключ для многократного сравнения тех же названий.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::getSortKey(string $string): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| string | UTF-8 строка и текущие правила Collator. Ключ может содержать нулевые/непечатные байты, поэтому это не текст для вывода. |
| Возврат | string|false. Ключи сравнивают бинарно; совместимы только при одинаковой локали, настройках и версии ICU. Не сохраняйте их навсегда без версии и плана перестроения. |
Начинаем с задачи и одного вызова
При многократном сравнении одних названий можно заранее получить их двоичное представление для сортировки. Покупателю всё равно показывают исходные названия; ключ нужен только программе.
| Запись в примере | Что именно происходит |
|---|---|
| $key = $collator->getSortKey($name) | Возвращает бинарную строку, кодирующую порядок при текущей locale и настройках. |
| strcmp($leftKey, $rightKey) | Бинарно сравнивает уже подготовленные ключи. Для исходных названий нужен compare. |
| Срок жизни ключа | При смене ICU, locale или strength ключи надо пересоздать; смешивать несовместимые наборы нельзя. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$appleKey = $collator->getSortKey("Apple");
$bananaKey = $collator->getSortKey("Banana");
if (strcmp($appleKey, $bananaKey) < 0) {
echo "Каталог: Apple, Banana
";
}
Ожидаемый результат
Каталог: Apple, Banana
Не печатаем бинарные байты как текст: полезный результат — установленный порядок названий.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
$savedName = "café";
$savedKey = $collator->getSortKey($savedName);
$queryKey = $collator->getSortKey("CAFE");
if ($savedKey === $queryKey) { echo "Показать карточку: ", $savedName, "
"; }
Ожидаемый результат
Показать карточку: café
Одинаковые правила дали одинаковый ключ поиска, а карточка сохранила оригинальное написание. Для одного сравнения compare проще; ключи имеют смысл при повторном использовании.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$a = $collator->getSortKey("Apple");
$b = $collator->getSortKey("Banana");
echo strcmp($a, $b) < 0 ? "Apple first\n" : "other\n";
Ожидаемый результат
Apple first
strcmp подходит именно для полученных двоичных ключей, а не заменяет языковое сравнение исходных названий.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
$a = collator_get_sort_key($collator, "café");
$b = collator_get_sort_key($collator, "CAFE");
var_dump($a === $b);
Ожидаемый результат
bool(true)
При смене strength старые и новые ключи смешивать нельзя.
Тот же механизм в процедурной форме: collator_get_sort_key. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::sortWithSortKeys, Collator::compare.
collator_get_sort_keyЗаранее получить двоичный ключ для многократного сравнения тех же названий.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_get_sort_key(Collator $object, string $string): string|falseПроцедурная форма Collator::getSortKey. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string | UTF-8 строка и текущие правила Collator. Ключ может содержать нулевые/непечатные байты, поэтому это не текст для вывода. |
| Возврат | string|false. Ключи сравнивают бинарно; совместимы только при одинаковой локали, настройках и версии ICU. Не сохраняйте их навсегда без версии и плана перестроения. |
Начинаем с задачи и одного вызова
При многократном сравнении одних названий можно заранее получить их двоичное представление для сортировки. Покупателю всё равно показывают исходные названия; ключ нужен только программе.
| Запись в примере | Что именно происходит |
|---|---|
| $key = $collator->getSortKey($name) | Возвращает бинарную строку, кодирующую порядок при текущей locale и настройках. |
| strcmp($leftKey, $rightKey) | Бинарно сравнивает уже подготовленные ключи. Для исходных названий нужен compare. |
| Срок жизни ключа | При смене ICU, locale или strength ключи надо пересоздать; смешивать несовместимые наборы нельзя. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$appleKey = $collator->getSortKey("Apple");
$bananaKey = $collator->getSortKey("Banana");
if (strcmp($appleKey, $bananaKey) < 0) {
echo "Каталог: Apple, Banana
";
}
Ожидаемый результат
Каталог: Apple, Banana
Не печатаем бинарные байты как текст: полезный результат — установленный порядок названий.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
$savedName = "café";
$savedKey = $collator->getSortKey($savedName);
$queryKey = $collator->getSortKey("CAFE");
if ($savedKey === $queryKey) { echo "Показать карточку: ", $savedName, "
"; }
Ожидаемый результат
Показать карточку: café
Одинаковые правила дали одинаковый ключ поиска, а карточка сохранила оригинальное написание. Для одного сравнения compare проще; ключи имеют смысл при повторном использовании.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$a = $collator->getSortKey("Apple");
$b = $collator->getSortKey("Banana");
echo strcmp($a, $b) < 0 ? "Apple first\n" : "other\n";
Ожидаемый результат
Apple first
strcmp подходит именно для полученных двоичных ключей, а не заменяет языковое сравнение исходных названий.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
$a = collator_get_sort_key($collator, "café");
$b = collator_get_sort_key($collator, "CAFE");
var_dump($a === $b);
Ожидаемый результат
bool(true)
При смене strength старые и новые ключи смешивать нельзя.
Тот же механизм в процедурной форме: collator_get_sort_key. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::sortWithSortKeys, Collator::compare.
Collator::setStrengthУправлять тем, какие различия строк важны: базовые буквы, акценты, регистр или полное различие.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::setStrength(int $strength): true| Аргумент или результат | Что означает на практике |
|---|---|
| strength | Для setter PRIMARY учитывает базовые буквы; SECONDARY также акценты; TERTIARY обычно регистр/варианты; QUATERNARY дополнительные различия с punctuation/японскими правилами; IDENTICAL самый полный уровень. Locale может уточнять поведение. |
| Возврат | setStrength bool, getStrength int текущей силы. Это настройка сравнения, не преобразование строки; регистр и акценты в исходнике остаются. |
Начинаем с задачи и одного вызова
Поиск по кафе должен находить café даже при запросе CAFE. Но точная сортировка может учитывать акценты и регистр. Strength выбирает, какие различия существенны для этого объекта.
| Запись в примере | Что именно происходит |
|---|---|
| setStrength(Collator::PRIMARY) | Оставляет сравнение базовых букв для этого поискового профиля. |
| getStrength() | Позволяет определить, какой профиль сейчас действует, например вывести название режима. |
| Строка café | Не переписывается в CAFE; настройка меняет только сравнение. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
if ($collator->compare("café", "CAFE") === 0) {
echo "Результат поиска CAFE: café
";
}
Ожидаемый результат
Результат поиска CAFE: café
Пользователь получил нужное название, хотя не ввёл акцент и другой регистр.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
echo $collator->getStrength() === Collator::PRIMARY ? "Режим: поиск без акцентов.
" : "Другой режим.
";
$collator->setStrength(Collator::SECONDARY);
echo $collator->compare("cafe", "café") === 0 ? "Одинаковое название.
" : "Акцент теперь различается.
";
Ожидаемый результат
Режим: поиск без акцентов.
Акцент теперь различается.
SECONDARY добавил различие акцентов. В приложении лучше иметь отдельные объекты для поиска и сортировки, чтобы изменение режима не влияло на соседнюю задачу.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::SECONDARY);
var_dump($collator->getStrength() === Collator::SECONDARY);
Ожидаемый результат
bool(true)
Сила выбирается для задачи: поиск и точная сортировка могут использовать разные Collator.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
collator_set_strength($collator, Collator::PRIMARY);
var_dump(collator_get_strength($collator) === Collator::PRIMARY);
var_dump($collator->compare("café", "CAFE") === 0);
Ожидаемый результат
bool(true)
bool(true)
Не применяйте такой критерий к паролям, токенам или подписи байтов.
Тот же механизм в процедурной форме: collator_set_strength. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::compare, Collator::setAttribute.
collator_set_strengthУправлять тем, какие различия строк важны: базовые буквы, акценты, регистр или полное различие.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_set_strength(Collator $object, int $strength): trueПроцедурная форма Collator::setStrength. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| strength | Для setter PRIMARY учитывает базовые буквы; SECONDARY также акценты; TERTIARY обычно регистр/варианты; QUATERNARY дополнительные различия с punctuation/японскими правилами; IDENTICAL самый полный уровень. Locale может уточнять поведение. |
| Возврат | setStrength bool, getStrength int текущей силы. Это настройка сравнения, не преобразование строки; регистр и акценты в исходнике остаются. |
Начинаем с задачи и одного вызова
Поиск по кафе должен находить café даже при запросе CAFE. Но точная сортировка может учитывать акценты и регистр. Strength выбирает, какие различия существенны для этого объекта.
| Запись в примере | Что именно происходит |
|---|---|
| setStrength(Collator::PRIMARY) | Оставляет сравнение базовых букв для этого поискового профиля. |
| getStrength() | Позволяет определить, какой профиль сейчас действует, например вывести название режима. |
| Строка café | Не переписывается в CAFE; настройка меняет только сравнение. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
if ($collator->compare("café", "CAFE") === 0) {
echo "Результат поиска CAFE: café
";
}
Ожидаемый результат
Результат поиска CAFE: café
Пользователь получил нужное название, хотя не ввёл акцент и другой регистр.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
echo $collator->getStrength() === Collator::PRIMARY ? "Режим: поиск без акцентов.
" : "Другой режим.
";
$collator->setStrength(Collator::SECONDARY);
echo $collator->compare("cafe", "café") === 0 ? "Одинаковое название.
" : "Акцент теперь различается.
";
Ожидаемый результат
Режим: поиск без акцентов.
Акцент теперь различается.
SECONDARY добавил различие акцентов. В приложении лучше иметь отдельные объекты для поиска и сортировки, чтобы изменение режима не влияло на соседнюю задачу.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::SECONDARY);
var_dump($collator->getStrength() === Collator::SECONDARY);
Ожидаемый результат
bool(true)
Сила выбирается для задачи: поиск и точная сортировка могут использовать разные Collator.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
collator_set_strength($collator, Collator::PRIMARY);
var_dump(collator_get_strength($collator) === Collator::PRIMARY);
var_dump($collator->compare("café", "CAFE") === 0);
Ожидаемый результат
bool(true)
bool(true)
Не применяйте такой критерий к паролям, токенам или подписи байтов.
Тот же механизм в процедурной форме: collator_set_strength. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::compare, Collator::setAttribute.
Collator::getStrengthУправлять тем, какие различия строк важны: базовые буквы, акценты, регистр или полное различие.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::getStrength(): int| Аргумент или результат | Что означает на практике |
|---|---|
| strength | Для setter PRIMARY учитывает базовые буквы; SECONDARY также акценты; TERTIARY обычно регистр/варианты; QUATERNARY дополнительные различия с punctuation/японскими правилами; IDENTICAL самый полный уровень. Locale может уточнять поведение. |
| Возврат | setStrength bool, getStrength int текущей силы. Это настройка сравнения, не преобразование строки; регистр и акценты в исходнике остаются. |
Начинаем с задачи и одного вызова
Поиск по кафе должен находить café даже при запросе CAFE. Но точная сортировка может учитывать акценты и регистр. Strength выбирает, какие различия существенны для этого объекта.
| Запись в примере | Что именно происходит |
|---|---|
| setStrength(Collator::PRIMARY) | Оставляет сравнение базовых букв для этого поискового профиля. |
| getStrength() | Позволяет определить, какой профиль сейчас действует, например вывести название режима. |
| Строка café | Не переписывается в CAFE; настройка меняет только сравнение. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
if ($collator->compare("café", "CAFE") === 0) {
echo "Результат поиска CAFE: café
";
}
Ожидаемый результат
Результат поиска CAFE: café
Пользователь получил нужное название, хотя не ввёл акцент и другой регистр.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
echo $collator->getStrength() === Collator::PRIMARY ? "Режим: поиск без акцентов.
" : "Другой режим.
";
$collator->setStrength(Collator::SECONDARY);
echo $collator->compare("cafe", "café") === 0 ? "Одинаковое название.
" : "Акцент теперь различается.
";
Ожидаемый результат
Режим: поиск без акцентов.
Акцент теперь различается.
SECONDARY добавил различие акцентов. В приложении лучше иметь отдельные объекты для поиска и сортировки, чтобы изменение режима не влияло на соседнюю задачу.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::SECONDARY);
var_dump($collator->getStrength() === Collator::SECONDARY);
Ожидаемый результат
bool(true)
Сила выбирается для задачи: поиск и точная сортировка могут использовать разные Collator.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
collator_set_strength($collator, Collator::PRIMARY);
var_dump(collator_get_strength($collator) === Collator::PRIMARY);
var_dump($collator->compare("café", "CAFE") === 0);
Ожидаемый результат
bool(true)
bool(true)
Не применяйте такой критерий к паролям, токенам или подписи байтов.
Тот же механизм в процедурной форме: collator_get_strength. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::compare, Collator::setAttribute.
collator_get_strengthУправлять тем, какие различия строк важны: базовые буквы, акценты, регистр или полное различие.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_get_strength(Collator $object): intПроцедурная форма Collator::getStrength. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| strength | Для setter PRIMARY учитывает базовые буквы; SECONDARY также акценты; TERTIARY обычно регистр/варианты; QUATERNARY дополнительные различия с punctuation/японскими правилами; IDENTICAL самый полный уровень. Locale может уточнять поведение. |
| Возврат | setStrength bool, getStrength int текущей силы. Это настройка сравнения, не преобразование строки; регистр и акценты в исходнике остаются. |
Начинаем с задачи и одного вызова
Поиск по кафе должен находить café даже при запросе CAFE. Но точная сортировка может учитывать акценты и регистр. Strength выбирает, какие различия существенны для этого объекта.
| Запись в примере | Что именно происходит |
|---|---|
| setStrength(Collator::PRIMARY) | Оставляет сравнение базовых букв для этого поискового профиля. |
| getStrength() | Позволяет определить, какой профиль сейчас действует, например вывести название режима. |
| Строка café | Не переписывается в CAFE; настройка меняет только сравнение. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
if ($collator->compare("café", "CAFE") === 0) {
echo "Результат поиска CAFE: café
";
}
Ожидаемый результат
Результат поиска CAFE: café
Пользователь получил нужное название, хотя не ввёл акцент и другой регистр.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::PRIMARY);
echo $collator->getStrength() === Collator::PRIMARY ? "Режим: поиск без акцентов.
" : "Другой режим.
";
$collator->setStrength(Collator::SECONDARY);
echo $collator->compare("cafe", "café") === 0 ? "Одинаковое название.
" : "Акцент теперь различается.
";
Ожидаемый результат
Режим: поиск без акцентов.
Акцент теперь различается.
SECONDARY добавил различие акцентов. В приложении лучше иметь отдельные объекты для поиска и сортировки, чтобы изменение режима не влияло на соседнюю задачу.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setStrength(Collator::SECONDARY);
var_dump($collator->getStrength() === Collator::SECONDARY);
Ожидаемый результат
bool(true)
Сила выбирается для задачи: поиск и точная сортировка могут использовать разные Collator.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
collator_set_strength($collator, Collator::PRIMARY);
var_dump(collator_get_strength($collator) === Collator::PRIMARY);
var_dump($collator->compare("café", "CAFE") === 0);
Ожидаемый результат
bool(true)
bool(true)
Не применяйте такой критерий к паролям, токенам или подписи байтов.
Тот же механизм в процедурной форме: collator_get_strength. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::compare, Collator::setAttribute.
Collator::setAttributeУточнить конкретное правило сортировки, например числа внутри названия или учёт пунктуации.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::setAttribute(int $attribute, int $value): bool| Аргумент или результат | Что означает на практике |
|---|---|
| attribute | Одна из констант FRENCH_COLLATION, ALTERNATE_HANDLING, CASE_FIRST, CASE_LEVEL, NORMALIZATION_MODE, NUMERIC_COLLATION, STRENGTH. Не путайте ID атрибута и допустимое значение. |
| value / возврат | setAttribute принимает подходящее значение ON/OFF, SHIFTED/NON_IGNORABLE, LOWER_FIRST/UPPER_FIRST/OFF, DEFAULT или strength; возвращает bool. getAttribute принимает только attribute и возвращает int|false. Проверка ===false важна для нулевых значений. |
| Практика | Начните с корректной locale, затем меняйте только нужное правило. NORMALIZATION_MODE помогает сравнивать канонически эквивалентный текст; не заменяет сохранение согласованной формы в базе. |
Начинаем с задачи и одного вызова
В меню полок Shelf10 не должна стоять перед Shelf2. Числа находятся внутри строк, поэтому выбираем numeric collation, а не преобразуем всё название в число.
| Запись в примере | Что именно происходит |
|---|---|
| NUMERIC_COLLATION | Имя настраиваемого правила. |
| ON / OFF | Его значение. ID атрибута и значение — разные аргументы. |
| getAttribute(...) | Читает действующую настройку, чтобы связать профиль с результатом списка. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$names = ["Shelf10", "Shelf2", "Shelf1"];
$collator->sort($names);
echo implode(" → ", $names), "
";
Ожидаемый результат
Shelf1 → Shelf2 → Shelf10
Строковый префикс сохранился; числа сравнились по величине.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::OFF);
$names = ["Shelf2", "Shelf10"];
$collator->sort($names);
echo "Обычный текст: ", implode(", ", $names), "
";
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->sort($names);
echo "Номера: ", implode(", ", $names), "
";
echo $collator->getAttribute(Collator::NUMERIC_COLLATION) === Collator::ON ? "Числовой режим включён.
" : "Выключен.
";
Ожидаемый результат
Обычный текст: Shelf10, Shelf2
Номера: Shelf2, Shelf10
Числовой режим включён.
Теперь видно, что изменил конкретный атрибут. Для версии товара или дробей с разделителями одного правила цифр может быть недостаточно: нужна собственная модель версии/числа.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
var_dump($collator->getAttribute(Collator::NUMERIC_COLLATION) === Collator::ON);
Ожидаемый результат
bool(true)
Значение ON относится именно к выбранному атрибуту.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
collator_set_attribute($collator, Collator::NUMERIC_COLLATION, Collator::ON);
echo collator_compare($collator, "A2", "A10") < 0 ? "A2 before A10\n" : "other\n";
Ожидаемый результат
A2 before A10
Атрибут задаётся один раз на объекте и работает в compare,sort и sortkey.
Тот же механизм в процедурной форме: collator_set_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::getStrength, Normalizer::normalize.
collator_set_attributeУточнить конкретное правило сортировки, например числа внутри названия или учёт пунктуации.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_set_attribute(Collator $object, int $attribute, int $value): boolПроцедурная форма Collator::setAttribute. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| attribute | Одна из констант FRENCH_COLLATION, ALTERNATE_HANDLING, CASE_FIRST, CASE_LEVEL, NORMALIZATION_MODE, NUMERIC_COLLATION, STRENGTH. Не путайте ID атрибута и допустимое значение. |
| value / возврат | setAttribute принимает подходящее значение ON/OFF, SHIFTED/NON_IGNORABLE, LOWER_FIRST/UPPER_FIRST/OFF, DEFAULT или strength; возвращает bool. getAttribute принимает только attribute и возвращает int|false. Проверка ===false важна для нулевых значений. |
| Практика | Начните с корректной locale, затем меняйте только нужное правило. NORMALIZATION_MODE помогает сравнивать канонически эквивалентный текст; не заменяет сохранение согласованной формы в базе. |
Начинаем с задачи и одного вызова
В меню полок Shelf10 не должна стоять перед Shelf2. Числа находятся внутри строк, поэтому выбираем numeric collation, а не преобразуем всё название в число.
| Запись в примере | Что именно происходит |
|---|---|
| NUMERIC_COLLATION | Имя настраиваемого правила. |
| ON / OFF | Его значение. ID атрибута и значение — разные аргументы. |
| getAttribute(...) | Читает действующую настройку, чтобы связать профиль с результатом списка. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$names = ["Shelf10", "Shelf2", "Shelf1"];
$collator->sort($names);
echo implode(" → ", $names), "
";
Ожидаемый результат
Shelf1 → Shelf2 → Shelf10
Строковый префикс сохранился; числа сравнились по величине.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::OFF);
$names = ["Shelf2", "Shelf10"];
$collator->sort($names);
echo "Обычный текст: ", implode(", ", $names), "
";
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->sort($names);
echo "Номера: ", implode(", ", $names), "
";
echo $collator->getAttribute(Collator::NUMERIC_COLLATION) === Collator::ON ? "Числовой режим включён.
" : "Выключен.
";
Ожидаемый результат
Обычный текст: Shelf10, Shelf2
Номера: Shelf2, Shelf10
Числовой режим включён.
Теперь видно, что изменил конкретный атрибут. Для версии товара или дробей с разделителями одного правила цифр может быть недостаточно: нужна собственная модель версии/числа.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
var_dump($collator->getAttribute(Collator::NUMERIC_COLLATION) === Collator::ON);
Ожидаемый результат
bool(true)
Значение ON относится именно к выбранному атрибуту.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
collator_set_attribute($collator, Collator::NUMERIC_COLLATION, Collator::ON);
echo collator_compare($collator, "A2", "A10") < 0 ? "A2 before A10\n" : "other\n";
Ожидаемый результат
A2 before A10
Атрибут задаётся один раз на объекте и работает в compare,sort и sortkey.
Тот же механизм в процедурной форме: collator_set_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::getStrength, Normalizer::normalize.
Collator::getAttributeУточнить конкретное правило сортировки, например числа внутри названия или учёт пунктуации.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::getAttribute(int $attribute): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| attribute | Одна из констант FRENCH_COLLATION, ALTERNATE_HANDLING, CASE_FIRST, CASE_LEVEL, NORMALIZATION_MODE, NUMERIC_COLLATION, STRENGTH. Не путайте ID атрибута и допустимое значение. |
| value / возврат | setAttribute принимает подходящее значение ON/OFF, SHIFTED/NON_IGNORABLE, LOWER_FIRST/UPPER_FIRST/OFF, DEFAULT или strength; возвращает bool. getAttribute принимает только attribute и возвращает int|false. Проверка ===false важна для нулевых значений. |
| Практика | Начните с корректной locale, затем меняйте только нужное правило. NORMALIZATION_MODE помогает сравнивать канонически эквивалентный текст; не заменяет сохранение согласованной формы в базе. |
Начинаем с задачи и одного вызова
В меню полок Shelf10 не должна стоять перед Shelf2. Числа находятся внутри строк, поэтому выбираем numeric collation, а не преобразуем всё название в число.
| Запись в примере | Что именно происходит |
|---|---|
| NUMERIC_COLLATION | Имя настраиваемого правила. |
| ON / OFF | Его значение. ID атрибута и значение — разные аргументы. |
| getAttribute(...) | Читает действующую настройку, чтобы связать профиль с результатом списка. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$names = ["Shelf10", "Shelf2", "Shelf1"];
$collator->sort($names);
echo implode(" → ", $names), "
";
Ожидаемый результат
Shelf1 → Shelf2 → Shelf10
Строковый префикс сохранился; числа сравнились по величине.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::OFF);
$names = ["Shelf2", "Shelf10"];
$collator->sort($names);
echo "Обычный текст: ", implode(", ", $names), "
";
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->sort($names);
echo "Номера: ", implode(", ", $names), "
";
echo $collator->getAttribute(Collator::NUMERIC_COLLATION) === Collator::ON ? "Числовой режим включён.
" : "Выключен.
";
Ожидаемый результат
Обычный текст: Shelf10, Shelf2
Номера: Shelf2, Shelf10
Числовой режим включён.
Теперь видно, что изменил конкретный атрибут. Для версии товара или дробей с разделителями одного правила цифр может быть недостаточно: нужна собственная модель версии/числа.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
var_dump($collator->getAttribute(Collator::NUMERIC_COLLATION) === Collator::ON);
Ожидаемый результат
bool(true)
Значение ON относится именно к выбранному атрибуту.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
collator_set_attribute($collator, Collator::NUMERIC_COLLATION, Collator::ON);
echo collator_compare($collator, "A2", "A10") < 0 ? "A2 before A10\n" : "other\n";
Ожидаемый результат
A2 before A10
Атрибут задаётся один раз на объекте и работает в compare,sort и sortkey.
Тот же механизм в процедурной форме: collator_get_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::getStrength, Normalizer::normalize.
collator_get_attributeУточнить конкретное правило сортировки, например числа внутри названия или учёт пунктуации.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_get_attribute(Collator $object, int $attribute): int|falseПроцедурная форма Collator::getAttribute. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| attribute | Одна из констант FRENCH_COLLATION, ALTERNATE_HANDLING, CASE_FIRST, CASE_LEVEL, NORMALIZATION_MODE, NUMERIC_COLLATION, STRENGTH. Не путайте ID атрибута и допустимое значение. |
| value / возврат | setAttribute принимает подходящее значение ON/OFF, SHIFTED/NON_IGNORABLE, LOWER_FIRST/UPPER_FIRST/OFF, DEFAULT или strength; возвращает bool. getAttribute принимает только attribute и возвращает int|false. Проверка ===false важна для нулевых значений. |
| Практика | Начните с корректной locale, затем меняйте только нужное правило. NORMALIZATION_MODE помогает сравнивать канонически эквивалентный текст; не заменяет сохранение согласованной формы в базе. |
Начинаем с задачи и одного вызова
В меню полок Shelf10 не должна стоять перед Shelf2. Числа находятся внутри строк, поэтому выбираем numeric collation, а не преобразуем всё название в число.
| Запись в примере | Что именно происходит |
|---|---|
| NUMERIC_COLLATION | Имя настраиваемого правила. |
| ON / OFF | Его значение. ID атрибута и значение — разные аргументы. |
| getAttribute(...) | Читает действующую настройку, чтобы связать профиль с результатом списка. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$names = ["Shelf10", "Shelf2", "Shelf1"];
$collator->sort($names);
echo implode(" → ", $names), "
";
Ожидаемый результат
Shelf1 → Shelf2 → Shelf10
Строковый префикс сохранился; числа сравнились по величине.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::OFF);
$names = ["Shelf2", "Shelf10"];
$collator->sort($names);
echo "Обычный текст: ", implode(", ", $names), "
";
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
$collator->sort($names);
echo "Номера: ", implode(", ", $names), "
";
echo $collator->getAttribute(Collator::NUMERIC_COLLATION) === Collator::ON ? "Числовой режим включён.
" : "Выключен.
";
Ожидаемый результат
Обычный текст: Shelf10, Shelf2
Номера: Shelf2, Shelf10
Числовой режим включён.
Теперь видно, что изменил конкретный атрибут. Для версии товара или дробей с разделителями одного правила цифр может быть недостаточно: нужна собственная модель версии/числа.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->setAttribute(Collator::NUMERIC_COLLATION, Collator::ON);
var_dump($collator->getAttribute(Collator::NUMERIC_COLLATION) === Collator::ON);
Ожидаемый результат
bool(true)
Значение ON относится именно к выбранному атрибуту.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
collator_set_attribute($collator, Collator::NUMERIC_COLLATION, Collator::ON);
echo collator_compare($collator, "A2", "A10") < 0 ? "A2 before A10\n" : "other\n";
Ожидаемый результат
A2 before A10
Атрибут задаётся один раз на объекте и работает в compare,sort и sortkey.
Тот же механизм в процедурной форме: collator_get_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Collator::getStrength, Normalizer::normalize.
Collator::getLocaleУзнать, какие данные локали ICU реально использовал после fallback.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::getLocale(int $type): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| type | Locale::VALID_LOCALE — подходящая доступная локаль; Locale::ACTUAL_LOCALE — локаль конкретных использованных данных. Может отличаться от запрошенной, поскольку правила наследуются. |
| Возврат | string|false. Это диагностика fallback, а не способ узнать язык текста или заголовок Accept-Language. |
Начинаем с задачи и одного вызова
При неожиданном порядке букв разработчик должен сопоставить запрошенный язык и фактические данные ICU. Проверка locale помогает воспроизвести проблему, но сама список не сортирует.
| Запись в примере | Что именно происходит |
|---|---|
| VALID_LOCALE | Поддержанная локаль, найденная для запроса. |
| ACTUAL_LOCALE | Локаль реально использованных данных; общие правила могут прийти из root. |
| Порядок рядом с ID | Диагностика полезна, когда видно и профиль, и конкретный список, а не только слово ready. |
<?php
declare(strict_types=1);
$collator = new Collator("sv_SE");
$names = ["z", "ä", "a"];
$collator->sort($names);
echo "Данные: ", $collator->getLocale(Locale::VALID_LOCALE), "
";
echo "Список: ", implode(", ", $names), "
";
Ожидаемый результат
Данные: sv
Список: a, z, ä
ICU использовал шведские данные sv; региональный запрос sv_SE может наследовать их. Это нормальный fallback, а не потеря сортировки.
<?php
declare(strict_types=1);
$requestedLocale = "sv_SE";
$collator = new Collator($requestedLocale);
echo "Профиль посетителя: ", $requestedLocale, "
";
echo "Данные ICU: ", $collator->getLocale(Locale::VALID_LOCALE), "
";
Ожидаемый результат
Профиль посетителя: sv_SE
Данные ICU: sv
Профиль продукта и источник данных — разные строки. Не переписывайте сохранённый выбор посетителя каждый раз, когда ICU сообщает родительский ID.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$locale = $collator->getLocale(Locale::VALID_LOCALE);
echo is_string($locale) ? "locale resolved\n" : "failed\n";
Ожидаемый результат
locale resolved
Точное значение зависит от ICU/CLDR; в интерфейсе ориентируйтесь на свой список поддерживаемых языков.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$locale = collator_get_locale($collator, Locale::ACTUAL_LOCALE);
echo is_string($locale) ? "actual data locale known\n" : "failed\n";
Ожидаемый результат
actual data locale known
Пустое или root-значение не означает автоматически, что объект не работает; читайте смысл actual/valid.
Тот же механизм в процедурной форме: collator_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDefault, Collator::create.
collator_get_localeУзнать, какие данные локали ICU реально использовал после fallback.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_get_locale(Collator $object, int $type): string|falseПроцедурная форма Collator::getLocale. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| type | Locale::VALID_LOCALE — подходящая доступная локаль; Locale::ACTUAL_LOCALE — локаль конкретных использованных данных. Может отличаться от запрошенной, поскольку правила наследуются. |
| Возврат | string|false. Это диагностика fallback, а не способ узнать язык текста или заголовок Accept-Language. |
Начинаем с задачи и одного вызова
При неожиданном порядке букв разработчик должен сопоставить запрошенный язык и фактические данные ICU. Проверка locale помогает воспроизвести проблему, но сама список не сортирует.
| Запись в примере | Что именно происходит |
|---|---|
| VALID_LOCALE | Поддержанная локаль, найденная для запроса. |
| ACTUAL_LOCALE | Локаль реально использованных данных; общие правила могут прийти из root. |
| Порядок рядом с ID | Диагностика полезна, когда видно и профиль, и конкретный список, а не только слово ready. |
<?php
declare(strict_types=1);
$collator = new Collator("sv_SE");
$names = ["z", "ä", "a"];
$collator->sort($names);
echo "Данные: ", $collator->getLocale(Locale::VALID_LOCALE), "
";
echo "Список: ", implode(", ", $names), "
";
Ожидаемый результат
Данные: sv
Список: a, z, ä
ICU использовал шведские данные sv; региональный запрос sv_SE может наследовать их. Это нормальный fallback, а не потеря сортировки.
<?php
declare(strict_types=1);
$requestedLocale = "sv_SE";
$collator = new Collator($requestedLocale);
echo "Профиль посетителя: ", $requestedLocale, "
";
echo "Данные ICU: ", $collator->getLocale(Locale::VALID_LOCALE), "
";
Ожидаемый результат
Профиль посетителя: sv_SE
Данные ICU: sv
Профиль продукта и источник данных — разные строки. Не переписывайте сохранённый выбор посетителя каждый раз, когда ICU сообщает родительский ID.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$locale = $collator->getLocale(Locale::VALID_LOCALE);
echo is_string($locale) ? "locale resolved\n" : "failed\n";
Ожидаемый результат
locale resolved
Точное значение зависит от ICU/CLDR; в интерфейсе ориентируйтесь на свой список поддерживаемых языков.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$locale = collator_get_locale($collator, Locale::ACTUAL_LOCALE);
echo is_string($locale) ? "actual data locale known\n" : "failed\n";
Ожидаемый результат
actual data locale known
Пустое или root-значение не означает автоматически, что объект не работает; читайте смысл actual/valid.
Тот же механизм в процедурной форме: collator_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDefault, Collator::create.
Collator::getErrorCodeПолучить диагностику последней операции конкретного Collator и не потерять причину отказа.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::getErrorCode(): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | У метода нет аргументов; процедурная форма получает объект Collator. |
| Возврат | int ICU error code. U_ZERO_ERROR=0; предупреждения ICU могут быть отрицательными и не означают отказ: используйте intl_is_failure. |
| Когда читать | Сразу после сомнительного вызова: следующая операция может заменить error state. Ошибка объекта и глобальная ошибка Intl имеют разные области. |
Начинаем с задачи и одного вызова
Неверные байты названия нельзя молча сортировать как корректный каталог. При неудаче покажем понятный статус импорта, а подробную причину сохраним для разработчика.
| Запись в примере | Что именно происходит |
|---|---|
| compare("\xFF", "Apple") | Намеренно неверный UTF-8 из условного импорта; полезный порядок для такой строки не получен. |
| getErrorCode()/getErrorMessage() | Считываем сразу после отказа конкретного Collator. |
| Статус импорта | Вместо публикации повреждённого названия предлагаем исправить исходную кодировку. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
if ($order === false) {
echo "Каталог не отсортирован: исправьте кодировку названия.
";
}
Ожидаемый результат
Каталог не отсортирован: исправьте кодировку названия.
Результат false отделён от нуля и отрицательного порядка. Предыдущий корректный каталог можно оставить доступным до исправления импорта.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
$diagnostic = intl_error_name($collator->getErrorCode());
echo str_contains($diagnostic, "U_INVALID_CHAR_FOUND") ? "Причина для поддержки: вход не является UTF-8.
" : "Иная причина.
";
Ожидаемый результат
Причина для поддержки: вход не является UTF-8.
Чтение диагностики не исправляет байты. Преобразование кодировки выполняют на границе импорта с известной исходной кодировкой, а затем повторяют обработку уже исправленных данных.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->compare("A", "B");
var_dump(intl_is_failure($collator->getErrorCode()));
Ожидаемый результат
bool(false)
Нормальное состояние после успешной операции.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$ok = $collator->setAttribute(999999, 0);
var_dump($ok, intl_is_failure(collator_get_error_code($collator)));
Ожидаемый результат
bool(false)
bool(true)
Неверный атрибут намеренный. В рабочем коде выбирайте константы, а не эти числа.
Тот же механизм в процедурной форме: collator_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, intl_get_error_message.
collator_get_error_codeПолучить диагностику последней операции конкретного Collator и не потерять причину отказа.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_get_error_code(Collator $object): int|falseПроцедурная форма Collator::getErrorCode. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | У метода нет аргументов; процедурная форма получает объект Collator. |
| Возврат | int ICU error code. U_ZERO_ERROR=0; предупреждения ICU могут быть отрицательными и не означают отказ: используйте intl_is_failure. |
| Когда читать | Сразу после сомнительного вызова: следующая операция может заменить error state. Ошибка объекта и глобальная ошибка Intl имеют разные области. |
Начинаем с задачи и одного вызова
Неверные байты названия нельзя молча сортировать как корректный каталог. При неудаче покажем понятный статус импорта, а подробную причину сохраним для разработчика.
| Запись в примере | Что именно происходит |
|---|---|
| compare("\xFF", "Apple") | Намеренно неверный UTF-8 из условного импорта; полезный порядок для такой строки не получен. |
| getErrorCode()/getErrorMessage() | Считываем сразу после отказа конкретного Collator. |
| Статус импорта | Вместо публикации повреждённого названия предлагаем исправить исходную кодировку. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
if ($order === false) {
echo "Каталог не отсортирован: исправьте кодировку названия.
";
}
Ожидаемый результат
Каталог не отсортирован: исправьте кодировку названия.
Результат false отделён от нуля и отрицательного порядка. Предыдущий корректный каталог можно оставить доступным до исправления импорта.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
$diagnostic = intl_error_name($collator->getErrorCode());
echo str_contains($diagnostic, "U_INVALID_CHAR_FOUND") ? "Причина для поддержки: вход не является UTF-8.
" : "Иная причина.
";
Ожидаемый результат
Причина для поддержки: вход не является UTF-8.
Чтение диагностики не исправляет байты. Преобразование кодировки выполняют на границе импорта с известной исходной кодировкой, а затем повторяют обработку уже исправленных данных.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->compare("A", "B");
var_dump(intl_is_failure($collator->getErrorCode()));
Ожидаемый результат
bool(false)
Нормальное состояние после успешной операции.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$ok = $collator->setAttribute(999999, 0);
var_dump($ok, intl_is_failure(collator_get_error_code($collator)));
Ожидаемый результат
bool(false)
bool(true)
Неверный атрибут намеренный. В рабочем коде выбирайте константы, а не эти числа.
Тот же механизм в процедурной форме: collator_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, intl_get_error_message.
Collator::getErrorMessageПолучить диагностику последней операции конкретного Collator и не потерять причину отказа.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Collator::getErrorMessage(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | У метода нет аргументов; процедурная форма получает объект Collator. |
| Возврат | Строка с ICU-диагностикой. Показывайте пользователю короткое понятное сообщение, а подробности пишите в журнал. |
| Когда читать | Сразу после сомнительного вызова: следующая операция может заменить error state. Ошибка объекта и глобальная ошибка Intl имеют разные области. |
Начинаем с задачи и одного вызова
Неверные байты названия нельзя молча сортировать как корректный каталог. При неудаче покажем понятный статус импорта, а подробную причину сохраним для разработчика.
| Запись в примере | Что именно происходит |
|---|---|
| compare("\xFF", "Apple") | Намеренно неверный UTF-8 из условного импорта; полезный порядок для такой строки не получен. |
| getErrorCode()/getErrorMessage() | Считываем сразу после отказа конкретного Collator. |
| Статус импорта | Вместо публикации повреждённого названия предлагаем исправить исходную кодировку. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
if ($order === false) {
echo "Каталог не отсортирован: исправьте кодировку названия.
";
}
Ожидаемый результат
Каталог не отсортирован: исправьте кодировку названия.
Результат false отделён от нуля и отрицательного порядка. Предыдущий корректный каталог можно оставить доступным до исправления импорта.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
$diagnostic = $collator->getErrorMessage();
echo str_contains($diagnostic, "U_INVALID_CHAR_FOUND") ? "Причина для поддержки: вход не является UTF-8.
" : "Иная причина.
";
Ожидаемый результат
Причина для поддержки: вход не является UTF-8.
Чтение диагностики не исправляет байты. Преобразование кодировки выполняют на границе импорта с известной исходной кодировкой, а затем повторяют обработку уже исправленных данных.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->compare("A", "B");
echo $collator->getErrorMessage(), "\n";
Ожидаемый результат
U_ZERO_ERROR
Нормальное состояние после успешной операции.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$ok = $collator->setAttribute(999999, 0);
echo str_contains(collator_get_error_message($collator), "U_ILLEGAL_ARGUMENT_ERROR") ? "invalid attribute\n" : "other error\n";
Ожидаемый результат
invalid attribute
Неверный атрибут намеренный. В рабочем коде выбирайте константы, а не эти числа.
Тот же механизм в процедурной форме: collator_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, intl_get_error_message.
collator_get_error_messageПолучить диагностику последней операции конкретного Collator и не потерять причину отказа.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
collator_get_error_message(Collator $object): string|falseПроцедурная форма Collator::getErrorMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | У метода нет аргументов; процедурная форма получает объект Collator. |
| Возврат | Строка с ICU-диагностикой. Показывайте пользователю короткое понятное сообщение, а подробности пишите в журнал. |
| Когда читать | Сразу после сомнительного вызова: следующая операция может заменить error state. Ошибка объекта и глобальная ошибка Intl имеют разные области. |
Начинаем с задачи и одного вызова
Неверные байты названия нельзя молча сортировать как корректный каталог. При неудаче покажем понятный статус импорта, а подробную причину сохраним для разработчика.
| Запись в примере | Что именно происходит |
|---|---|
| compare("\xFF", "Apple") | Намеренно неверный UTF-8 из условного импорта; полезный порядок для такой строки не получен. |
| getErrorCode()/getErrorMessage() | Считываем сразу после отказа конкретного Collator. |
| Статус импорта | Вместо публикации повреждённого названия предлагаем исправить исходную кодировку. |
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
if ($order === false) {
echo "Каталог не отсортирован: исправьте кодировку названия.
";
}
Ожидаемый результат
Каталог не отсортирован: исправьте кодировку названия.
Результат false отделён от нуля и отрицательного порядка. Предыдущий корректный каталог можно оставить доступным до исправления импорта.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
$diagnostic = $collator->getErrorMessage();
echo str_contains($diagnostic, "U_INVALID_CHAR_FOUND") ? "Причина для поддержки: вход не является UTF-8.
" : "Иная причина.
";
Ожидаемый результат
Причина для поддержки: вход не является UTF-8.
Чтение диагностики не исправляет байты. Преобразование кодировки выполняют на границе импорта с известной исходной кодировкой, а затем повторяют обработку уже исправленных данных.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$collator->compare("A", "B");
echo $collator->getErrorMessage(), "\n";
Ожидаемый результат
U_ZERO_ERROR
Нормальное состояние после успешной операции.
<?php
declare(strict_types=1);
$collator = new Collator("en_US");
$ok = $collator->setAttribute(999999, 0);
echo str_contains(collator_get_error_message($collator), "U_ILLEGAL_ARGUMENT_ERROR") ? "invalid attribute\n" : "other error\n";
Ожидаемый результат
invalid attribute
Неверный атрибут намеренный. В рабочем коде выбирайте константы, а не эти числа.
Тот же механизм в процедурной форме: collator_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, intl_get_error_message.
NumberFormatter::__constructПодготовить представление чисел под язык посетителя: каталог, отчёт, процент или сумма.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::__construct(string $locale, int $style, ?string $pattern = null)| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Строка вроде en_US/de_DE выбирает десятичный разделитель, группировку, цифры и названия. Правила берутся из ICU/CLDR; явно задавайте локаль интерфейса, а не полагайтесь на окружение сервера. |
| style,pattern | DECIMAL, CURRENCY, PERCENT, SCIENTIFIC и другие стили перечислены ниже. Для PATTERN_DECIMAL нужен шаблон ICU DecimalFormat, для PATTERN_RULEBASED — правила ICU RuleBasedNumberFormat. pattern=null допустим, если стиль не требует шаблона. |
| Возврат / ошибки | new создаёт объект; static create/numfmt_create возвращают NumberFormatter либо null. PHP 8.4+ неверная локаль может вызвать ValueError. Проверяйте создание до вызова format. |
Начинаем с задачи и одного вызова
В каталоге есть число 1250.5. Для покупателя с американскими настройками хотим показать 1,250.5. Сначала готовим инструмент с нужными правилами; это создание объекта, оно ещё ничего не печатает.
| Запись в примере | Что именно происходит |
|---|---|
| new NumberFormatter(...) / NumberFormatter::create(...) | Два способа получить настроенный форматтер. new вызывает конструктор; create — статическую фабрику, которая может вернуть null. |
| "en_US" | Выбирает английские правила США: разделитель тысяч — запятая, дробной части — точка. |
| NumberFormatter::DECIMAL | Выбирает обычное число. Это именованная настройка, а не сама сумма. |
| $formatter->format(1250.5) | Передаёт число созданному инструменту и получает строку. echo делает её видимой. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->format(1250.5), "
";
Ожидаемый результат
1,250.5
Вход — число 1250.5; результат — строка 1,250.5. Её можно поставить рядом с подписью количества или суммы в шаблоне страницы.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo "Чай: ", $formatter->format(1250.5), "
";
echo "Кофе: ", $formatter->format(2400), "
";
Ожидаемый результат
Чай: 1,250.5
Кофе: 2,400
Объект создаётся один раз. Каждый вызов получает новое число, а правила остаются одинаковыми: каталог оформлен согласованно.
<?php
declare(strict_types=1);
$price = 1250.5;
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
echo "Цена: ", $formatter->format($price), "
";
echo "В программе: ", $price, "
";
Ожидаемый результат
Цена: 1.250,5
В программе: 1250.5
Изменилось оформление, а значение переменной price осталось прежним. Так один товар можно показать на разных языковых версиях сайта без копий его цены.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->format(1234.5), "\n";
Ожидаемый результат
1,234.5
Исходное число не меняется: запятые и точка появляются только в возвращённой строке.
<?php
declare(strict_types=1);
$formatter = numfmt_create("de_DE", NumberFormatter::DECIMAL);
echo numfmt_format($formatter, 1234.5), "\n";
Ожидаемый результат
1.234,5
Локализация — не произвольная замена точки на запятую: меняются группировка, цифры и правила разных стилей.
Рядом по задаче: NumberFormatter::format, NumberFormatter::formatCurrency.
NumberFormatter::createПодготовить представление чисел под язык посетителя: каталог, отчёт, процент или сумма.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static NumberFormatter::create(string $locale, int $style, ?string $pattern = null): ?NumberFormatter| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Строка вроде en_US/de_DE выбирает десятичный разделитель, группировку, цифры и названия. Правила берутся из ICU/CLDR; явно задавайте локаль интерфейса, а не полагайтесь на окружение сервера. |
| style,pattern | DECIMAL, CURRENCY, PERCENT, SCIENTIFIC и другие стили перечислены ниже. Для PATTERN_DECIMAL нужен шаблон ICU DecimalFormat, для PATTERN_RULEBASED — правила ICU RuleBasedNumberFormat. pattern=null допустим, если стиль не требует шаблона. |
| Возврат / ошибки | new создаёт объект; static create/numfmt_create возвращают NumberFormatter либо null. PHP 8.4+ неверная локаль может вызвать ValueError. Проверяйте создание до вызова format. |
Начинаем с задачи и одного вызова
В каталоге есть число 1250.5. Для покупателя с американскими настройками хотим показать 1,250.5. Сначала готовим инструмент с нужными правилами; это создание объекта, оно ещё ничего не печатает.
| Запись в примере | Что именно происходит |
|---|---|
| new NumberFormatter(...) / NumberFormatter::create(...) | Два способа получить настроенный форматтер. new вызывает конструктор; create — статическую фабрику, которая может вернуть null. |
| "en_US" | Выбирает английские правила США: разделитель тысяч — запятая, дробной части — точка. |
| NumberFormatter::DECIMAL | Выбирает обычное число. Это именованная настройка, а не сама сумма. |
| $formatter->format(1250.5) | Передаёт число созданному инструменту и получает строку. echo делает её видимой. |
<?php
declare(strict_types=1);
$formatter = NumberFormatter::create("en_US", NumberFormatter::DECIMAL);
echo $formatter->format(1250.5), "
";
Ожидаемый результат
1,250.5
Вход — число 1250.5; результат — строка 1,250.5. Её можно поставить рядом с подписью количества или суммы в шаблоне страницы.
<?php
declare(strict_types=1);
$formatter = NumberFormatter::create("en_US", NumberFormatter::DECIMAL);
echo "Чай: ", $formatter->format(1250.5), "
";
echo "Кофе: ", $formatter->format(2400), "
";
Ожидаемый результат
Чай: 1,250.5
Кофе: 2,400
Объект создаётся один раз. Каждый вызов получает новое число, а правила остаются одинаковыми: каталог оформлен согласованно.
<?php
declare(strict_types=1);
$price = 1250.5;
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
echo "Цена: ", $formatter->format($price), "
";
echo "В программе: ", $price, "
";
Ожидаемый результат
Цена: 1.250,5
В программе: 1250.5
Изменилось оформление, а значение переменной price осталось прежним. Так один товар можно показать на разных языковых версиях сайта без копий его цены.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->format(1234.5), "\n";
Ожидаемый результат
1,234.5
Исходное число не меняется: запятые и точка появляются только в возвращённой строке.
<?php
declare(strict_types=1);
$formatter = numfmt_create("de_DE", NumberFormatter::DECIMAL);
echo numfmt_format($formatter, 1234.5), "\n";
Ожидаемый результат
1.234,5
Локализация — не произвольная замена точки на запятую: меняются группировка, цифры и правила разных стилей.
Тот же механизм в процедурной форме: numfmt_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::format, NumberFormatter::formatCurrency.
numfmt_createПодготовить представление чисел под язык посетителя: каталог, отчёт, процент или сумма.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_create(string $locale, int $style, ?string $pattern = null): ?NumberFormatterПроцедурная форма NumberFormatter::create. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Строка вроде en_US/de_DE выбирает десятичный разделитель, группировку, цифры и названия. Правила берутся из ICU/CLDR; явно задавайте локаль интерфейса, а не полагайтесь на окружение сервера. |
| style,pattern | DECIMAL, CURRENCY, PERCENT, SCIENTIFIC и другие стили перечислены ниже. Для PATTERN_DECIMAL нужен шаблон ICU DecimalFormat, для PATTERN_RULEBASED — правила ICU RuleBasedNumberFormat. pattern=null допустим, если стиль не требует шаблона. |
| Возврат / ошибки | new создаёт объект; static create/numfmt_create возвращают NumberFormatter либо null. PHP 8.4+ неверная локаль может вызвать ValueError. Проверяйте создание до вызова format. |
Начинаем с задачи и одного вызова
В каталоге есть число 1250.5. Для покупателя с американскими настройками хотим показать 1,250.5. Сначала готовим инструмент с нужными правилами; это создание объекта, оно ещё ничего не печатает.
| Запись в примере | Что именно происходит |
|---|---|
| new NumberFormatter(...) / NumberFormatter::create(...) | Два способа получить настроенный форматтер. new вызывает конструктор; create — статическую фабрику, которая может вернуть null. |
| "en_US" | Выбирает английские правила США: разделитель тысяч — запятая, дробной части — точка. |
| NumberFormatter::DECIMAL | Выбирает обычное число. Это именованная настройка, а не сама сумма. |
| $formatter->format(1250.5) | Передаёт число созданному инструменту и получает строку. echo делает её видимой. |
<?php
declare(strict_types=1);
$formatter = NumberFormatter::create("en_US", NumberFormatter::DECIMAL);
echo $formatter->format(1250.5), "
";
Ожидаемый результат
1,250.5
Вход — число 1250.5; результат — строка 1,250.5. Её можно поставить рядом с подписью количества или суммы в шаблоне страницы.
<?php
declare(strict_types=1);
$formatter = NumberFormatter::create("en_US", NumberFormatter::DECIMAL);
echo "Чай: ", $formatter->format(1250.5), "
";
echo "Кофе: ", $formatter->format(2400), "
";
Ожидаемый результат
Чай: 1,250.5
Кофе: 2,400
Объект создаётся один раз. Каждый вызов получает новое число, а правила остаются одинаковыми: каталог оформлен согласованно.
<?php
declare(strict_types=1);
$price = 1250.5;
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
echo "Цена: ", $formatter->format($price), "
";
echo "В программе: ", $price, "
";
Ожидаемый результат
Цена: 1.250,5
В программе: 1250.5
Изменилось оформление, а значение переменной price осталось прежним. Так один товар можно показать на разных языковых версиях сайта без копий его цены.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->format(1234.5), "\n";
Ожидаемый результат
1,234.5
Исходное число не меняется: запятые и точка появляются только в возвращённой строке.
<?php
declare(strict_types=1);
$formatter = numfmt_create("de_DE", NumberFormatter::DECIMAL);
echo numfmt_format($formatter, 1234.5), "\n";
Ожидаемый результат
1.234,5
Локализация — не произвольная замена точки на запятую: меняются группировка, цифры и правила разных стилей.
Тот же механизм в процедурной форме: numfmt_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::format, NumberFormatter::formatCurrency.
NumberFormatter::formatПолучить строку для пользователя, сохранив число для вычислений отдельно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::format(int|float $num, int $type = NumberFormatter::TYPE_DEFAULT): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| num | int|float; с strict_types передавайте именно числовой тип. Форматированная строка предназначена для отображения, не для SQL/API-числа. |
| type | TYPE_DEFAULT выбирает по значению, либо TYPE_INT32/INT64/DOUBLE. TYPE_CURRENCY здесь не поддержан: нужен formatCurrency. |
| Возврат | string либо false. Округление задаётся стилем/атрибутами; это не исправление точности двоичного float. |
Начинаем с задачи и одного вызова
Значение для расчёта и надпись на странице — разные данные. Метод format превращает уже имеющееся число в строку для человека.
| Запись в примере | Что именно происходит |
|---|---|
| $amount = 1234.5; | Число остаётся доступно арифметике. |
| $text = $formatter->format($amount); | Метод возвращает строку в text; сам ничего не выводит. |
| echo "Сумма: ", $text; | Подставляем подготовленную строку в понятную подпись. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = 1234.5;
$text = $formatter->format($amount);
echo "Сумма: ", $text, "
";
Ожидаемый результат
Сумма: 1,234.5
На экран идёт text. Для следующего расчёта используем amount, а не строку с разделителями.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$unitPrice = 1200.5;
$quantity = 2;
$total = $unitPrice * $quantity;
echo "Два товара: ", $formatter->format($total), "
";
Ожидаемый результат
Два товара: 2,401
Оператор * умножил два числовых значения. Только готовый total превращён в надпись карточки заказа.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::PERCENT);
$completed = 3;
$total = 4;
$share = $completed / $total;
echo "Загрузка: ", $formatter->format($share), "
";
Ожидаемый результат
Загрузка: 75%
3 / 4 даёт долю 0.75. Стиль PERCENT превращает именно долю в проценты; 75 на входе означало бы 7,500%. Для total=0 сначала нужно выбрать смысл пустого задания, а не делить на ноль.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->format(12345.6), "\n";
Ожидаемый результат
12,345.6
Сохраняйте результат в переменную или выводите echo; метод сам не печатает.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::PERCENT);
echo numfmt_format($formatter, 0.25), "\n";
Ожидаемый результат
25%
Для percent вход 0.25 означает 25 процентов; передав 25,получите 2500 процентов. Разница единиц должна быть объяснена в форме.
Тот же механизм в процедурной форме: numfmt_format. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setAttribute, NumberFormatter::parse.
numfmt_formatПолучить строку для пользователя, сохранив число для вычислений отдельно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_format(NumberFormatter $formatter, int|float $num, int $type = NumberFormatter::TYPE_DEFAULT): string|falseПроцедурная форма NumberFormatter::format. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| num | int|float; с strict_types передавайте именно числовой тип. Форматированная строка предназначена для отображения, не для SQL/API-числа. |
| type | TYPE_DEFAULT выбирает по значению, либо TYPE_INT32/INT64/DOUBLE. TYPE_CURRENCY здесь не поддержан: нужен formatCurrency. |
| Возврат | string либо false. Округление задаётся стилем/атрибутами; это не исправление точности двоичного float. |
Начинаем с задачи и одного вызова
Значение для расчёта и надпись на странице — разные данные. Метод format превращает уже имеющееся число в строку для человека.
| Запись в примере | Что именно происходит |
|---|---|
| $amount = 1234.5; | Число остаётся доступно арифметике. |
| $text = $formatter->format($amount); | Метод возвращает строку в text; сам ничего не выводит. |
| echo "Сумма: ", $text; | Подставляем подготовленную строку в понятную подпись. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = 1234.5;
$text = $formatter->format($amount);
echo "Сумма: ", $text, "
";
Ожидаемый результат
Сумма: 1,234.5
На экран идёт text. Для следующего расчёта используем amount, а не строку с разделителями.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$unitPrice = 1200.5;
$quantity = 2;
$total = $unitPrice * $quantity;
echo "Два товара: ", $formatter->format($total), "
";
Ожидаемый результат
Два товара: 2,401
Оператор * умножил два числовых значения. Только готовый total превращён в надпись карточки заказа.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::PERCENT);
$completed = 3;
$total = 4;
$share = $completed / $total;
echo "Загрузка: ", $formatter->format($share), "
";
Ожидаемый результат
Загрузка: 75%
3 / 4 даёт долю 0.75. Стиль PERCENT превращает именно долю в проценты; 75 на входе означало бы 7,500%. Для total=0 сначала нужно выбрать смысл пустого задания, а не делить на ноль.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->format(12345.6), "\n";
Ожидаемый результат
12,345.6
Сохраняйте результат в переменную или выводите echo; метод сам не печатает.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::PERCENT);
echo numfmt_format($formatter, 0.25), "\n";
Ожидаемый результат
25%
Для percent вход 0.25 означает 25 процентов; передав 25,получите 2500 процентов. Разница единиц должна быть объяснена в форме.
Тот же механизм в процедурной форме: numfmt_format. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setAttribute, NumberFormatter::parse.
NumberFormatter::parseПрочитать локализованное число из поля формы, когда посетитель вводит привычные ему разделители.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::parse(string $string, int $type = NumberFormatter::TYPE_DOUBLE, &$offset = null): int|float|false| Аргумент или результат | Что означает на практике |
|---|---|
| string | Текст в формате выбранной locale. Не угадывайте локаль по наличию одной запятой:1,234 в разных странах означает разные значения. |
| type | TYPE_DOUBLE по умолчанию, TYPE_INT32/INT64 для целых. TYPE_CURRENCY не поддержан. |
| offset | Параметр по ссылке: начальная позиция и позиция конца разбора. ICU использует UTF-16 code units, не байты UTF-8. Парсер может успешно прочитать только префикс! Для строгого поля проверяйте полный разбор в правильных единицах. |
| Возврат | int|float|false. Ноль допустим, проверка ===false обязательна. Успешный parse не проверяет бизнес-диапазон, валюту, отсутствие дроби или права пользователя. |
Начинаем с задачи и одного вызова
Посетитель немецкой версии калькулятора вводит ширину "12,5". В PHP это строка с запятой; умножать её как корректное число нельзя. parse читает запись по известным правилам.
| Запись в примере | Что именно происходит |
|---|---|
| $input = "12,5"; | Текст поля. Кавычки показывают, что это строка, а не число PHP. |
| $width = $formatter->parse($input); | Получаем числовое значение 12.5 или false при неудаче. |
| $offset | Выходная переменная по ссылке показывает, до какого места парсер дошёл. Для строгого поля нужен весь ввод, не только начало. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$width = $formatter->parse("12,5");
echo "Ширина для вычислений: ", $width, "
";
Ожидаемый результат
Ширина для вычислений: 12.5
Заранее корректное учебное значение становится числом. Следующий шаг показывает, как обращаться с полем, которое пользователь действительно может испортить.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$input = "12,5";
$offset = 0;
$width = $formatter->parse($input, NumberFormatter::TYPE_DOUBLE, $offset);
if ($width === false || $offset !== strlen($input) || $width <= 0) {
echo "Введите положительную ширину, например 12,5.
";
} else {
echo "Площадь при длине 2 м: ", $formatter->format($width * 2), " м²
";
}
Ожидаемый результат
Площадь при длине 2 м: 25 м²
Здесь договор поля — только ASCII-цифры и разделители, поэтому strlen совпадает с единицами offset. Для произвольного Unicode длина должна измеряться в UTF-16. После проверки число идёт в расчёт, затем результат снова оформляется для читателя.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$input = "12,5kg";
$offset = 0;
$value = $formatter->parse($input, NumberFormatter::TYPE_DOUBLE, $offset);
if ($value === false || $offset !== strlen($input)) {
echo "Введите только число: единицу измерения выбирают отдельно.
";
}
Ожидаемый результат
Введите только число: единицу измерения выбирают отдельно.
Сам parse может прочитать 12,5 и остановиться перед kg. Проверка конца не даёт отправить частично прочитанное значение в расчёт.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$value = $formatter->parse("12,5");
var_dump($value);
Ожидаемый результат
float(12.5)
После parse PHP работает с числом независимо от того, какая запятая была в форме.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$text = "12.5kg";
$offset = 0;
$value = numfmt_parse($formatter, $text, NumberFormatter::TYPE_DOUBLE, $offset);
echo $offset, "\n";
echo $value !== false && $offset === strlen($text) ? "complete\n" : "trailing input\n";
Ожидаемый результат
4
trailing input
strlen здесь корректен только потому, что строка целиком ASCII. Для Unicode сравнивайте offset с длиной UTF-16, не копируйте это сравнение вслепую.
Тот же механизм в процедурной форме: numfmt_parse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::parseCurrency, NumberFormatter::getErrorCode.
numfmt_parseПрочитать локализованное число из поля формы, когда посетитель вводит привычные ему разделители.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_parse(NumberFormatter $formatter, string $string, int $type = NumberFormatter::TYPE_DOUBLE, &$offset = null): int|float|falseПроцедурная форма NumberFormatter::parse. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string | Текст в формате выбранной locale. Не угадывайте локаль по наличию одной запятой:1,234 в разных странах означает разные значения. |
| type | TYPE_DOUBLE по умолчанию, TYPE_INT32/INT64 для целых. TYPE_CURRENCY не поддержан. |
| offset | Параметр по ссылке: начальная позиция и позиция конца разбора. ICU использует UTF-16 code units, не байты UTF-8. Парсер может успешно прочитать только префикс! Для строгого поля проверяйте полный разбор в правильных единицах. |
| Возврат | int|float|false. Ноль допустим, проверка ===false обязательна. Успешный parse не проверяет бизнес-диапазон, валюту, отсутствие дроби или права пользователя. |
Начинаем с задачи и одного вызова
Посетитель немецкой версии калькулятора вводит ширину "12,5". В PHP это строка с запятой; умножать её как корректное число нельзя. parse читает запись по известным правилам.
| Запись в примере | Что именно происходит |
|---|---|
| $input = "12,5"; | Текст поля. Кавычки показывают, что это строка, а не число PHP. |
| $width = $formatter->parse($input); | Получаем числовое значение 12.5 или false при неудаче. |
| $offset | Выходная переменная по ссылке показывает, до какого места парсер дошёл. Для строгого поля нужен весь ввод, не только начало. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$width = $formatter->parse("12,5");
echo "Ширина для вычислений: ", $width, "
";
Ожидаемый результат
Ширина для вычислений: 12.5
Заранее корректное учебное значение становится числом. Следующий шаг показывает, как обращаться с полем, которое пользователь действительно может испортить.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$input = "12,5";
$offset = 0;
$width = $formatter->parse($input, NumberFormatter::TYPE_DOUBLE, $offset);
if ($width === false || $offset !== strlen($input) || $width <= 0) {
echo "Введите положительную ширину, например 12,5.
";
} else {
echo "Площадь при длине 2 м: ", $formatter->format($width * 2), " м²
";
}
Ожидаемый результат
Площадь при длине 2 м: 25 м²
Здесь договор поля — только ASCII-цифры и разделители, поэтому strlen совпадает с единицами offset. Для произвольного Unicode длина должна измеряться в UTF-16. После проверки число идёт в расчёт, затем результат снова оформляется для читателя.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$input = "12,5kg";
$offset = 0;
$value = $formatter->parse($input, NumberFormatter::TYPE_DOUBLE, $offset);
if ($value === false || $offset !== strlen($input)) {
echo "Введите только число: единицу измерения выбирают отдельно.
";
}
Ожидаемый результат
Введите только число: единицу измерения выбирают отдельно.
Сам parse может прочитать 12,5 и остановиться перед kg. Проверка конца не даёт отправить частично прочитанное значение в расчёт.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$value = $formatter->parse("12,5");
var_dump($value);
Ожидаемый результат
float(12.5)
После parse PHP работает с числом независимо от того, какая запятая была в форме.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$text = "12.5kg";
$offset = 0;
$value = numfmt_parse($formatter, $text, NumberFormatter::TYPE_DOUBLE, $offset);
echo $offset, "\n";
echo $value !== false && $offset === strlen($text) ? "complete\n" : "trailing input\n";
Ожидаемый результат
4
trailing input
strlen здесь корректен только потому, что строка целиком ASCII. Для Unicode сравнивайте offset с длиной UTF-16, не копируйте это сравнение вслепую.
Тот же механизм в процедурной форме: numfmt_parse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::parseCurrency, NumberFormatter::getErrorCode.
NumberFormatter::formatCurrencyПоказать цену с правильным положением валюты и количеством знаков по её правилам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::formatCurrency(float $amount, string $currency): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| amount,currency | Сумма float и трёхбуквенный код ISO4217, например USD/EUR/JPY. Локаль отвечает за вид записи, код — за валюту; en_US не превращает EUR в USD. |
| Возврат | string|false. Метод не переводит валюты по курсу. Финансовые расчёты храните в целых минимальных единицах/точном decimal; передача float здесь — только этап отображения. |
Начинаем с задачи и одного вызова
В заказе есть сумма и валюта. Покупателю нужна подпись $12.50, а не просто 12.5; валютный форматтер добавит символ и нужные дробные знаки.
| Запись в примере | Что именно происходит |
|---|---|
| 12.5 | Сумма для отображения. Метод её не переводит по курсу. |
| "USD" | Код валюты, выбранный заказом. Locale en_US отвечает за запись, а не за валюту денег. |
| formatCurrency($amount, $currency) | Возвращает готовую строку; её используем только на границе интерфейса. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
echo "Цена: ", $formatter->formatCurrency(12.5, "USD"), "
";
Ожидаемый результат
Цена: $12.50
Два дробных знака относятся к выбранному валютному представлению, а не меняют число 12.5.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$itemCents = 1250;
$deliveryCents = 300;
$totalCents = $itemCents + $deliveryCents;
echo "Товары: ", $formatter->formatCurrency($itemCents / 100, "USD"), "
";
echo "К оплате: ", $formatter->formatCurrency($totalCents / 100, "USD"), "
";
Ожидаемый результат
Товары: $12.50
К оплате: $15.50
Сложение выполнено в целых центах; деление на 100 происходит только для показа USD. В платёжную интеграцию отправляют величину в единицах её договора, а не строку "$15.50".
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
echo "USD: ", $formatter->formatCurrency(12.5, "USD"), "
";
echo "EUR: ", $formatter->formatCurrency(12.5, "EUR"), "
";
Ожидаемый результат
USD: $12.50
EUR: €12.50
Одна локаль показала две разные валюты. Суммы одинаковы только потому, что мы так передали; обменного курса здесь нет.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(12.5, "USD"), "\n";
Ожидаемый результат
$12.50
USD выбран явно; код не получает курс и не вычисляет налог.
<?php
declare(strict_types=1);
$cents = 1250;
$formatter = numfmt_create("en_US", NumberFormatter::CURRENCY);
echo numfmt_format_currency($formatter, $cents / 100, "USD"), "\n";
Ожидаемый результат
$12.50
Деление на 100 подходит выбранной валюте с двумя дробными разрядами. Нельзя считать это правилом для всех валют.
Тот же механизм в процедурной форме: numfmt_format_currency. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::parseCurrency, NumberFormatter::setAttribute.
numfmt_format_currencyПоказать цену с правильным положением валюты и количеством знаков по её правилам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_format_currency(NumberFormatter $formatter, float $amount, string $currency): string|falseПроцедурная форма NumberFormatter::formatCurrency. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| amount,currency | Сумма float и трёхбуквенный код ISO4217, например USD/EUR/JPY. Локаль отвечает за вид записи, код — за валюту; en_US не превращает EUR в USD. |
| Возврат | string|false. Метод не переводит валюты по курсу. Финансовые расчёты храните в целых минимальных единицах/точном decimal; передача float здесь — только этап отображения. |
Начинаем с задачи и одного вызова
В заказе есть сумма и валюта. Покупателю нужна подпись $12.50, а не просто 12.5; валютный форматтер добавит символ и нужные дробные знаки.
| Запись в примере | Что именно происходит |
|---|---|
| 12.5 | Сумма для отображения. Метод её не переводит по курсу. |
| "USD" | Код валюты, выбранный заказом. Locale en_US отвечает за запись, а не за валюту денег. |
| formatCurrency($amount, $currency) | Возвращает готовую строку; её используем только на границе интерфейса. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
echo "Цена: ", $formatter->formatCurrency(12.5, "USD"), "
";
Ожидаемый результат
Цена: $12.50
Два дробных знака относятся к выбранному валютному представлению, а не меняют число 12.5.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$itemCents = 1250;
$deliveryCents = 300;
$totalCents = $itemCents + $deliveryCents;
echo "Товары: ", $formatter->formatCurrency($itemCents / 100, "USD"), "
";
echo "К оплате: ", $formatter->formatCurrency($totalCents / 100, "USD"), "
";
Ожидаемый результат
Товары: $12.50
К оплате: $15.50
Сложение выполнено в целых центах; деление на 100 происходит только для показа USD. В платёжную интеграцию отправляют величину в единицах её договора, а не строку "$15.50".
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
echo "USD: ", $formatter->formatCurrency(12.5, "USD"), "
";
echo "EUR: ", $formatter->formatCurrency(12.5, "EUR"), "
";
Ожидаемый результат
USD: $12.50
EUR: €12.50
Одна локаль показала две разные валюты. Суммы одинаковы только потому, что мы так передали; обменного курса здесь нет.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
echo $formatter->formatCurrency(12.5, "USD"), "\n";
Ожидаемый результат
$12.50
USD выбран явно; код не получает курс и не вычисляет налог.
<?php
declare(strict_types=1);
$cents = 1250;
$formatter = numfmt_create("en_US", NumberFormatter::CURRENCY);
echo numfmt_format_currency($formatter, $cents / 100, "USD"), "\n";
Ожидаемый результат
$12.50
Деление на 100 подходит выбранной валюте с двумя дробными разрядами. Нельзя считать это правилом для всех валют.
Тот же механизм в процедурной форме: numfmt_format_currency. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::parseCurrency, NumberFormatter::setAttribute.
NumberFormatter::parseCurrencyПрочитать сумму вместе с распознанной валютой, а затем проверить её против ожидаемой.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::parseCurrency(string $string, &$currency, &$offset = null): float|false| Аргумент или результат | Что означает на практике |
|---|---|
| string | Локализованная денежная строка; символ $ сам по себе неоднозначен без locale. |
| currency | Строковая переменная по ссылке получает ISO4217 код. Инициализируйте её и проверьте после успешного разбора. |
| offset | По ссылке начальная/конечная позиция в UTF-16 единицах; проверяйте хвост, как в parse. |
| Возврат | float|false. Успех не означает, что валюта подходит заказу или что результат точный decimal. Поле с фиксированной валютой проще принимать отдельно от её символа. |
Начинаем с задачи и одного вызова
При импорте отчёта может прийти строка "$12.50". Нужно отдельно получить сумму и код валюты, а затем убедиться, что валюта подходит документу.
| Запись в примере | Что именно происходит |
|---|---|
| $currency = ""; | Готовим переменную, куда метод запишет распознанную валюту. |
| $amount = ...parseCurrency($input, $currency, $offset); | Главный return — сумма. По ссылке также меняются currency и offset. |
| $currency === "USD" | Наше правило импорта; парсер сам не знает валюту целевого счёта. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$currency = "";
$amount = $formatter->parseCurrency("$12.50", $currency);
echo "Сумма: ", $amount, "
";
echo "Валюта: ", $currency, "
";
Ожидаемый результат
Сумма: 12.5
Валюта: USD
В файле была одна строка, после разбора доступны два смысловых поля: amount и currency.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$input = "$12.50";
$currency = "";
$offset = 0;
$amount = $formatter->parseCurrency($input, $currency, $offset);
if ($amount === false || $offset !== strlen($input) || $currency !== "USD") {
echo "Строка не подходит для счёта в USD.
";
} else {
echo "Принято в отчёт: ", $formatter->formatCurrency($amount, "USD"), "
";
}
Ожидаемый результат
Принято в отчёт: $12.50
Текст примера ASCII: поэтому strlen допустим для проверки offset. Структурированную сумму можно передать следующему шагу импорта; точный денежный учёт всё равно требует своей decimal/минимальной единицы.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$currency = "";
$amount = $formatter->parseCurrency("$12.50", $currency);
$expectedCurrency = "EUR";
if ($amount !== false && $currency !== $expectedCurrency) {
echo "Ожидали EUR, получили ", $currency, ": строка отклонена.
";
}
Ожидаемый результат
Ожидали EUR, получили USD: строка отклонена.
В интерфейсе импорта читатель увидит причину, а сумма не будет молча считаться евро.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$currency = "";
$offset = 0;
$amount = $formatter->parseCurrency("$12.50", $currency, $offset);
echo $amount, " ", $currency, " ", $offset, "\n";
Ожидаемый результат
12.5 USD 6
Метод вернул число, а два дополнительных результата записал в переданные переменные.
<?php
declare(strict_types=1);
$formatter = numfmt_create("en_US", NumberFormatter::CURRENCY);
$currency = "";
$offset = 0;
$amount = numfmt_parse_currency($formatter, "$12.50", $currency, $offset);
echo $amount !== false && $currency === "EUR" ? "accepted\n" : "currency mismatch\n";
Ожидаемый результат
currency mismatch
Проверка ожидаемой валюты — логика приложения, а не парсера.
Тот же механизм в процедурной форме: numfmt_parse_currency. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::parse, NumberFormatter::formatCurrency.
numfmt_parse_currencyПрочитать сумму вместе с распознанной валютой, а затем проверить её против ожидаемой.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_parse_currency(NumberFormatter $formatter, string $string, &$currency, &$offset = null): float|falseПроцедурная форма NumberFormatter::parseCurrency. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string | Локализованная денежная строка; символ $ сам по себе неоднозначен без locale. |
| currency | Строковая переменная по ссылке получает ISO4217 код. Инициализируйте её и проверьте после успешного разбора. |
| offset | По ссылке начальная/конечная позиция в UTF-16 единицах; проверяйте хвост, как в parse. |
| Возврат | float|false. Успех не означает, что валюта подходит заказу или что результат точный decimal. Поле с фиксированной валютой проще принимать отдельно от её символа. |
Начинаем с задачи и одного вызова
При импорте отчёта может прийти строка "$12.50". Нужно отдельно получить сумму и код валюты, а затем убедиться, что валюта подходит документу.
| Запись в примере | Что именно происходит |
|---|---|
| $currency = ""; | Готовим переменную, куда метод запишет распознанную валюту. |
| $amount = ...parseCurrency($input, $currency, $offset); | Главный return — сумма. По ссылке также меняются currency и offset. |
| $currency === "USD" | Наше правило импорта; парсер сам не знает валюту целевого счёта. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$currency = "";
$amount = $formatter->parseCurrency("$12.50", $currency);
echo "Сумма: ", $amount, "
";
echo "Валюта: ", $currency, "
";
Ожидаемый результат
Сумма: 12.5
Валюта: USD
В файле была одна строка, после разбора доступны два смысловых поля: amount и currency.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$input = "$12.50";
$currency = "";
$offset = 0;
$amount = $formatter->parseCurrency($input, $currency, $offset);
if ($amount === false || $offset !== strlen($input) || $currency !== "USD") {
echo "Строка не подходит для счёта в USD.
";
} else {
echo "Принято в отчёт: ", $formatter->formatCurrency($amount, "USD"), "
";
}
Ожидаемый результат
Принято в отчёт: $12.50
Текст примера ASCII: поэтому strlen допустим для проверки offset. Структурированную сумму можно передать следующему шагу импорта; точный денежный учёт всё равно требует своей decimal/минимальной единицы.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$currency = "";
$amount = $formatter->parseCurrency("$12.50", $currency);
$expectedCurrency = "EUR";
if ($amount !== false && $currency !== $expectedCurrency) {
echo "Ожидали EUR, получили ", $currency, ": строка отклонена.
";
}
Ожидаемый результат
Ожидали EUR, получили USD: строка отклонена.
В интерфейсе импорта читатель увидит причину, а сумма не будет молча считаться евро.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
$currency = "";
$offset = 0;
$amount = $formatter->parseCurrency("$12.50", $currency, $offset);
echo $amount, " ", $currency, " ", $offset, "\n";
Ожидаемый результат
12.5 USD 6
Метод вернул число, а два дополнительных результата записал в переданные переменные.
<?php
declare(strict_types=1);
$formatter = numfmt_create("en_US", NumberFormatter::CURRENCY);
$currency = "";
$offset = 0;
$amount = numfmt_parse_currency($formatter, "$12.50", $currency, $offset);
echo $amount !== false && $currency === "EUR" ? "accepted\n" : "currency mismatch\n";
Ожидаемый результат
currency mismatch
Проверка ожидаемой валюты — логика приложения, а не парсера.
Тот же механизм в процедурной форме: numfmt_parse_currency. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::parse, NumberFormatter::formatCurrency.
NumberFormatter::setAttributeНастроить количество знаков, группировку или округление под договор отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::setAttribute(int $attribute, int|float $value): bool| Аргумент или результат | Что означает на практике |
|---|---|
| attribute | ID числового атрибута: FRACTION_DIGITS, GROUPING_USED, ROUNDING_MODE и другие из таблицы класса. Значение int/float у setter, у getter только ID. |
| Возврат | setAttribute bool; getAttribute int|float|false. Нулевое значение нормально. Не все стили поддерживают все атрибуты; rule-based имеют ограничения. |
| Порядок | Сначала locale/style/pattern, затем осознанные изменения атрибутов. Последующий новый pattern может изменить связанные атрибуты. |
Начинаем с задачи и одного вызова
В таблице веса все строки должны иметь ровно два дробных знака: 12.50 и 3.00. Числовые атрибуты задают такие правила; getter позволяет их прочитать и объяснить настройку пользователю.
| Запись в примере | Что именно происходит |
|---|---|
| NumberFormatter::FRACTION_DIGITS | Имя нужной настройки: число разрядов после разделителя. |
| setAttribute(..., 2) | Меняет настройку существующего объекта; не форматирует число сам. |
| getAttribute(...) | Возвращает текущее число разрядов. Оно может быть 0, поэтому false проверяют строго. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$digits = $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS);
echo "Дробных знаков: ", $digits, "
";
echo "Вес: ", $formatter->format(12.5), " кг
";
Ожидаемый результат
Дробных знаков: 2
Вес: 12.50 кг
Настройка 2 становится заметна в результате 12.50. Данные веса остаются числом.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
echo "Коробка A: ", $formatter->format(12.5), " кг
";
echo "Коробка B: ", $formatter->format(3), " кг
";
Ожидаемый результат
Коробка A: 12.50 кг
Коробка B: 3.00 кг
Один профиль оформления применяется ко всем строкам. Если нужен иной профиль соседнего отчёта, создайте отдельный форматтер, чтобы не менять этот незаметно.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
echo "Исходный вес: 2.5 кг
";
echo "Округлённая подпись: ", $formatter->format(2.5), " кг
";
Ожидаемый результат
Исходный вес: 2.5 кг
Округлённая подпись: 3 кг
Меняется строка отчёта. Если склад обязан хранить точный вес, в хранилище остаётся 2.5: оформление не должно подменять измерение.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
echo $formatter->format(12.5), "\n";
echo $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS), "\n";
Ожидаемый результат
12.50
2
FRACTION_DIGITS одновременно задаёт минимальное и максимальное число дробных разрядов.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_attribute($formatter, NumberFormatter::FRACTION_DIGITS, 0);
numfmt_set_attribute($formatter, NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
echo numfmt_format($formatter, 2.5), "\n";
Ожидаемый результат
3
Режим округления должен быть частью договора; интерфейс не должен молча менять правила финансового расчёта.
Тот же механизм в процедурной форме: numfmt_set_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setPattern, NumberFormatter::format.
numfmt_set_attributeНастроить количество знаков, группировку или округление под договор отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_set_attribute(NumberFormatter $formatter, int $attribute, int|float $value): boolПроцедурная форма NumberFormatter::setAttribute. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| attribute | ID числового атрибута: FRACTION_DIGITS, GROUPING_USED, ROUNDING_MODE и другие из таблицы класса. Значение int/float у setter, у getter только ID. |
| Возврат | setAttribute bool; getAttribute int|float|false. Нулевое значение нормально. Не все стили поддерживают все атрибуты; rule-based имеют ограничения. |
| Порядок | Сначала locale/style/pattern, затем осознанные изменения атрибутов. Последующий новый pattern может изменить связанные атрибуты. |
Начинаем с задачи и одного вызова
В таблице веса все строки должны иметь ровно два дробных знака: 12.50 и 3.00. Числовые атрибуты задают такие правила; getter позволяет их прочитать и объяснить настройку пользователю.
| Запись в примере | Что именно происходит |
|---|---|
| NumberFormatter::FRACTION_DIGITS | Имя нужной настройки: число разрядов после разделителя. |
| setAttribute(..., 2) | Меняет настройку существующего объекта; не форматирует число сам. |
| getAttribute(...) | Возвращает текущее число разрядов. Оно может быть 0, поэтому false проверяют строго. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$digits = $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS);
echo "Дробных знаков: ", $digits, "
";
echo "Вес: ", $formatter->format(12.5), " кг
";
Ожидаемый результат
Дробных знаков: 2
Вес: 12.50 кг
Настройка 2 становится заметна в результате 12.50. Данные веса остаются числом.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
echo "Коробка A: ", $formatter->format(12.5), " кг
";
echo "Коробка B: ", $formatter->format(3), " кг
";
Ожидаемый результат
Коробка A: 12.50 кг
Коробка B: 3.00 кг
Один профиль оформления применяется ко всем строкам. Если нужен иной профиль соседнего отчёта, создайте отдельный форматтер, чтобы не менять этот незаметно.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
echo "Исходный вес: 2.5 кг
";
echo "Округлённая подпись: ", $formatter->format(2.5), " кг
";
Ожидаемый результат
Исходный вес: 2.5 кг
Округлённая подпись: 3 кг
Меняется строка отчёта. Если склад обязан хранить точный вес, в хранилище остаётся 2.5: оформление не должно подменять измерение.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
echo $formatter->format(12.5), "\n";
echo $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS), "\n";
Ожидаемый результат
12.50
2
FRACTION_DIGITS одновременно задаёт минимальное и максимальное число дробных разрядов.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_attribute($formatter, NumberFormatter::FRACTION_DIGITS, 0);
numfmt_set_attribute($formatter, NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
echo numfmt_format($formatter, 2.5), "\n";
Ожидаемый результат
3
Режим округления должен быть частью договора; интерфейс не должен молча менять правила финансового расчёта.
Тот же механизм в процедурной форме: numfmt_set_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setPattern, NumberFormatter::format.
NumberFormatter::getAttributeНастроить количество знаков, группировку или округление под договор отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::getAttribute(int $attribute): int|float|false| Аргумент или результат | Что означает на практике |
|---|---|
| attribute | ID числового атрибута: FRACTION_DIGITS, GROUPING_USED, ROUNDING_MODE и другие из таблицы класса. Значение int/float у setter, у getter только ID. |
| Возврат | setAttribute bool; getAttribute int|float|false. Нулевое значение нормально. Не все стили поддерживают все атрибуты; rule-based имеют ограничения. |
| Порядок | Сначала locale/style/pattern, затем осознанные изменения атрибутов. Последующий новый pattern может изменить связанные атрибуты. |
Начинаем с задачи и одного вызова
В таблице веса все строки должны иметь ровно два дробных знака: 12.50 и 3.00. Числовые атрибуты задают такие правила; getter позволяет их прочитать и объяснить настройку пользователю.
| Запись в примере | Что именно происходит |
|---|---|
| NumberFormatter::FRACTION_DIGITS | Имя нужной настройки: число разрядов после разделителя. |
| setAttribute(..., 2) | Меняет настройку существующего объекта; не форматирует число сам. |
| getAttribute(...) | Возвращает текущее число разрядов. Оно может быть 0, поэтому false проверяют строго. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$digits = $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS);
echo "Дробных знаков: ", $digits, "
";
echo "Вес: ", $formatter->format(12.5), " кг
";
Ожидаемый результат
Дробных знаков: 2
Вес: 12.50 кг
Настройка 2 становится заметна в результате 12.50. Данные веса остаются числом.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
echo "Коробка A: ", $formatter->format(12.5), " кг
";
echo "Коробка B: ", $formatter->format(3), " кг
";
Ожидаемый результат
Коробка A: 12.50 кг
Коробка B: 3.00 кг
Один профиль оформления применяется ко всем строкам. Если нужен иной профиль соседнего отчёта, создайте отдельный форматтер, чтобы не менять этот незаметно.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
echo "Исходный вес: 2.5 кг
";
echo "Округлённая подпись: ", $formatter->format(2.5), " кг
";
Ожидаемый результат
Исходный вес: 2.5 кг
Округлённая подпись: 3 кг
Меняется строка отчёта. Если склад обязан хранить точный вес, в хранилище остаётся 2.5: оформление не должно подменять измерение.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
echo $formatter->format(12.5), "\n";
echo $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS), "\n";
Ожидаемый результат
12.50
2
FRACTION_DIGITS одновременно задаёт минимальное и максимальное число дробных разрядов.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_attribute($formatter, NumberFormatter::FRACTION_DIGITS, 0);
numfmt_set_attribute($formatter, NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
echo numfmt_format($formatter, 2.5), "\n";
Ожидаемый результат
3
Режим округления должен быть частью договора; интерфейс не должен молча менять правила финансового расчёта.
Тот же механизм в процедурной форме: numfmt_get_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setPattern, NumberFormatter::format.
numfmt_get_attributeНастроить количество знаков, группировку или округление под договор отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_get_attribute(NumberFormatter $formatter, int $attribute): int|float|falseПроцедурная форма NumberFormatter::getAttribute. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| attribute | ID числового атрибута: FRACTION_DIGITS, GROUPING_USED, ROUNDING_MODE и другие из таблицы класса. Значение int/float у setter, у getter только ID. |
| Возврат | setAttribute bool; getAttribute int|float|false. Нулевое значение нормально. Не все стили поддерживают все атрибуты; rule-based имеют ограничения. |
| Порядок | Сначала locale/style/pattern, затем осознанные изменения атрибутов. Последующий новый pattern может изменить связанные атрибуты. |
Начинаем с задачи и одного вызова
В таблице веса все строки должны иметь ровно два дробных знака: 12.50 и 3.00. Числовые атрибуты задают такие правила; getter позволяет их прочитать и объяснить настройку пользователю.
| Запись в примере | Что именно происходит |
|---|---|
| NumberFormatter::FRACTION_DIGITS | Имя нужной настройки: число разрядов после разделителя. |
| setAttribute(..., 2) | Меняет настройку существующего объекта; не форматирует число сам. |
| getAttribute(...) | Возвращает текущее число разрядов. Оно может быть 0, поэтому false проверяют строго. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
$digits = $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS);
echo "Дробных знаков: ", $digits, "
";
echo "Вес: ", $formatter->format(12.5), " кг
";
Ожидаемый результат
Дробных знаков: 2
Вес: 12.50 кг
Настройка 2 становится заметна в результате 12.50. Данные веса остаются числом.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
echo "Коробка A: ", $formatter->format(12.5), " кг
";
echo "Коробка B: ", $formatter->format(3), " кг
";
Ожидаемый результат
Коробка A: 12.50 кг
Коробка B: 3.00 кг
Один профиль оформления применяется ко всем строкам. Если нужен иной профиль соседнего отчёта, создайте отдельный форматтер, чтобы не менять этот незаметно.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 0);
$formatter->setAttribute(NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
echo "Исходный вес: 2.5 кг
";
echo "Округлённая подпись: ", $formatter->format(2.5), " кг
";
Ожидаемый результат
Исходный вес: 2.5 кг
Округлённая подпись: 3 кг
Меняется строка отчёта. Если склад обязан хранить точный вес, в хранилище остаётся 2.5: оформление не должно подменять измерение.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 2);
echo $formatter->format(12.5), "\n";
echo $formatter->getAttribute(NumberFormatter::FRACTION_DIGITS), "\n";
Ожидаемый результат
12.50
2
FRACTION_DIGITS одновременно задаёт минимальное и максимальное число дробных разрядов.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_attribute($formatter, NumberFormatter::FRACTION_DIGITS, 0);
numfmt_set_attribute($formatter, NumberFormatter::ROUNDING_MODE, NumberFormatter::ROUND_HALFUP);
echo numfmt_format($formatter, 2.5), "\n";
Ожидаемый результат
3
Режим округления должен быть частью договора; интерфейс не должен молча менять правила финансового расчёта.
Тот же механизм в процедурной форме: numfmt_get_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setPattern, NumberFormatter::format.
NumberFormatter::setTextAttributeДобавить понятный префикс/суффикс числа или выбрать валютный код/набор правил.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::setTextAttribute(int $attribute, string $value): bool| Аргумент или результат | Что означает на практике |
|---|---|
| attribute,value | Текстовый ID: POSITIVE_PREFIX/SUFFIX, NEGATIVE_PREFIX/SUFFIX, PADDING_CHARACTER, CURRENCY_CODE; у setter значение string. Rule-based форматтеры понимают DEFAULT_RULESET/PUBLIC_RULESETS, другие могут дать U_UNSUPPORTED_ERROR. |
| Возврат | setter bool, getter string|false. PUBLIC_RULESETS предназначен для получения списка доступных публичных правил, а не произвольного добавления новых. |
Начинаем с задачи и одного вызова
В складском отчёте после каждого веса нужна единица "кг". Можно настроить суффикс и не дописывать его руками в каждой строке. Это текстовая настройка, в отличие от количества дробных знаков.
| Запись в примере | Что именно происходит |
|---|---|
| POSITIVE_SUFFIX | Хвост положительного числа; NEGATIVE_SUFFIX настраивается отдельно. |
| " кг" | Начальный пробел отделяет число от единицы. |
| getTextAttribute(...) | Читает текст настройки, чтобы проверить профиль отчёта. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Масса: ", $formatter->format(12.5), "
";
Ожидаемый результат
Масса: 12.5 кг
Строка для интерфейса уже содержит единицу; исходное число по-прежнему не содержит букв.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Суффикс отчёта: [", $formatter->getTextAttribute(NumberFormatter::POSITIVE_SUFFIX), "]
";
echo "Посылка A: ", $formatter->format(12.5), "
";
echo "Посылка B: ", $formatter->format(3), "
";
Ожидаемый результат
Суффикс отчёта: [ кг]
Посылка A: 12.5 кг
Посылка B: 3 кг
Квадратные скобки показывают, что пробел входит в настройку. Для количества «товар/товара/товаров» постоянный суффикс не подходит: нужен MessageFormatter с plural.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " items");
echo $formatter->format(12), "\n";
echo $formatter->getTextAttribute(NumberFormatter::POSITIVE_SUFFIX), "\n";
Ожидаемый результат
12 items
items
Простой суффикс не знает русские склонения. Для «1 товар / 2 товара / 5 товаров» нужен plural в MessageFormatter.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_text_attribute($formatter, NumberFormatter::NEGATIVE_PREFIX, "debt ");
echo numfmt_format($formatter, -12), "\n";
Ожидаемый результат
debt 12
Не теряйте смысл отрицательного знака: нестандартное оформление должно быть понятно человеку.
Тот же механизм в процедурной форме: numfmt_set_text_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, NumberFormatter::setSymbol.
numfmt_set_text_attributeДобавить понятный префикс/суффикс числа или выбрать валютный код/набор правил.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_set_text_attribute(NumberFormatter $formatter, int $attribute, string $value): boolПроцедурная форма NumberFormatter::setTextAttribute. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| attribute,value | Текстовый ID: POSITIVE_PREFIX/SUFFIX, NEGATIVE_PREFIX/SUFFIX, PADDING_CHARACTER, CURRENCY_CODE; у setter значение string. Rule-based форматтеры понимают DEFAULT_RULESET/PUBLIC_RULESETS, другие могут дать U_UNSUPPORTED_ERROR. |
| Возврат | setter bool, getter string|false. PUBLIC_RULESETS предназначен для получения списка доступных публичных правил, а не произвольного добавления новых. |
Начинаем с задачи и одного вызова
В складском отчёте после каждого веса нужна единица "кг". Можно настроить суффикс и не дописывать его руками в каждой строке. Это текстовая настройка, в отличие от количества дробных знаков.
| Запись в примере | Что именно происходит |
|---|---|
| POSITIVE_SUFFIX | Хвост положительного числа; NEGATIVE_SUFFIX настраивается отдельно. |
| " кг" | Начальный пробел отделяет число от единицы. |
| getTextAttribute(...) | Читает текст настройки, чтобы проверить профиль отчёта. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Масса: ", $formatter->format(12.5), "
";
Ожидаемый результат
Масса: 12.5 кг
Строка для интерфейса уже содержит единицу; исходное число по-прежнему не содержит букв.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Суффикс отчёта: [", $formatter->getTextAttribute(NumberFormatter::POSITIVE_SUFFIX), "]
";
echo "Посылка A: ", $formatter->format(12.5), "
";
echo "Посылка B: ", $formatter->format(3), "
";
Ожидаемый результат
Суффикс отчёта: [ кг]
Посылка A: 12.5 кг
Посылка B: 3 кг
Квадратные скобки показывают, что пробел входит в настройку. Для количества «товар/товара/товаров» постоянный суффикс не подходит: нужен MessageFormatter с plural.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " items");
echo $formatter->format(12), "\n";
echo $formatter->getTextAttribute(NumberFormatter::POSITIVE_SUFFIX), "\n";
Ожидаемый результат
12 items
items
Простой суффикс не знает русские склонения. Для «1 товар / 2 товара / 5 товаров» нужен plural в MessageFormatter.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_text_attribute($formatter, NumberFormatter::NEGATIVE_PREFIX, "debt ");
echo numfmt_format($formatter, -12), "\n";
Ожидаемый результат
debt 12
Не теряйте смысл отрицательного знака: нестандартное оформление должно быть понятно человеку.
Тот же механизм в процедурной форме: numfmt_set_text_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, NumberFormatter::setSymbol.
NumberFormatter::getTextAttributeДобавить понятный префикс/суффикс числа или выбрать валютный код/набор правил.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::getTextAttribute(int $attribute): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| attribute,value | Текстовый ID: POSITIVE_PREFIX/SUFFIX, NEGATIVE_PREFIX/SUFFIX, PADDING_CHARACTER, CURRENCY_CODE; у setter значение string. Rule-based форматтеры понимают DEFAULT_RULESET/PUBLIC_RULESETS, другие могут дать U_UNSUPPORTED_ERROR. |
| Возврат | setter bool, getter string|false. PUBLIC_RULESETS предназначен для получения списка доступных публичных правил, а не произвольного добавления новых. |
Начинаем с задачи и одного вызова
В складском отчёте после каждого веса нужна единица "кг". Можно настроить суффикс и не дописывать его руками в каждой строке. Это текстовая настройка, в отличие от количества дробных знаков.
| Запись в примере | Что именно происходит |
|---|---|
| POSITIVE_SUFFIX | Хвост положительного числа; NEGATIVE_SUFFIX настраивается отдельно. |
| " кг" | Начальный пробел отделяет число от единицы. |
| getTextAttribute(...) | Читает текст настройки, чтобы проверить профиль отчёта. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Масса: ", $formatter->format(12.5), "
";
Ожидаемый результат
Масса: 12.5 кг
Строка для интерфейса уже содержит единицу; исходное число по-прежнему не содержит букв.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Суффикс отчёта: [", $formatter->getTextAttribute(NumberFormatter::POSITIVE_SUFFIX), "]
";
echo "Посылка A: ", $formatter->format(12.5), "
";
echo "Посылка B: ", $formatter->format(3), "
";
Ожидаемый результат
Суффикс отчёта: [ кг]
Посылка A: 12.5 кг
Посылка B: 3 кг
Квадратные скобки показывают, что пробел входит в настройку. Для количества «товар/товара/товаров» постоянный суффикс не подходит: нужен MessageFormatter с plural.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " items");
echo $formatter->format(12), "\n";
echo $formatter->getTextAttribute(NumberFormatter::POSITIVE_SUFFIX), "\n";
Ожидаемый результат
12 items
items
Простой суффикс не знает русские склонения. Для «1 товар / 2 товара / 5 товаров» нужен plural в MessageFormatter.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_text_attribute($formatter, NumberFormatter::NEGATIVE_PREFIX, "debt ");
echo numfmt_format($formatter, -12), "\n";
Ожидаемый результат
debt 12
Не теряйте смысл отрицательного знака: нестандартное оформление должно быть понятно человеку.
Тот же механизм в процедурной форме: numfmt_get_text_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, NumberFormatter::setSymbol.
numfmt_get_text_attributeДобавить понятный префикс/суффикс числа или выбрать валютный код/набор правил.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_get_text_attribute(NumberFormatter $formatter, int $attribute): string|falseПроцедурная форма NumberFormatter::getTextAttribute. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| attribute,value | Текстовый ID: POSITIVE_PREFIX/SUFFIX, NEGATIVE_PREFIX/SUFFIX, PADDING_CHARACTER, CURRENCY_CODE; у setter значение string. Rule-based форматтеры понимают DEFAULT_RULESET/PUBLIC_RULESETS, другие могут дать U_UNSUPPORTED_ERROR. |
| Возврат | setter bool, getter string|false. PUBLIC_RULESETS предназначен для получения списка доступных публичных правил, а не произвольного добавления новых. |
Начинаем с задачи и одного вызова
В складском отчёте после каждого веса нужна единица "кг". Можно настроить суффикс и не дописывать его руками в каждой строке. Это текстовая настройка, в отличие от количества дробных знаков.
| Запись в примере | Что именно происходит |
|---|---|
| POSITIVE_SUFFIX | Хвост положительного числа; NEGATIVE_SUFFIX настраивается отдельно. |
| " кг" | Начальный пробел отделяет число от единицы. |
| getTextAttribute(...) | Читает текст настройки, чтобы проверить профиль отчёта. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Масса: ", $formatter->format(12.5), "
";
Ожидаемый результат
Масса: 12.5 кг
Строка для интерфейса уже содержит единицу; исходное число по-прежнему не содержит букв.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Суффикс отчёта: [", $formatter->getTextAttribute(NumberFormatter::POSITIVE_SUFFIX), "]
";
echo "Посылка A: ", $formatter->format(12.5), "
";
echo "Посылка B: ", $formatter->format(3), "
";
Ожидаемый результат
Суффикс отчёта: [ кг]
Посылка A: 12.5 кг
Посылка B: 3 кг
Квадратные скобки показывают, что пробел входит в настройку. Для количества «товар/товара/товаров» постоянный суффикс не подходит: нужен MessageFormatter с plural.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " items");
echo $formatter->format(12), "\n";
echo $formatter->getTextAttribute(NumberFormatter::POSITIVE_SUFFIX), "\n";
Ожидаемый результат
12 items
items
Простой суффикс не знает русские склонения. Для «1 товар / 2 товара / 5 товаров» нужен plural в MessageFormatter.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_text_attribute($formatter, NumberFormatter::NEGATIVE_PREFIX, "debt ");
echo numfmt_format($formatter, -12), "\n";
Ожидаемый результат
debt 12
Не теряйте смысл отрицательного знака: нестандартное оформление должно быть понятно человеку.
Тот же механизм в процедурной форме: numfmt_get_text_attribute. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, NumberFormatter::setSymbol.
NumberFormatter::setSymbolУправлять конкретным знаком представления числа для специального отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::setSymbol(int $symbol, string $value): bool| Аргумент или результат | Что означает на практике |
|---|---|
| symbol,value | ID из *_SYMBOL, например DECIMAL_SEPARATOR_SYMBOL; setter получает строку. Это текст знака, а не стиль форматирования. |
| Возврат | setter bool, getter string|false. Rule-based не поддерживаются. Обычному интерфейсу чаще нужны символы из locale без ручной подмены. |
Начинаем с задачи и одного вызова
Человек не знает, какой разделитель вводить в числовое поле. Getter поможет показать подсказку из правил выбранной локали; setter нужен только для явно нестандартного оформления отчёта.
| Запись в примере | Что именно происходит |
|---|---|
| DECIMAL_SEPARATOR_SYMBOL | Идентификатор знака между целой и дробной частью. |
| getSymbol(...) | Возвращает сам знак, например запятую. |
| GROUPING_SEPARATOR_SYMBOL | Другая настройка: разделитель групп тысяч, он не равен десятичному. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$separator = $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL);
echo "Дробную часть отделяйте знаком ", $separator, "
";
echo "Например: ", $formatter->format(12.5), "
";
Ожидаемый результат
Дробную часть отделяйте знаком ,
Например: 12,5
Подсказка и пример взяты из одного форматтера, поэтому не противоречат друг другу.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo "Обычная запись: ", $formatter->format(12345), "
";
$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "_");
echo "Формат отчёта: ", $formatter->format(12345), "
";
Ожидаемый результат
Обычная запись: 12,345
Формат отчёта: 12_345
Такой отчёт имеет отдельный договор. Для обычного покупателя лучше оставить привычные знаки его locale; строка 12_345 не должна случайно отправляться как JSON-число.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL), "\n";
Ожидаемый результат
.
Этот символ относится к обычному числу; денежные разделители имеют отдельные IDs.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_symbol($formatter, NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "_");
echo numfmt_format($formatter, 12345), "\n";
Ожидаемый результат
12_345
Полученная строка намеренно нестандартная; не используйте её как машиночитаемое число без контракта.
Тот же механизм в процедурной форме: numfmt_set_symbol. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setTextAttribute, NumberFormatter::getPattern.
numfmt_set_symbolУправлять конкретным знаком представления числа для специального отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_set_symbol(NumberFormatter $formatter, int $symbol, string $value): boolПроцедурная форма NumberFormatter::setSymbol. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| symbol,value | ID из *_SYMBOL, например DECIMAL_SEPARATOR_SYMBOL; setter получает строку. Это текст знака, а не стиль форматирования. |
| Возврат | setter bool, getter string|false. Rule-based не поддерживаются. Обычному интерфейсу чаще нужны символы из locale без ручной подмены. |
Начинаем с задачи и одного вызова
Человек не знает, какой разделитель вводить в числовое поле. Getter поможет показать подсказку из правил выбранной локали; setter нужен только для явно нестандартного оформления отчёта.
| Запись в примере | Что именно происходит |
|---|---|
| DECIMAL_SEPARATOR_SYMBOL | Идентификатор знака между целой и дробной частью. |
| getSymbol(...) | Возвращает сам знак, например запятую. |
| GROUPING_SEPARATOR_SYMBOL | Другая настройка: разделитель групп тысяч, он не равен десятичному. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$separator = $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL);
echo "Дробную часть отделяйте знаком ", $separator, "
";
echo "Например: ", $formatter->format(12.5), "
";
Ожидаемый результат
Дробную часть отделяйте знаком ,
Например: 12,5
Подсказка и пример взяты из одного форматтера, поэтому не противоречат друг другу.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo "Обычная запись: ", $formatter->format(12345), "
";
$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "_");
echo "Формат отчёта: ", $formatter->format(12345), "
";
Ожидаемый результат
Обычная запись: 12,345
Формат отчёта: 12_345
Такой отчёт имеет отдельный договор. Для обычного покупателя лучше оставить привычные знаки его locale; строка 12_345 не должна случайно отправляться как JSON-число.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL), "\n";
Ожидаемый результат
.
Этот символ относится к обычному числу; денежные разделители имеют отдельные IDs.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_symbol($formatter, NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "_");
echo numfmt_format($formatter, 12345), "\n";
Ожидаемый результат
12_345
Полученная строка намеренно нестандартная; не используйте её как машиночитаемое число без контракта.
Тот же механизм в процедурной форме: numfmt_set_symbol. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setTextAttribute, NumberFormatter::getPattern.
NumberFormatter::getSymbolУправлять конкретным знаком представления числа для специального отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::getSymbol(int $symbol): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| symbol,value | ID из *_SYMBOL, например DECIMAL_SEPARATOR_SYMBOL; setter получает строку. Это текст знака, а не стиль форматирования. |
| Возврат | setter bool, getter string|false. Rule-based не поддерживаются. Обычному интерфейсу чаще нужны символы из locale без ручной подмены. |
Начинаем с задачи и одного вызова
Человек не знает, какой разделитель вводить в числовое поле. Getter поможет показать подсказку из правил выбранной локали; setter нужен только для явно нестандартного оформления отчёта.
| Запись в примере | Что именно происходит |
|---|---|
| DECIMAL_SEPARATOR_SYMBOL | Идентификатор знака между целой и дробной частью. |
| getSymbol(...) | Возвращает сам знак, например запятую. |
| GROUPING_SEPARATOR_SYMBOL | Другая настройка: разделитель групп тысяч, он не равен десятичному. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$separator = $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL);
echo "Дробную часть отделяйте знаком ", $separator, "
";
echo "Например: ", $formatter->format(12.5), "
";
Ожидаемый результат
Дробную часть отделяйте знаком ,
Например: 12,5
Подсказка и пример взяты из одного форматтера, поэтому не противоречат друг другу.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo "Обычная запись: ", $formatter->format(12345), "
";
$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "_");
echo "Формат отчёта: ", $formatter->format(12345), "
";
Ожидаемый результат
Обычная запись: 12,345
Формат отчёта: 12_345
Такой отчёт имеет отдельный договор. Для обычного покупателя лучше оставить привычные знаки его locale; строка 12_345 не должна случайно отправляться как JSON-число.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL), "\n";
Ожидаемый результат
.
Этот символ относится к обычному числу; денежные разделители имеют отдельные IDs.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_symbol($formatter, NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "_");
echo numfmt_format($formatter, 12345), "\n";
Ожидаемый результат
12_345
Полученная строка намеренно нестандартная; не используйте её как машиночитаемое число без контракта.
Тот же механизм в процедурной форме: numfmt_get_symbol. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setTextAttribute, NumberFormatter::getPattern.
numfmt_get_symbolУправлять конкретным знаком представления числа для специального отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_get_symbol(NumberFormatter $formatter, int $symbol): string|falseПроцедурная форма NumberFormatter::getSymbol. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| symbol,value | ID из *_SYMBOL, например DECIMAL_SEPARATOR_SYMBOL; setter получает строку. Это текст знака, а не стиль форматирования. |
| Возврат | setter bool, getter string|false. Rule-based не поддерживаются. Обычному интерфейсу чаще нужны символы из locale без ручной подмены. |
Начинаем с задачи и одного вызова
Человек не знает, какой разделитель вводить в числовое поле. Getter поможет показать подсказку из правил выбранной локали; setter нужен только для явно нестандартного оформления отчёта.
| Запись в примере | Что именно происходит |
|---|---|
| DECIMAL_SEPARATOR_SYMBOL | Идентификатор знака между целой и дробной частью. |
| getSymbol(...) | Возвращает сам знак, например запятую. |
| GROUPING_SEPARATOR_SYMBOL | Другая настройка: разделитель групп тысяч, он не равен десятичному. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$separator = $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL);
echo "Дробную часть отделяйте знаком ", $separator, "
";
echo "Например: ", $formatter->format(12.5), "
";
Ожидаемый результат
Дробную часть отделяйте знаком ,
Например: 12,5
Подсказка и пример взяты из одного форматтера, поэтому не противоречат друг другу.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo "Обычная запись: ", $formatter->format(12345), "
";
$formatter->setSymbol(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "_");
echo "Формат отчёта: ", $formatter->format(12345), "
";
Ожидаемый результат
Обычная запись: 12,345
Формат отчёта: 12_345
Такой отчёт имеет отдельный договор. Для обычного покупателя лучше оставить привычные знаки его locale; строка 12_345 не должна случайно отправляться как JSON-число.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo $formatter->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL), "\n";
Ожидаемый результат
.
Этот символ относится к обычному числу; денежные разделители имеют отдельные IDs.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_symbol($formatter, NumberFormatter::GROUPING_SEPARATOR_SYMBOL, "_");
echo numfmt_format($formatter, 12345), "\n";
Ожидаемый результат
12_345
Полученная строка намеренно нестандартная; не используйте её как машиночитаемое число без контракта.
Тот же механизм в процедурной форме: numfmt_get_symbol. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setTextAttribute, NumberFormatter::getPattern.
NumberFormatter::setPatternОписать устойчивый шаблон отчёта и проверить, какое правило сейчас использует объект.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::setPattern(string $pattern): bool| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | ICU DecimalFormat: 0 — обязательная цифра, # — необязательная, точка — десятичная позиция, запятая — группировка, ; разделяет положительный и отрицательный шаблоны, % означает масштаб 100, ¤ — валюту, литералы заключают в одиночные кавычки. Это не printf и не PHP date. |
| Возврат | setPattern bool, getPattern string|false. setPattern не применяется к rule-based форматтеру; getPattern для него возвращает представление правил. Не путайте символы шаблона с локализованными знаками вывода. |
Начинаем с задачи и одного вызова
Отчёт требует обязательные копейки и скобки для отрицательного сальдо. Шаблон описывает вид записи; locale по-прежнему выбирает фактические разделители.
| Запись в примере | Что именно происходит |
|---|---|
| #,##0.00 | 0 означает обязательную цифру; два нуля после точки требуют два дробных знака. # — необязательная цифра, запятая — группировка. |
| ;(#,##0.00) | После ; находится отдельное правило для отрицательного числа, здесь в скобках. |
| getPattern() | Возвращает применённую грамматику ICU. Это не готовая строка с суммой. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("0.00");
echo "Шаблон: ", $formatter->getPattern(), "
";
echo "Сумма: ", $formatter->format(12.5), "
";
Ожидаемый результат
Шаблон: 0.00
Сумма: 12.50
Строка шаблона описывает позиции цифр; format подставляет в них конкретное число.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("#,##0.00;(#,##0.00)");
echo "Поступление: ", $formatter->format(1234.5), "
";
echo "Возврат: ", $formatter->format(-12.5), "
";
Ожидаемый результат
Поступление: 1,234.50
Возврат: (12.50)
Один шаблон задаёт согласованные положительный и отрицательный варианты. Читателю нужно объяснить, что скобки обозначают отрицательное значение, а не оформление произвольной заметки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("#,##0.00");
echo $formatter->format(1234.5), "\n";
Ожидаемый результат
1,234.50
Шаблон задаёт две разрядные позиции, locale выбирает точку или запятую.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_pattern($formatter, "#,##0.00;(#,##0.00)");
echo numfmt_format($formatter, -12.5), "\n";
echo is_string(numfmt_get_pattern($formatter)) ? "pattern available\n" : "failed\n";
Ожидаемый результат
(12.50)
pattern available
Нормализованный шаблон ICU может отличаться текстом от исходного при сохранении смысла.
Тот же механизм в процедурной форме: numfmt_set_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setAttribute, NumberFormatter::format.
numfmt_set_patternОписать устойчивый шаблон отчёта и проверить, какое правило сейчас использует объект.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_set_pattern(NumberFormatter $formatter, string $pattern): boolПроцедурная форма NumberFormatter::setPattern. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | ICU DecimalFormat: 0 — обязательная цифра, # — необязательная, точка — десятичная позиция, запятая — группировка, ; разделяет положительный и отрицательный шаблоны, % означает масштаб 100, ¤ — валюту, литералы заключают в одиночные кавычки. Это не printf и не PHP date. |
| Возврат | setPattern bool, getPattern string|false. setPattern не применяется к rule-based форматтеру; getPattern для него возвращает представление правил. Не путайте символы шаблона с локализованными знаками вывода. |
Начинаем с задачи и одного вызова
Отчёт требует обязательные копейки и скобки для отрицательного сальдо. Шаблон описывает вид записи; locale по-прежнему выбирает фактические разделители.
| Запись в примере | Что именно происходит |
|---|---|
| #,##0.00 | 0 означает обязательную цифру; два нуля после точки требуют два дробных знака. # — необязательная цифра, запятая — группировка. |
| ;(#,##0.00) | После ; находится отдельное правило для отрицательного числа, здесь в скобках. |
| getPattern() | Возвращает применённую грамматику ICU. Это не готовая строка с суммой. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("0.00");
echo "Шаблон: ", $formatter->getPattern(), "
";
echo "Сумма: ", $formatter->format(12.5), "
";
Ожидаемый результат
Шаблон: 0.00
Сумма: 12.50
Строка шаблона описывает позиции цифр; format подставляет в них конкретное число.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("#,##0.00;(#,##0.00)");
echo "Поступление: ", $formatter->format(1234.5), "
";
echo "Возврат: ", $formatter->format(-12.5), "
";
Ожидаемый результат
Поступление: 1,234.50
Возврат: (12.50)
Один шаблон задаёт согласованные положительный и отрицательный варианты. Читателю нужно объяснить, что скобки обозначают отрицательное значение, а не оформление произвольной заметки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("#,##0.00");
echo $formatter->format(1234.5), "\n";
Ожидаемый результат
1,234.50
Шаблон задаёт две разрядные позиции, locale выбирает точку или запятую.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_pattern($formatter, "#,##0.00;(#,##0.00)");
echo numfmt_format($formatter, -12.5), "\n";
echo is_string(numfmt_get_pattern($formatter)) ? "pattern available\n" : "failed\n";
Ожидаемый результат
(12.50)
pattern available
Нормализованный шаблон ICU может отличаться текстом от исходного при сохранении смысла.
Тот же механизм в процедурной форме: numfmt_set_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setAttribute, NumberFormatter::format.
NumberFormatter::getPatternОписать устойчивый шаблон отчёта и проверить, какое правило сейчас использует объект.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::getPattern(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | ICU DecimalFormat: 0 — обязательная цифра, # — необязательная, точка — десятичная позиция, запятая — группировка, ; разделяет положительный и отрицательный шаблоны, % означает масштаб 100, ¤ — валюту, литералы заключают в одиночные кавычки. Это не printf и не PHP date. |
| Возврат | setPattern bool, getPattern string|false. setPattern не применяется к rule-based форматтеру; getPattern для него возвращает представление правил. Не путайте символы шаблона с локализованными знаками вывода. |
Начинаем с задачи и одного вызова
Отчёт требует обязательные копейки и скобки для отрицательного сальдо. Шаблон описывает вид записи; locale по-прежнему выбирает фактические разделители.
| Запись в примере | Что именно происходит |
|---|---|
| #,##0.00 | 0 означает обязательную цифру; два нуля после точки требуют два дробных знака. # — необязательная цифра, запятая — группировка. |
| ;(#,##0.00) | После ; находится отдельное правило для отрицательного числа, здесь в скобках. |
| getPattern() | Возвращает применённую грамматику ICU. Это не готовая строка с суммой. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("0.00");
echo "Шаблон: ", $formatter->getPattern(), "
";
echo "Сумма: ", $formatter->format(12.5), "
";
Ожидаемый результат
Шаблон: 0.00
Сумма: 12.50
Строка шаблона описывает позиции цифр; format подставляет в них конкретное число.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("#,##0.00;(#,##0.00)");
echo "Поступление: ", $formatter->format(1234.5), "
";
echo "Возврат: ", $formatter->format(-12.5), "
";
Ожидаемый результат
Поступление: 1,234.50
Возврат: (12.50)
Один шаблон задаёт согласованные положительный и отрицательный варианты. Читателю нужно объяснить, что скобки обозначают отрицательное значение, а не оформление произвольной заметки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("#,##0.00");
echo $formatter->format(1234.5), "\n";
Ожидаемый результат
1,234.50
Шаблон задаёт две разрядные позиции, locale выбирает точку или запятую.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_pattern($formatter, "#,##0.00;(#,##0.00)");
echo numfmt_format($formatter, -12.5), "\n";
echo is_string(numfmt_get_pattern($formatter)) ? "pattern available\n" : "failed\n";
Ожидаемый результат
(12.50)
pattern available
Нормализованный шаблон ICU может отличаться текстом от исходного при сохранении смысла.
Тот же механизм в процедурной форме: numfmt_get_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setAttribute, NumberFormatter::format.
numfmt_get_patternОписать устойчивый шаблон отчёта и проверить, какое правило сейчас использует объект.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_get_pattern(NumberFormatter $formatter): string|falseПроцедурная форма NumberFormatter::getPattern. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | ICU DecimalFormat: 0 — обязательная цифра, # — необязательная, точка — десятичная позиция, запятая — группировка, ; разделяет положительный и отрицательный шаблоны, % означает масштаб 100, ¤ — валюту, литералы заключают в одиночные кавычки. Это не printf и не PHP date. |
| Возврат | setPattern bool, getPattern string|false. setPattern не применяется к rule-based форматтеру; getPattern для него возвращает представление правил. Не путайте символы шаблона с локализованными знаками вывода. |
Начинаем с задачи и одного вызова
Отчёт требует обязательные копейки и скобки для отрицательного сальдо. Шаблон описывает вид записи; locale по-прежнему выбирает фактические разделители.
| Запись в примере | Что именно происходит |
|---|---|
| #,##0.00 | 0 означает обязательную цифру; два нуля после точки требуют два дробных знака. # — необязательная цифра, запятая — группировка. |
| ;(#,##0.00) | После ; находится отдельное правило для отрицательного числа, здесь в скобках. |
| getPattern() | Возвращает применённую грамматику ICU. Это не готовая строка с суммой. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("0.00");
echo "Шаблон: ", $formatter->getPattern(), "
";
echo "Сумма: ", $formatter->format(12.5), "
";
Ожидаемый результат
Шаблон: 0.00
Сумма: 12.50
Строка шаблона описывает позиции цифр; format подставляет в них конкретное число.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("#,##0.00;(#,##0.00)");
echo "Поступление: ", $formatter->format(1234.5), "
";
echo "Возврат: ", $formatter->format(-12.5), "
";
Ожидаемый результат
Поступление: 1,234.50
Возврат: (12.50)
Один шаблон задаёт согласованные положительный и отрицательный варианты. Читателю нужно объяснить, что скобки обозначают отрицательное значение, а не оформление произвольной заметки.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setPattern("#,##0.00");
echo $formatter->format(1234.5), "\n";
Ожидаемый результат
1,234.50
Шаблон задаёт две разрядные позиции, locale выбирает точку или запятую.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
numfmt_set_pattern($formatter, "#,##0.00;(#,##0.00)");
echo numfmt_format($formatter, -12.5), "\n";
echo is_string(numfmt_get_pattern($formatter)) ? "pattern available\n" : "failed\n";
Ожидаемый результат
(12.50)
pattern available
Нормализованный шаблон ICU может отличаться текстом от исходного при сохранении смысла.
Тот же механизм в процедурной форме: numfmt_get_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::setAttribute, NumberFormatter::format.
NumberFormatter::getLocaleПроверить локаль данных форматирования после ICU fallback.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::getLocale(int $type = ULOC_ACTUAL_LOCALE): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| type | Locale::ACTUAL_LOCALE(default) либо VALID_LOCALE; actual может быть родительской локалью, потому что данные наследуются. |
| Возврат | string|false. Это locale форматтера, а не определение языка переданного числа. |
Начинаем с задачи и одного вызова
При жалобе «разделители на сервере отличаются» важно узнать, какие правила действительно использует форматтер. Это диагностика конкретного объекта, а не попытка определить язык самого числа.
| Запись в примере | Что именно происходит |
|---|---|
| getLocale(Locale::VALID_LOCALE) | Возвращает поддержанную локаль, найденную для запроса. |
| getLocale(Locale::ACTUAL_LOCALE) | Показывает источник реально использованных данных; может оказаться родительским/root. |
| Форматируемое число | Остаётся тем же; рядом показываем результат, чтобы связать диагностику с симптомом. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo "Локаль форматтера: ", $formatter->getLocale(Locale::VALID_LOCALE), "
";
echo "Пример: ", $formatter->format(1234.5), "
";
Ожидаемый результат
Локаль форматтера: en_US
Пример: 1,234.5
В журнале поддержки видно, с какой настройкой связан результат. На другом ICU fallback может отличаться; выбранный язык пользователя храните отдельно.
<?php
declare(strict_types=1);
$english = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$german = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
echo $english->getLocale(Locale::VALID_LOCALE), ": ", $english->format(1234.5), "
";
echo $german->getLocale(Locale::VALID_LOCALE), ": ", $german->format(1234.5), "
";
Ожидаемый результат
en_US: 1,234.5
de_DE: 1.234,5
Так можно воспроизвести различие оформления, не меняя глобальное состояние сервера и данные заказа.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo is_string($formatter->getLocale()) ? "resolved\n" : "failed\n";
Ожидаемый результат
resolved
Точный результат привязан к данным ICU; запрашиваемая локаль хранится в политике приложения.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo is_string(numfmt_get_locale($formatter, Locale::VALID_LOCALE)) ? "valid locale available\n" : "failed\n";
Ожидаемый результат
valid locale available
Используется для диагностики ошибочного варианта языка, а не для изменения валюты.
Тот же механизм в процедурной форме: numfmt_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDefault.
numfmt_get_localeПроверить локаль данных форматирования после ICU fallback.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_get_locale(NumberFormatter $formatter, int $type = ULOC_ACTUAL_LOCALE): string|falseПроцедурная форма NumberFormatter::getLocale. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| type | Locale::ACTUAL_LOCALE(default) либо VALID_LOCALE; actual может быть родительской локалью, потому что данные наследуются. |
| Возврат | string|false. Это locale форматтера, а не определение языка переданного числа. |
Начинаем с задачи и одного вызова
При жалобе «разделители на сервере отличаются» важно узнать, какие правила действительно использует форматтер. Это диагностика конкретного объекта, а не попытка определить язык самого числа.
| Запись в примере | Что именно происходит |
|---|---|
| getLocale(Locale::VALID_LOCALE) | Возвращает поддержанную локаль, найденную для запроса. |
| getLocale(Locale::ACTUAL_LOCALE) | Показывает источник реально использованных данных; может оказаться родительским/root. |
| Форматируемое число | Остаётся тем же; рядом показываем результат, чтобы связать диагностику с симптомом. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo "Локаль форматтера: ", $formatter->getLocale(Locale::VALID_LOCALE), "
";
echo "Пример: ", $formatter->format(1234.5), "
";
Ожидаемый результат
Локаль форматтера: en_US
Пример: 1,234.5
В журнале поддержки видно, с какой настройкой связан результат. На другом ICU fallback может отличаться; выбранный язык пользователя храните отдельно.
<?php
declare(strict_types=1);
$english = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$german = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
echo $english->getLocale(Locale::VALID_LOCALE), ": ", $english->format(1234.5), "
";
echo $german->getLocale(Locale::VALID_LOCALE), ": ", $german->format(1234.5), "
";
Ожидаемый результат
en_US: 1,234.5
de_DE: 1.234,5
Так можно воспроизвести различие оформления, не меняя глобальное состояние сервера и данные заказа.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo is_string($formatter->getLocale()) ? "resolved\n" : "failed\n";
Ожидаемый результат
resolved
Точный результат привязан к данным ICU; запрашиваемая локаль хранится в политике приложения.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
echo is_string(numfmt_get_locale($formatter, Locale::VALID_LOCALE)) ? "valid locale available\n" : "failed\n";
Ожидаемый результат
valid locale available
Используется для диагностики ошибочного варианта языка, а не для изменения валюты.
Тот же механизм в процедурной форме: numfmt_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDefault.
NumberFormatter::getErrorCodeПолучить причину неудачного форматирования/разбора у текущего объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::getErrorCode(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет у метода; formatter в процедурной форме. |
| Возврат | int ICU code для getErrorCode, string для getErrorMessage. Отрицательный warning не обязательно означает ошибку; intl_is_failure проверяет семантику. |
| Когда читать | Сразу после неудачной операции, пока следующая не перезаписала error state. Не путать false и числовой ноль после parse. |
Начинаем с задачи и одного вызова
Пользователь ввёл слово вместо количества. Нужно сохранить понятную ошибку рядом с полем и техническую причину для разработчика, а не продолжать расчёт с false.
| Запись в примере | Что именно происходит |
|---|---|
| $formatter->parse("много") | Намеренно неудачный ввод; результат false. |
| getErrorCode()/getErrorMessage() | Читают причину именно этого объекта сразу после неудачи. |
| intl_error_name($code) | Делает числовой код понятным в техническом журнале; пользователю лучше отдельная человеческая подсказка. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = $formatter->parse("много");
if ($amount === false) {
echo "Количество: введите число, например 12.5.
";
echo "Код для поддержки: ", intl_error_name($formatter->getErrorCode()), "
";
}
Ожидаемый результат
Количество: введите число, например 12.5.
Код для поддержки: U_PARSE_ERROR
Расчёт не выполняется. В примере диагностика видна рядом; на рабочем сайте подробности обычно уходят в закрытый журнал.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = $formatter->parse("много");
$diagnostic = intl_error_name($formatter->getErrorCode());
$example = $formatter->format(12.5);
echo "Подсказка: ", $example, "
";
echo str_contains($diagnostic, "U_PARSE_ERROR") ? "Причина сохранена: неверная запись числа.
" : "Иная причина.
";
Ожидаемый результат
Подсказка: 12.5
Причина сохранена: неверная запись числа.
После parse мы сохранили причину в отдельной переменной. Затем format подготовил подсказку и мог изменить состояние объекта; прежняя причина всё равно не потерялась.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->format(12);
var_dump(intl_is_failure($formatter->getErrorCode()));
Ожидаемый результат
bool(false)
Диагностика всегда относится к конкретному объекту.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$value = $formatter->parse("not a number");
var_dump($value, intl_is_failure(numfmt_get_error_code($formatter)));
Ожидаемый результат
bool(false)
bool(true)
Пользователю нужно сообщение о формате числа, а в журнале уместны код и контекст без лишних персональных данных.
Тот же механизм в процедурной форме: numfmt_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, NumberFormatter::parse.
numfmt_get_error_codeПолучить причину неудачного форматирования/разбора у текущего объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_get_error_code(NumberFormatter $formatter): intПроцедурная форма NumberFormatter::getErrorCode. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет у метода; formatter в процедурной форме. |
| Возврат | int ICU code для getErrorCode, string для getErrorMessage. Отрицательный warning не обязательно означает ошибку; intl_is_failure проверяет семантику. |
| Когда читать | Сразу после неудачной операции, пока следующая не перезаписала error state. Не путать false и числовой ноль после parse. |
Начинаем с задачи и одного вызова
Пользователь ввёл слово вместо количества. Нужно сохранить понятную ошибку рядом с полем и техническую причину для разработчика, а не продолжать расчёт с false.
| Запись в примере | Что именно происходит |
|---|---|
| $formatter->parse("много") | Намеренно неудачный ввод; результат false. |
| getErrorCode()/getErrorMessage() | Читают причину именно этого объекта сразу после неудачи. |
| intl_error_name($code) | Делает числовой код понятным в техническом журнале; пользователю лучше отдельная человеческая подсказка. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = $formatter->parse("много");
if ($amount === false) {
echo "Количество: введите число, например 12.5.
";
echo "Код для поддержки: ", intl_error_name($formatter->getErrorCode()), "
";
}
Ожидаемый результат
Количество: введите число, например 12.5.
Код для поддержки: U_PARSE_ERROR
Расчёт не выполняется. В примере диагностика видна рядом; на рабочем сайте подробности обычно уходят в закрытый журнал.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = $formatter->parse("много");
$diagnostic = intl_error_name($formatter->getErrorCode());
$example = $formatter->format(12.5);
echo "Подсказка: ", $example, "
";
echo str_contains($diagnostic, "U_PARSE_ERROR") ? "Причина сохранена: неверная запись числа.
" : "Иная причина.
";
Ожидаемый результат
Подсказка: 12.5
Причина сохранена: неверная запись числа.
После parse мы сохранили причину в отдельной переменной. Затем format подготовил подсказку и мог изменить состояние объекта; прежняя причина всё равно не потерялась.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->format(12);
var_dump(intl_is_failure($formatter->getErrorCode()));
Ожидаемый результат
bool(false)
Диагностика всегда относится к конкретному объекту.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$value = $formatter->parse("not a number");
var_dump($value, intl_is_failure(numfmt_get_error_code($formatter)));
Ожидаемый результат
bool(false)
bool(true)
Пользователю нужно сообщение о формате числа, а в журнале уместны код и контекст без лишних персональных данных.
Тот же механизм в процедурной форме: numfmt_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, NumberFormatter::parse.
NumberFormatter::getErrorMessageПолучить причину неудачного форматирования/разбора у текущего объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
NumberFormatter::getErrorMessage(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет у метода; formatter в процедурной форме. |
| Возврат | int ICU code для getErrorCode, string для getErrorMessage. Отрицательный warning не обязательно означает ошибку; intl_is_failure проверяет семантику. |
| Когда читать | Сразу после неудачной операции, пока следующая не перезаписала error state. Не путать false и числовой ноль после parse. |
Начинаем с задачи и одного вызова
Пользователь ввёл слово вместо количества. Нужно сохранить понятную ошибку рядом с полем и техническую причину для разработчика, а не продолжать расчёт с false.
| Запись в примере | Что именно происходит |
|---|---|
| $formatter->parse("много") | Намеренно неудачный ввод; результат false. |
| getErrorCode()/getErrorMessage() | Читают причину именно этого объекта сразу после неудачи. |
| intl_error_name($code) | Делает числовой код понятным в техническом журнале; пользователю лучше отдельная человеческая подсказка. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = $formatter->parse("много");
if ($amount === false) {
echo "Количество: введите число, например 12.5.
";
echo "Код для поддержки: ", intl_error_name($formatter->getErrorCode()), "
";
}
Ожидаемый результат
Количество: введите число, например 12.5.
Код для поддержки: U_PARSE_ERROR
Расчёт не выполняется. В примере диагностика видна рядом; на рабочем сайте подробности обычно уходят в закрытый журнал.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = $formatter->parse("много");
$diagnostic = $formatter->getErrorMessage();
$example = $formatter->format(12.5);
echo "Подсказка: ", $example, "
";
echo str_contains($diagnostic, "U_PARSE_ERROR") ? "Причина сохранена: неверная запись числа.
" : "Иная причина.
";
Ожидаемый результат
Подсказка: 12.5
Причина сохранена: неверная запись числа.
После parse мы сохранили причину в отдельной переменной. Затем format подготовил подсказку и мог изменить состояние объекта; прежняя причина всё равно не потерялась.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->format(12);
echo $formatter->getErrorMessage(), "\n";
Ожидаемый результат
U_ZERO_ERROR
Диагностика всегда относится к конкретному объекту.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$value = $formatter->parse("not a number");
echo str_contains(numfmt_get_error_message($formatter), "U_PARSE_ERROR") ? "parse error\n" : "other\n";
Ожидаемый результат
parse error
Пользователю нужно сообщение о формате числа, а в журнале уместны код и контекст без лишних персональных данных.
Тот же механизм в процедурной форме: numfmt_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, NumberFormatter::parse.
numfmt_get_error_messageПолучить причину неудачного форматирования/разбора у текущего объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
numfmt_get_error_message(NumberFormatter $formatter): stringПроцедурная форма NumberFormatter::getErrorMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет у метода; formatter в процедурной форме. |
| Возврат | int ICU code для getErrorCode, string для getErrorMessage. Отрицательный warning не обязательно означает ошибку; intl_is_failure проверяет семантику. |
| Когда читать | Сразу после неудачной операции, пока следующая не перезаписала error state. Не путать false и числовой ноль после parse. |
Начинаем с задачи и одного вызова
Пользователь ввёл слово вместо количества. Нужно сохранить понятную ошибку рядом с полем и техническую причину для разработчика, а не продолжать расчёт с false.
| Запись в примере | Что именно происходит |
|---|---|
| $formatter->parse("много") | Намеренно неудачный ввод; результат false. |
| getErrorCode()/getErrorMessage() | Читают причину именно этого объекта сразу после неудачи. |
| intl_error_name($code) | Делает числовой код понятным в техническом журнале; пользователю лучше отдельная человеческая подсказка. |
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = $formatter->parse("много");
if ($amount === false) {
echo "Количество: введите число, например 12.5.
";
echo "Код для поддержки: ", intl_error_name($formatter->getErrorCode()), "
";
}
Ожидаемый результат
Количество: введите число, например 12.5.
Код для поддержки: U_PARSE_ERROR
Расчёт не выполняется. В примере диагностика видна рядом; на рабочем сайте подробности обычно уходят в закрытый журнал.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$amount = $formatter->parse("много");
$diagnostic = $formatter->getErrorMessage();
$example = $formatter->format(12.5);
echo "Подсказка: ", $example, "
";
echo str_contains($diagnostic, "U_PARSE_ERROR") ? "Причина сохранена: неверная запись числа.
" : "Иная причина.
";
Ожидаемый результат
Подсказка: 12.5
Причина сохранена: неверная запись числа.
После parse мы сохранили причину в отдельной переменной. Затем format подготовил подсказку и мог изменить состояние объекта; прежняя причина всё равно не потерялась.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->format(12);
echo $formatter->getErrorMessage(), "\n";
Ожидаемый результат
U_ZERO_ERROR
Диагностика всегда относится к конкретному объекту.
<?php
declare(strict_types=1);
$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$value = $formatter->parse("not a number");
echo str_contains(numfmt_get_error_message($formatter), "U_PARSE_ERROR") ? "parse error\n" : "other\n";
Ожидаемый результат
parse error
Пользователю нужно сообщение о формате числа, а в журнале уместны код и контекст без лишних персональных данных.
Тот же механизм в процедурной форме: numfmt_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, NumberFormatter::parse.
Normalizer::normalizeСделать одинаковые по смыслу записи Unicode сопоставимыми: посетитель вставил букву с отдельным ударением, а база хранит готовую букву.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Normalizer::normalize(string $string, int $form = Normalizer::FORM_C): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| string | Корректная строка UTF-8. Нормализация не декодирует HTML, не удаляет опасные команды и не заменяет проверку ввода. |
| form | NFC по умолчанию: каноническое составление. NFD раскладывает; NFKC/NFKD дополнительно стирают совместимые различия. NFKC_CF добавляет case folding и может удалять некоторые игнорируемые символы. |
| Возврат | Новая string либо false при ошибке. Исходная переменная не меняется. Выбор формы входит в контракт данных: нельзя бездумно NFKC-нормализовать пароли и авторский текст. |
<?php
declare(strict_types=1);
$typed = "e\u{0301}";
$stored = "\u{00E9}";
var_dump($typed === $stored);
var_dump(Normalizer::normalize($typed) === $stored);
Ожидаемый результат
bool(false)
bool(true)
Внешне обе строки — é. Побайтовое сравнение до нормализации видит разные последовательности.
<?php
declare(strict_types=1);
$catalog = ['café' => 'Кофе в зёрнах, 250 г'];
$typed = "cafe\u{0301}";
echo 'До нормализации: ', $catalog[$typed] ?? 'не найдено', "\n";
$key = Normalizer::normalize($typed, Normalizer::NFC);
if ($key === false) {
echo "Исправьте кодировку запроса\n";
} else {
echo 'После нормализации: ', $catalog[$key] ?? 'не найдено', "\n";
}
Ожидаемый результат
До нормализации: не найдено
После нормализации: Кофе в зёрнах, 250 г
В одном слове é хранится готовой кодовой точкой, в другом — e и отдельным акцентом. PHP-ключи сравнивают байты; NFC приводит обе записи к общей форме. Ключи каталога должны готовиться по той же политике. Нормализация не исправляет опечатки, не меняет регистр и не делает ввод безопасным для SQL или HTML. Видимый результат — найденная карточка, а не только ответ true.
<?php
declare(strict_types=1);
$raw = "123";
echo normalizer_normalize($raw, Normalizer::NFKC), "
";
echo normalizer_normalize($raw, Normalizer::NFC), "
";
Ожидаемый результат
123
123
NFKC полезна, если договор кода разрешает считать эти цифры одинаковыми. NFC сохраняет различие ширины.
Тот же механизм в процедурной форме: normalizer_normalize. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Normalizer::isNormalized, Normalizer::getRawDecomposition, grapheme_strlen.
normalizer_normalizeСделать одинаковые по смыслу записи Unicode сопоставимыми: посетитель вставил букву с отдельным ударением, а база хранит готовую букву.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
normalizer_normalize(string $string, int $form = Normalizer::FORM_C): string|falseПроцедурная форма Normalizer::normalize. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string | Корректная строка UTF-8. Нормализация не декодирует HTML, не удаляет опасные команды и не заменяет проверку ввода. |
| form | NFC по умолчанию: каноническое составление. NFD раскладывает; NFKC/NFKD дополнительно стирают совместимые различия. NFKC_CF добавляет case folding и может удалять некоторые игнорируемые символы. |
| Возврат | Новая string либо false при ошибке. Исходная переменная не меняется. Выбор формы входит в контракт данных: нельзя бездумно NFKC-нормализовать пароли и авторский текст. |
<?php
declare(strict_types=1);
$typed = "e\u{0301}";
$stored = "\u{00E9}";
var_dump($typed === $stored);
var_dump(Normalizer::normalize($typed) === $stored);
Ожидаемый результат
bool(false)
bool(true)
Внешне обе строки — é. Побайтовое сравнение до нормализации видит разные последовательности.
<?php
declare(strict_types=1);
$catalog = ['café' => 'Кофе в зёрнах, 250 г'];
$typed = "cafe\u{0301}";
echo 'До нормализации: ', $catalog[$typed] ?? 'не найдено', "\n";
$key = Normalizer::normalize($typed, Normalizer::NFC);
if ($key === false) {
echo "Исправьте кодировку запроса\n";
} else {
echo 'После нормализации: ', $catalog[$key] ?? 'не найдено', "\n";
}
Ожидаемый результат
До нормализации: не найдено
После нормализации: Кофе в зёрнах, 250 г
В одном слове é хранится готовой кодовой точкой, в другом — e и отдельным акцентом. PHP-ключи сравнивают байты; NFC приводит обе записи к общей форме. Ключи каталога должны готовиться по той же политике. Нормализация не исправляет опечатки, не меняет регистр и не делает ввод безопасным для SQL или HTML. Видимый результат — найденная карточка, а не только ответ true.
<?php
declare(strict_types=1);
$raw = "123";
echo normalizer_normalize($raw, Normalizer::NFKC), "
";
echo normalizer_normalize($raw, Normalizer::NFC), "
";
Ожидаемый результат
123
123
NFKC полезна, если договор кода разрешает считать эти цифры одинаковыми. NFC сохраняет различие ширины.
Тот же механизм в процедурной форме: normalizer_normalize. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Normalizer::isNormalized, Normalizer::getRawDecomposition, grapheme_strlen.
Normalizer::isNormalizedПроверить, соответствует ли строка принятой форме Unicode, перед сравнением или индексированием.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Normalizer::isNormalized(string $string, int $form = Normalizer::FORM_C): bool| Аргумент или результат | Что означает на практике |
|---|---|
| string,form | Текст UTF-8 и одна из форм Normalizer; по умолчанию NFC. |
| Возврат | true — уже в форме; false — не в форме либо возникла ошибка. При необходимости различить причины читайте intl_get_error_code сразу после вызова. |
| Цена | Предварительная проверка и последующая normalize могут пройти текст дважды. Если нужна нормализованная строка в любом случае, обычно достаточно normalize. |
<?php
declare(strict_types=1);
var_dump(Normalizer::isNormalized("e\u{0301}"));
var_dump(Normalizer::isNormalized("\u{00E9}"));
Ожидаемый результат
bool(false)
bool(true)
Наличие двух кодовых точек само по себе не ошибка; это другая допустимая запись Unicode.
<?php
declare(strict_types=1);
foreach (["café", "cafe\u{0301}"] as $name) {
$ready = Normalizer::isNormalized($name, Normalizer::NFC);
$error = intl_get_error_code();
if (intl_is_failure($error)) {
echo "Имя повреждено: исправьте кодировку\n";
} elseif (!$ready) {
echo "Имя нужно привести к NFC перед импортом\n";
} else {
echo 'Готово к импорту: ', $name, "\n";
}
}
Ожидаемый результат
Готово к импорту: café
Имя нужно привести к NFC перед импортом
Это инспектор соответствия формату: он сообщает нарушение, а не исправляет источник молча. false может означать и другую нормальную форму, и техническую ошибку, поэтому код ошибки прочитан сразу. Если задача — в любом случае получить нормализованное значение, проще один раз вызвать normalize и проверить его результат, чем обходить каждое имя дважды.
Тот же механизм в процедурной форме: normalizer_is_normalized. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Normalizer::normalize, intl_get_error_code.
normalizer_is_normalizedПроверить, соответствует ли строка принятой форме Unicode, перед сравнением или индексированием.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
normalizer_is_normalized(string $string, int $form = Normalizer::FORM_C): boolПроцедурная форма Normalizer::isNormalized. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string,form | Текст UTF-8 и одна из форм Normalizer; по умолчанию NFC. |
| Возврат | true — уже в форме; false — не в форме либо возникла ошибка. При необходимости различить причины читайте intl_get_error_code сразу после вызова. |
| Цена | Предварительная проверка и последующая normalize могут пройти текст дважды. Если нужна нормализованная строка в любом случае, обычно достаточно normalize. |
<?php
declare(strict_types=1);
var_dump(Normalizer::isNormalized("e\u{0301}"));
var_dump(Normalizer::isNormalized("\u{00E9}"));
Ожидаемый результат
bool(false)
bool(true)
Наличие двух кодовых точек само по себе не ошибка; это другая допустимая запись Unicode.
<?php
declare(strict_types=1);
foreach (["café", "cafe\u{0301}"] as $name) {
$ready = Normalizer::isNormalized($name, Normalizer::NFC);
$error = intl_get_error_code();
if (intl_is_failure($error)) {
echo "Имя повреждено: исправьте кодировку\n";
} elseif (!$ready) {
echo "Имя нужно привести к NFC перед импортом\n";
} else {
echo 'Готово к импорту: ', $name, "\n";
}
}
Ожидаемый результат
Готово к импорту: café
Имя нужно привести к NFC перед импортом
Это инспектор соответствия формату: он сообщает нарушение, а не исправляет источник молча. false может означать и другую нормальную форму, и техническую ошибку, поэтому код ошибки прочитан сразу. Если задача — в любом случае получить нормализованное значение, проще один раз вызвать normalize и проверить его результат, чем обходить каждое имя дважды.
Тот же механизм в процедурной форме: normalizer_is_normalized. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Normalizer::normalize, intl_get_error_code.
Normalizer::getRawDecompositionПосмотреть, из чего Unicode разрешает разложить один символ: полезно для диагностики необычных букв и учебного инспектора текста.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Normalizer::getRawDecomposition(string $string, int $form = Normalizer::FORM_C): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| string | Ровно одна кодовая точка UTF-8, не произвольная строка и не обязательно одна видимая графема. |
| form | Форма нормализатора выбирает таблицу декомпозиции, по умолчанию FORM_C. |
| Возврат | Строка отображения Decomposition_Mapping либо null, если его нет. null также возможен при неверном входе: отличайте по intl_get_error_code. Это сырое отображение, не рекурсивная normalize всей строки. |
<?php
declare(strict_types=1);
$parts = Normalizer::getRawDecomposition("\u{00E9}");
echo bin2hex($parts), "
";
Ожидаемый результат
65cc81
65 — e, cc81 — отдельный комбинируемый акцент. Hex нужен только чтобы различие стало видимым.
<?php
declare(strict_types=1);
var_dump(normalizer_get_raw_decomposition("a"));
var_dump(intl_is_failure(intl_get_error_code()));
Ожидаемый результат
NULL
bool(false)
Обычная a не обязана раскладываться. Не отбрасывайте такой символ как повреждённый.
<?php
declare(strict_types=1);
$character = 'é';
$parts = Normalizer::getRawDecomposition($character);
if ($parts === null) {
echo "У символа нет доступного разложения\n";
} else {
echo 'Исходная буква: ', $character, "\n";
foreach (mb_str_split($parts, 1, 'UTF-8') as $point) {
echo 'U+', sprintf('%04X', IntlChar::ord($point)), ' ', IntlChar::charName($point), "\n";
}
}
Ожидаемый результат
Исходная буква: é
U+0065 LATIN SMALL LETTER E
U+0301 COMBINING ACUTE ACCENT
Такой инспектор помогает понять, почему визуально одинаковые имена имеют разные байты. mb_str_split здесь специально делит на кодовые точки, а не графемы: нам нужно увидеть оба компонента. Дополнительно требуется mbstring. У сырого отображения может быть собственное разложение, поэтому это не замена рекурсивной нормализации строки. Для различения отсутствия разложения и сбоя см. предыдущий пример с intl_get_error_code.
Тот же механизм в процедурной форме: normalizer_get_raw_decomposition. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Normalizer::normalize, IntlChar::ord.
normalizer_get_raw_decompositionПосмотреть, из чего Unicode разрешает разложить один символ: полезно для диагностики необычных букв и учебного инспектора текста.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
normalizer_get_raw_decomposition(string $string, int $form = Normalizer::FORM_C): ?stringПроцедурная форма Normalizer::getRawDecomposition. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string | Ровно одна кодовая точка UTF-8, не произвольная строка и не обязательно одна видимая графема. |
| form | Форма нормализатора выбирает таблицу декомпозиции, по умолчанию FORM_C. |
| Возврат | Строка отображения Decomposition_Mapping либо null, если его нет. null также возможен при неверном входе: отличайте по intl_get_error_code. Это сырое отображение, не рекурсивная normalize всей строки. |
<?php
declare(strict_types=1);
$parts = Normalizer::getRawDecomposition("\u{00E9}");
echo bin2hex($parts), "
";
Ожидаемый результат
65cc81
65 — e, cc81 — отдельный комбинируемый акцент. Hex нужен только чтобы различие стало видимым.
<?php
declare(strict_types=1);
var_dump(normalizer_get_raw_decomposition("a"));
var_dump(intl_is_failure(intl_get_error_code()));
Ожидаемый результат
NULL
bool(false)
Обычная a не обязана раскладываться. Не отбрасывайте такой символ как повреждённый.
<?php
declare(strict_types=1);
$character = 'é';
$parts = Normalizer::getRawDecomposition($character);
if ($parts === null) {
echo "У символа нет доступного разложения\n";
} else {
echo 'Исходная буква: ', $character, "\n";
foreach (mb_str_split($parts, 1, 'UTF-8') as $point) {
echo 'U+', sprintf('%04X', IntlChar::ord($point)), ' ', IntlChar::charName($point), "\n";
}
}
Ожидаемый результат
Исходная буква: é
U+0065 LATIN SMALL LETTER E
U+0301 COMBINING ACUTE ACCENT
Такой инспектор помогает понять, почему визуально одинаковые имена имеют разные байты. mb_str_split здесь специально делит на кодовые точки, а не графемы: нам нужно увидеть оба компонента. Дополнительно требуется mbstring. У сырого отображения может быть собственное разложение, поэтому это не замена рекурсивной нормализации строки. Для различения отсутствия разложения и сбоя см. предыдущий пример с intl_get_error_code.
Тот же механизм в процедурной форме: normalizer_get_raw_decomposition. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Normalizer::normalize, IntlChar::ord.
IntlListFormatter::__constructПоказать перечень вариантов человеческой фразой, не склеивая последний союз вручную.
PHP 8.5; ICU 67+ · intl
IntlListFormatter::__construct(string $locale, int $type = IntlListFormatter::TYPE_AND, int $width = IntlListFormatter::WIDTH_WIDE)| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль интерфейса, например en_US. Класс появился в PHP 8.5 и требует ICU 67+. |
| type,width | TYPE_AND / TYPE_OR / TYPE_UNITS и WIDTH_WIDE / WIDTH_SHORT / WIDTH_NARROW. Это политика языка, не сортировка входных значений. |
| Результат | Готовый форматтер; неверные аргументы/создание могут вызвать исключение. Процедурного алиаса нет. |
<?php
declare(strict_types=1);
$list = new IntlListFormatter("en_US");
echo $list->format(["tea", "coffee", "water"]), "
";
Ожидаемый результат
tea, coffee, and water
Локаль определяет запятую и союз; порядок исходного массива остаётся вашим решением.
<?php
declare(strict_types=1);
$list = new IntlListFormatter("en_US", IntlListFormatter::TYPE_OR);
echo $list->format(["tea", "coffee"]), "
";
Ожидаемый результат
tea or coffee
Для альтернатив нужен OR; AND означал бы, что перечисленные варианты соединяются.
Рядом по задаче: MessageFormatter::format.
IntlListFormatter::formatПоказать перечень вариантов человеческой фразой, не склеивая последний союз вручную.
PHP 8.5; ICU 67+ · intl
IntlListFormatter::format(array $strings): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| list | Массив строк. Порядок сохраняется: метод добавляет языковые связки и знаки, а не сортирует товары. |
| Возврат | string либо false. Пустой массив даёт пустую строку; один элемент не требует союза. Для HTML экранируйте полученный текст как обычный пользовательский текст. |
<?php
declare(strict_types=1);
$list = new IntlListFormatter("en_US");
echo $list->format(["tea", "coffee", "water"]), "
";
Ожидаемый результат
tea, coffee, and water
Локаль определяет запятую и союз; порядок исходного массива остаётся вашим решением.
<?php
declare(strict_types=1);
$list = new IntlListFormatter("en_US", IntlListFormatter::TYPE_OR);
echo $list->format(["tea", "coffee"]), "
";
Ожидаемый результат
tea or coffee
Для альтернатив нужен OR; AND означал бы, что перечисленные варианты соединяются.
Рядом по задаче: MessageFormatter::format.
IntlListFormatter::getErrorCodeПоказать перечень вариантов человеческой фразой, не склеивая последний союз вручную.
PHP 8.5; ICU 67+ · intl
IntlListFormatter::getErrorCode(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int: код последней ICU-операции на этом объекте. Проверяйте intl_is_failure, а не просто неравенство нулю. |
<?php
declare(strict_types=1);
$list = new IntlListFormatter("en_US");
$list->format(["tea"]);
var_dump(intl_is_failure($list->getErrorCode()));
Ожидаемый результат
bool(false)
Локаль определяет запятую и союз; порядок исходного массива остаётся вашим решением.
<?php
declare(strict_types=1);
$list = new IntlListFormatter("en_US", IntlListFormatter::TYPE_OR);
echo $list->format(["tea", "coffee"]), "
";
Ожидаемый результат
tea or coffee
Для альтернатив нужен OR; AND означал бы, что перечисленные варианты соединяются.
Рядом по задаче: MessageFormatter::format.
IntlListFormatter::getErrorMessageПоказать перечень вариантов человеческой фразой, не склеивая последний союз вручную.
PHP 8.5; ICU 67+ · intl
IntlListFormatter::getErrorMessage(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string: сообщение последней операции объекта. Читайте сразу после неудачи; для интерфейса подготовьте собственный понятный текст. |
<?php
declare(strict_types=1);
$list = new IntlListFormatter("en_US");
$list->format(["tea"]);
echo $list->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Локаль определяет запятую и союз; порядок исходного массива остаётся вашим решением.
<?php
declare(strict_types=1);
$list = new IntlListFormatter("en_US", IntlListFormatter::TYPE_OR);
echo $list->format(["tea", "coffee"]), "
";
Ожидаемый результат
tea or coffee
Для альтернатив нужен OR; AND означал бы, что перечисленные варианты соединяются.
Рядом по задаче: MessageFormatter::format.
Locale::getDefaultВыяснить, какие правила intl использует там, где локаль не передана явно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getDefault(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| Возврат | string. Начальное значение задаёт intl.default_locale, затем Locale::setDefault меняет его в текущем запросе. Это отдельная настройка от setlocale и часового пояса PHP. |
<?php
declare(strict_types=1);
$saved = Locale::getDefault();
Locale::setDefault("en_US");
echo Locale::getDefault(), "
";
Locale::setDefault($saved);
Ожидаемый результат
en_US
Сохраняем и восстанавливаем прежнюю настройку, чтобы пример не влиял на соседние операции.
<?php
declare(strict_types=1);
$saved = Locale::getDefault();
try {
Locale::setDefault('de_DE');
$defaultFormat = new NumberFormatter(Locale::getDefault(), NumberFormatter::DECIMAL);
$recipientFormat = new NumberFormatter('en_US', NumberFormatter::DECIMAL);
echo 'Настройка сайта: ', $defaultFormat->format(1234.5), "\n";
echo 'Настройка получателя: ', $recipientFormat->format(1234.5), "\n";
} finally {
Locale::setDefault($saved);
}
Ожидаемый результат
Настройка сайта: 1.234,5
Настройка получателя: 1,234.5
Одна сумма оформлена двумя способами. getDefault вернул запасную настройку сайта, а явный en_US выбрал правила конкретного получателя. NumberFormatter делает само форматирование; Locale только сообщает/меняет локаль. Это пригодится при подготовке писем из очереди. try/finally восстанавливает настройку, даже если промежуточная операция завершится исключением; отправки писем в примере нет.
Тот же механизм в процедурной форме: locale_get_default. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::setDefault, NumberFormatter::create.
locale_get_defaultВыяснить, какие правила intl использует там, где локаль не передана явно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_default(): stringПроцедурная форма Locale::getDefault. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| Возврат | string. Начальное значение задаёт intl.default_locale, затем Locale::setDefault меняет его в текущем запросе. Это отдельная настройка от setlocale и часового пояса PHP. |
<?php
declare(strict_types=1);
$saved = Locale::getDefault();
Locale::setDefault("en_US");
echo Locale::getDefault(), "
";
Locale::setDefault($saved);
Ожидаемый результат
en_US
Сохраняем и восстанавливаем прежнюю настройку, чтобы пример не влиял на соседние операции.
<?php
declare(strict_types=1);
$saved = Locale::getDefault();
try {
Locale::setDefault('de_DE');
$defaultFormat = new NumberFormatter(Locale::getDefault(), NumberFormatter::DECIMAL);
$recipientFormat = new NumberFormatter('en_US', NumberFormatter::DECIMAL);
echo 'Настройка сайта: ', $defaultFormat->format(1234.5), "\n";
echo 'Настройка получателя: ', $recipientFormat->format(1234.5), "\n";
} finally {
Locale::setDefault($saved);
}
Ожидаемый результат
Настройка сайта: 1.234,5
Настройка получателя: 1,234.5
Одна сумма оформлена двумя способами. getDefault вернул запасную настройку сайта, а явный en_US выбрал правила конкретного получателя. NumberFormatter делает само форматирование; Locale только сообщает/меняет локаль. Это пригодится при подготовке писем из очереди. try/finally восстанавливает настройку, даже если промежуточная операция завершится исключением; отправки писем в примере нет.
Тот же механизм в процедурной форме: locale_get_default. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::setDefault, NumberFormatter::create.
Locale::setDefaultУстановить запасную локаль для операций текущего запроса, если приложение выбрало язык пользователя.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::setDefault(string $locale): true| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| locale | Идентификатор BCP 47/ICU. Не берите его из запроса без сопоставления со списком поддерживаемых языков. |
| Возврат | true при установке; это не проверка, что переводы приложения существуют. Изменяется intl default, а не состояние системного setlocale. |
<?php
declare(strict_types=1);
$saved = Locale::getDefault();
var_dump(Locale::setDefault("de_DE"));
echo Locale::getDefault(), "
";
Locale::setDefault($saved);
Ожидаемый результат
bool(true)
de_DE
Область действия — настройка intl в данном выполнении; между заданиями долгоживущего процесса восстанавливайте политику.
<?php
declare(strict_types=1);
$saved = Locale::getDefault();
try {
$allowed = ['en_US', 'de_DE'];
foreach (['de_DE', 'xx_UNKNOWN'] as $requested) {
$chosen = in_array($requested, $allowed, true) ? $requested : 'en_US';
Locale::setDefault($chosen);
$formatter = new NumberFormatter(Locale::getDefault(), NumberFormatter::DECIMAL);
echo $requested, ' -> ', $chosen, ': ', $formatter->format(1234.5), "\n";
}
} finally {
Locale::setDefault($saved);
}
Ожидаемый результат
de_DE -> de_DE: 1.234,5
xx_UNKNOWN -> en_US: 1,234.5
В настройках сайта доступны два языка. Первый выбор применён, второй заменён запасным. Теперь видно последствие установки: десятичный и групповой разделители изменились. Сам setDefault не переводит текст кнопок и не меняет уже созданные форматтеры. in_array с true сопоставляет точные ID разрешённых вариантов; для произвольного тега браузера ниже есть lookup.
Тот же механизм в процедурной форме: locale_set_default. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup, Locale::getDefault.
locale_set_defaultУстановить запасную локаль для операций текущего запроса, если приложение выбрало язык пользователя.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_set_default(string $locale): trueПроцедурная форма Locale::setDefault. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| locale | Идентификатор BCP 47/ICU. Не берите его из запроса без сопоставления со списком поддерживаемых языков. |
| Возврат | true при установке; это не проверка, что переводы приложения существуют. Изменяется intl default, а не состояние системного setlocale. |
<?php
declare(strict_types=1);
$saved = Locale::getDefault();
var_dump(Locale::setDefault("de_DE"));
echo Locale::getDefault(), "
";
Locale::setDefault($saved);
Ожидаемый результат
bool(true)
de_DE
Область действия — настройка intl в данном выполнении; между заданиями долгоживущего процесса восстанавливайте политику.
<?php
declare(strict_types=1);
$saved = Locale::getDefault();
try {
$allowed = ['en_US', 'de_DE'];
foreach (['de_DE', 'xx_UNKNOWN'] as $requested) {
$chosen = in_array($requested, $allowed, true) ? $requested : 'en_US';
Locale::setDefault($chosen);
$formatter = new NumberFormatter(Locale::getDefault(), NumberFormatter::DECIMAL);
echo $requested, ' -> ', $chosen, ': ', $formatter->format(1234.5), "\n";
}
} finally {
Locale::setDefault($saved);
}
Ожидаемый результат
de_DE -> de_DE: 1.234,5
xx_UNKNOWN -> en_US: 1,234.5
В настройках сайта доступны два языка. Первый выбор применён, второй заменён запасным. Теперь видно последствие установки: десятичный и групповой разделители изменились. Сам setDefault не переводит текст кнопок и не меняет уже созданные форматтеры. in_array с true сопоставляет точные ID разрешённых вариантов; для произвольного тега браузера ниже есть lookup.
Тот же механизм в процедурной форме: locale_set_default. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup, Locale::getDefault.
Locale::getPrimaryLanguageИзвлечь язык из выбранной локали для диагностики и маршрутизации интерфейса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getPrimaryLanguage(string $locale): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| locale | Исходный ID; операция выделяет записанную часть, а не анализирует текст пользователя. |
| Возврат | ?string. При отсутствии части не полагайтесь на непустое значение; слишком длинный ID может дать null. Проверяйте результат до индексации/конкатенации. |
| Ограничение | Основная языковая часть. Она не гарантирует, что пользователь понимает все региональные варианты этого языка. |
<?php
declare(strict_types=1);
echo Locale::getPrimaryLanguage("sr_Latn_RS"), "
";
Ожидаемый результат
sr
Читаем одну часть без ручного explode: структура locale сложнее фиксированных двух слов.
<?php
declare(strict_types=1);
$profileLocale = 'fr_CA';
$language = Locale::getPrimaryLanguage($profileLocale);
$labels = ['fr' => 'Panier', 'en' => 'Cart'];
echo $labels[$language] ?? $labels['en'], "\n";
Ожидаемый результат
Panier
У магазина одна французская подпись для всех регионов: fr_CA превращается в ключ fr, по которому берётся готовый перевод. Никакого машинного перевода функция не выполняет. Такая укрупнённая политика годится именно для общих строк этого магазина; если различия регионов существенны, не выбрасывайте их и выбирайте полный доступный вариант через lookup.
Тот же механизм в процедурной форме: locale_get_primary_language. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::addLikelySubtags.
locale_get_primary_languageИзвлечь язык из выбранной локали для диагностики и маршрутизации интерфейса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_primary_language(string $locale): ?stringПроцедурная форма Locale::getPrimaryLanguage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| locale | Исходный ID; операция выделяет записанную часть, а не анализирует текст пользователя. |
| Возврат | ?string. При отсутствии части не полагайтесь на непустое значение; слишком длинный ID может дать null. Проверяйте результат до индексации/конкатенации. |
| Ограничение | Основная языковая часть. Она не гарантирует, что пользователь понимает все региональные варианты этого языка. |
<?php
declare(strict_types=1);
echo Locale::getPrimaryLanguage("sr_Latn_RS"), "
";
Ожидаемый результат
sr
Читаем одну часть без ручного explode: структура locale сложнее фиксированных двух слов.
<?php
declare(strict_types=1);
$profileLocale = 'fr_CA';
$language = Locale::getPrimaryLanguage($profileLocale);
$labels = ['fr' => 'Panier', 'en' => 'Cart'];
echo $labels[$language] ?? $labels['en'], "\n";
Ожидаемый результат
Panier
У магазина одна французская подпись для всех регионов: fr_CA превращается в ключ fr, по которому берётся готовый перевод. Никакого машинного перевода функция не выполняет. Такая укрупнённая политика годится именно для общих строк этого магазина; если различия регионов существенны, не выбрасывайте их и выбирайте полный доступный вариант через lookup.
Тот же механизм в процедурной форме: locale_get_primary_language. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::addLikelySubtags.
Locale::getScriptИзвлечь письменность из выбранной локали для диагностики и маршрутизации интерфейса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getScript(string $locale): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| locale | Исходный ID; операция выделяет записанную часть, а не анализирует текст пользователя. |
| Возврат | ?string. При отсутствии части не полагайтесь на непустое значение; слишком длинный ID может дать null. Проверяйте результат до индексации/конкатенации. |
| Ограничение | Часть Script может отсутствовать; не приписывайте её стране вручную. Для вероятной письменности есть addLikelySubtags. |
<?php
declare(strict_types=1);
echo Locale::getScript("sr_Latn_RS"), "
";
Ожидаемый результат
Latn
Читаем одну часть без ручного explode: структура locale сложнее фиксированных двух слов.
<?php
declare(strict_types=1);
$menus = ['Hant' => '傳統中文', 'Hans' => '简体中文'];
foreach (['zh_Hant_TW', 'zh_Hans_CN', 'zh'] as $locale) {
$script = Locale::getScript($locale);
echo $locale, ': ', $menus[$script] ?? 'Попросить выбрать письменность', "\n";
}
Ожидаемый результат
zh_Hant_TW: 傳統中文
zh_Hans_CN: 简体中文
zh: Попросить выбрать письменность
Пользователь может выбрать традиционные или упрощённые китайские иероглифы. Метод извлекает явно записанную часть Script; у zh её нет. Поэтому третий случай требует решения продукта, а не обращения к несуществующему элементу массива. addLikelySubtags может предложить вероятный вариант, но сохранённый выбор человека важнее такой догадки.
Тот же механизм в процедурной форме: locale_get_script. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::addLikelySubtags.
locale_get_scriptИзвлечь письменность из выбранной локали для диагностики и маршрутизации интерфейса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_script(string $locale): ?stringПроцедурная форма Locale::getScript. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| locale | Исходный ID; операция выделяет записанную часть, а не анализирует текст пользователя. |
| Возврат | ?string. При отсутствии части не полагайтесь на непустое значение; слишком длинный ID может дать null. Проверяйте результат до индексации/конкатенации. |
| Ограничение | Часть Script может отсутствовать; не приписывайте её стране вручную. Для вероятной письменности есть addLikelySubtags. |
<?php
declare(strict_types=1);
echo Locale::getScript("sr_Latn_RS"), "
";
Ожидаемый результат
Latn
Читаем одну часть без ручного explode: структура locale сложнее фиксированных двух слов.
<?php
declare(strict_types=1);
$menus = ['Hant' => '傳統中文', 'Hans' => '简体中文'];
foreach (['zh_Hant_TW', 'zh_Hans_CN', 'zh'] as $locale) {
$script = Locale::getScript($locale);
echo $locale, ': ', $menus[$script] ?? 'Попросить выбрать письменность', "\n";
}
Ожидаемый результат
zh_Hant_TW: 傳統中文
zh_Hans_CN: 简体中文
zh: Попросить выбрать письменность
Пользователь может выбрать традиционные или упрощённые китайские иероглифы. Метод извлекает явно записанную часть Script; у zh её нет. Поэтому третий случай требует решения продукта, а не обращения к несуществующему элементу массива. addLikelySubtags может предложить вероятный вариант, но сохранённый выбор человека важнее такой догадки.
Тот же механизм в процедурной форме: locale_get_script. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::addLikelySubtags.
Locale::getRegionИзвлечь регион из выбранной локали для диагностики и маршрутизации интерфейса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getRegion(string $locale): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| locale | Исходный ID; операция выделяет записанную часть, а не анализирует текст пользователя. |
| Возврат | ?string. При отсутствии части не полагайтесь на непустое значение; слишком длинный ID может дать null. Проверяйте результат до индексации/конкатенации. |
| Ограничение | Регион — часть языковых предпочтений, не геолокация и не страна доставки. |
<?php
declare(strict_types=1);
echo Locale::getRegion("sr_Latn_RS"), "
";
Ожидаемый результат
RS
Читаем одну часть без ручного explode: структура locale сложнее фиксированных двух слов.
<?php
declare(strict_types=1);
$variants = ['GB' => 'Английский, вариант Великобритании', 'US' => 'Английский, вариант США'];
foreach (['en_GB', 'en_US', 'en'] as $locale) {
$region = Locale::getRegion($locale);
echo $variants[$region] ?? 'Регион языка не указан', "\n";
}
Ожидаемый результат
Английский, вариант Великобритании
Английский, вариант США
Регион языка не указан
Полученные GB и US — части языковых предпочтений. Они позволяют объяснить выбранный вариант в форме настроек. По ним нельзя назначать стоимость доставки, налог или местонахождение пользователя: человек с en_GB может жить где угодно. Для доставки нужно отдельное поле страны и адреса.
Тот же механизм в процедурной форме: locale_get_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::addLikelySubtags.
locale_get_regionИзвлечь регион из выбранной локали для диагностики и маршрутизации интерфейса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_region(string $locale): ?stringПроцедурная форма Locale::getRegion. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Что такое locale | Идентификатор правил языка/региона, например sr_Latn_RS: сербский язык, латиница, Сербия. Это не часовой пояс, не кодировка и не доказательство местонахождения посетителя. ICU обычно возвращает ID с подчёркиванием. |
| locale | Исходный ID; операция выделяет записанную часть, а не анализирует текст пользователя. |
| Возврат | ?string. При отсутствии части не полагайтесь на непустое значение; слишком длинный ID может дать null. Проверяйте результат до индексации/конкатенации. |
| Ограничение | Регион — часть языковых предпочтений, не геолокация и не страна доставки. |
<?php
declare(strict_types=1);
echo Locale::getRegion("sr_Latn_RS"), "
";
Ожидаемый результат
RS
Читаем одну часть без ручного explode: структура locale сложнее фиксированных двух слов.
<?php
declare(strict_types=1);
$variants = ['GB' => 'Английский, вариант Великобритании', 'US' => 'Английский, вариант США'];
foreach (['en_GB', 'en_US', 'en'] as $locale) {
$region = Locale::getRegion($locale);
echo $variants[$region] ?? 'Регион языка не указан', "\n";
}
Ожидаемый результат
Английский, вариант Великобритании
Английский, вариант США
Регион языка не указан
Полученные GB и US — части языковых предпочтений. Они позволяют объяснить выбранный вариант в форме настроек. По ним нельзя назначать стоимость доставки, налог или местонахождение пользователя: человек с en_GB может жить где угодно. Для доставки нужно отдельное поле страны и адреса.
Тот же механизм в процедурной форме: locale_get_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::addLikelySubtags.
Locale::getKeywordsПрочитать дополнительные настройки ICU в locale: календарь, сортировку, нумерацию.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getKeywords(string $locale): array|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Например en_US@calendar=gregorian;collation=phonebook. Пустая строка использует default locale. |
| Возврат | Ассоциативный array, null при отсутствии keywords/слишком длинном ID, false при ошибке. Ключи — имена настроек, значения — их строки; эти данные не являются массивом переводов. |
<?php
declare(strict_types=1);
$keywords = Locale::getKeywords("en_US@calendar=gregorian");
echo $keywords["calendar"], "
";
Ожидаемый результат
gregorian
Именованный ключ связывает настройку с её значением.
<?php
declare(strict_types=1);
foreach (['en_US', 'en_US@calendar=buddhist'] as $locale) {
$keywords = Locale::getKeywords($locale);
if ($keywords === false) {
echo "Не удалось разобрать настройки\n";
continue;
}
$calendar = $keywords['calendar'] ?? 'gregorian';
$labels = ['gregorian' => 'Григорианский календарь', 'buddhist' => 'Буддийский календарь'];
echo $labels[$calendar] ?? 'Календарь пока не поддерживается', "\n";
}
Ожидаемый результат
Григорианский календарь
Буддийский календарь
При отсутствии keywords метод возвращает null; оператор ?? выбирает запасной календарь. У второго профиля есть явная настройка. Массив labels — поддерживаемые подписи продукта. Выбор подписи ничего не пересчитывает: для календарных вычислений передают выбранный профиль IntlCalendar, для даты на странице — IntlDateFormatter.
Тот же механизм в процедурной форме: locale_get_keywords. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, IntlCalendar::getType.
locale_get_keywordsПрочитать дополнительные настройки ICU в locale: календарь, сортировку, нумерацию.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_keywords(string $locale): array|false|nullПроцедурная форма Locale::getKeywords. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Например en_US@calendar=gregorian;collation=phonebook. Пустая строка использует default locale. |
| Возврат | Ассоциативный array, null при отсутствии keywords/слишком длинном ID, false при ошибке. Ключи — имена настроек, значения — их строки; эти данные не являются массивом переводов. |
<?php
declare(strict_types=1);
$keywords = Locale::getKeywords("en_US@calendar=gregorian");
echo $keywords["calendar"], "
";
Ожидаемый результат
gregorian
Именованный ключ связывает настройку с её значением.
<?php
declare(strict_types=1);
foreach (['en_US', 'en_US@calendar=buddhist'] as $locale) {
$keywords = Locale::getKeywords($locale);
if ($keywords === false) {
echo "Не удалось разобрать настройки\n";
continue;
}
$calendar = $keywords['calendar'] ?? 'gregorian';
$labels = ['gregorian' => 'Григорианский календарь', 'buddhist' => 'Буддийский календарь'];
echo $labels[$calendar] ?? 'Календарь пока не поддерживается', "\n";
}
Ожидаемый результат
Григорианский календарь
Буддийский календарь
При отсутствии keywords метод возвращает null; оператор ?? выбирает запасной календарь. У второго профиля есть явная настройка. Массив labels — поддерживаемые подписи продукта. Выбор подписи ничего не пересчитывает: для календарных вычислений передают выбранный профиль IntlCalendar, для даты на странице — IntlDateFormatter.
Тот же механизм в процедурной форме: locale_get_keywords. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, IntlCalendar::getType.
Locale::getDisplayLanguageПоказать название языка в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getDisplayLanguage(string $locale, ?string $displayLocale = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayLanguage("de_DE", "en"), "
";
Ожидаемый результат
German
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['de_DE', 'fr_FR'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayLanguage($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="de_DE">German</option><option value="fr_FR">French</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_language. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.
locale_get_display_languageПоказать название языка в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_display_language(string $locale, ?string $displayLocale = null): string|falseПроцедурная форма Locale::getDisplayLanguage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayLanguage("de_DE", "en"), "
";
Ожидаемый результат
German
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['de_DE', 'fr_FR'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayLanguage($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="de_DE">German</option><option value="fr_FR">French</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_language. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.
Locale::getDisplayScriptПоказать название письменности в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getDisplayScript(string $locale, ?string $displayLocale = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayScript("sr_Latn_RS", "en"), "
";
Ожидаемый результат
Latin
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['sr_Latn_RS', 'zh_Hant_TW'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayScript($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="sr_Latn_RS">Latin</option><option value="zh_Hant_TW">Traditional Han</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_script. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.
locale_get_display_scriptПоказать название письменности в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_display_script(string $locale, ?string $displayLocale = null): string|falseПроцедурная форма Locale::getDisplayScript. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayScript("sr_Latn_RS", "en"), "
";
Ожидаемый результат
Latin
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['sr_Latn_RS', 'zh_Hant_TW'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayScript($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="sr_Latn_RS">Latin</option><option value="zh_Hant_TW">Traditional Han</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_script. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.
Locale::getDisplayRegionПоказать название региона в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getDisplayRegion(string $locale, ?string $displayLocale = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayRegion("en_US", "en"), "
";
Ожидаемый результат
United States
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['en_US', 'en_GB'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayRegion($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="en_US">United States</option><option value="en_GB">United Kingdom</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.
locale_get_display_regionПоказать название региона в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_display_region(string $locale, ?string $displayLocale = null): string|falseПроцедурная форма Locale::getDisplayRegion. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayRegion("en_US", "en"), "
";
Ожидаемый результат
United States
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['en_US', 'en_GB'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayRegion($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="en_US">United States</option><option value="en_GB">United Kingdom</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.
Locale::getDisplayNameПоказать полное название локали в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getDisplayName(string $locale, ?string $displayLocale = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayName("de_DE", "en"), "
";
Ожидаемый результат
German (Germany)
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['de_DE', 'fr_FR'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayName($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="de_DE">German (Germany)</option><option value="fr_FR">French (France)</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_name. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDisplayLanguage.
locale_get_display_nameПоказать полное название локали в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_display_name(string $locale, ?string $displayLocale = null): string|falseПроцедурная форма Locale::getDisplayName. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayName("de_DE", "en"), "
";
Ожидаемый результат
German (Germany)
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['de_DE', 'fr_FR'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayName($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="de_DE">German (Germany)</option><option value="fr_FR">French (France)</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_name. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDisplayLanguage.
Locale::getDisplayVariantПоказать название варианта в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getDisplayVariant(string $locale, ?string $displayLocale = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayVariant("en_US_POSIX", "en"), "
";
Ожидаемый результат
Computer
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['en_US', 'en_US_POSIX'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayVariant($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="en_US">Standard</option><option value="en_US_POSIX">Computer</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_variant. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.
locale_get_display_variantПоказать название варианта в переключателе языка понятным человеку текстом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_display_variant(string $locale, ?string $displayLocale = null): string|falseПроцедурная форма Locale::getDisplayVariant. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Локаль, которую называем. |
| displayLocale | Язык подписи, например en. null использует default locale; nullable с PHP 8.0. |
| Возврат | string|false. Это данные ICU/CLDR: формулировки могут измениться с версией. Сохраняйте ID как значение option, а подпись используйте только для отображения. |
<?php
declare(strict_types=1);
echo Locale::getDisplayVariant("en_US_POSIX", "en"), "
";
Ожидаемый результат
Computer
Первый аргумент — что называем, второй — на каком языке это назвать.
<?php
declare(strict_types=1);
$available = ['en_US', 'en_US_POSIX'];
echo '<label>Language profile <select name="locale">';
foreach ($available as $id) {
$label = Locale::getDisplayVariant($id, 'en');
if ($label === false) { continue; }
if ($label === '') { $label = 'Standard'; }
echo '<option value="', htmlspecialchars($id, ENT_QUOTES, 'UTF-8'), '">',
htmlspecialchars($label, ENT_QUOTES, 'UTF-8'), '</option>';
}
echo '</select></label>';
Ожидаемый результат
<label>Language profile <select name="locale"><option value="en_US">Standard</option><option value="en_US_POSIX">Computer</option></select></label>PHP формирует настоящий select: человек видит подпись, а при отправке родительской формы сервер получит ID из value. Это самостоятельный фрагмент вывода; обработчик сохранения здесь ещё не добавлен. Имена берутся на английском, потому что второй аргумент равен en. Пустое название варианта заменяется Standard; false пропускается как отказ. Подписи CLDR могут измениться с ICU, поэтому сохранять надо ID, а не переведённое название. Весь текст для HTML экранирован.
Тот же механизм в процедурной форме: locale_get_display_variant. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.
Locale::composeLocaleСобрать locale из частей настроек, не ошибившись в порядке языка, письменности и региона.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::composeLocale(array $subtags): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| subtags | Ассоциативный array с language/script/region и дополнительными variant0…variant14, private0…private14, extlang0…extlang2. Варианты также можно передать массивами под variant/private/extlang: тогда указанного ограничения числа распознанных частей нет. |
| Возврат | string; пустой вход даёт false. Корректно собранный ID ещё не означает, что сайт поддерживает такой перевод. |
<?php
declare(strict_types=1);
echo Locale::composeLocale(["language" => "sr", "script" => "Latn", "region" => "RS"]), "
";
Ожидаемый результат
sr_Latn_RS
Ключи объясняют назначение значений лучше, чем конкатенация трёх неочевидных переменных.
<?php
declare(strict_types=1);
foreach ([[], ['language' => 'de', 'region' => 'DE']] as $settings) {
$locale = Locale::composeLocale($settings);
if ($locale === false) {
$locale = 'en_US';
echo 'Настройки пусты, выбран запасной язык. ';
}
$formatter = new NumberFormatter($locale, NumberFormatter::DECIMAL);
echo $locale, ': ', $formatter->format(1234.5), "\n";
}
Ожидаемый результат
Настройки пусты, выбран запасной язык. en_US: 1,234.5
de_DE: 1.234,5
Пустой массив не превращается в правильную локаль: composeLocale даёт false. Здесь вызывающий код выбирает запасной en_US, затем формирует число. Второй набор содержит осмысленные language и region. Если эти настройки поступают от пользователя, сначала ограничьте их вариантами, которые поддерживает продукт; построение ID само по себе не проверяет наличие перевода.
Тот же механизм в процедурной форме: locale_compose. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::canonicalize.
locale_composeСобрать locale из частей настроек, не ошибившись в порядке языка, письменности и региона.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_compose(array $subtags): string|falseПроцедурная форма Locale::composeLocale. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| subtags | Ассоциативный array с language/script/region и дополнительными variant0…variant14, private0…private14, extlang0…extlang2. Варианты также можно передать массивами под variant/private/extlang: тогда указанного ограничения числа распознанных частей нет. |
| Возврат | string; пустой вход даёт false. Корректно собранный ID ещё не означает, что сайт поддерживает такой перевод. |
<?php
declare(strict_types=1);
echo Locale::composeLocale(["language" => "sr", "script" => "Latn", "region" => "RS"]), "
";
Ожидаемый результат
sr_Latn_RS
Ключи объясняют назначение значений лучше, чем конкатенация трёх неочевидных переменных.
<?php
declare(strict_types=1);
foreach ([[], ['language' => 'de', 'region' => 'DE']] as $settings) {
$locale = Locale::composeLocale($settings);
if ($locale === false) {
$locale = 'en_US';
echo 'Настройки пусты, выбран запасной язык. ';
}
$formatter = new NumberFormatter($locale, NumberFormatter::DECIMAL);
echo $locale, ': ', $formatter->format(1234.5), "\n";
}
Ожидаемый результат
Настройки пусты, выбран запасной язык. en_US: 1,234.5
de_DE: 1.234,5
Пустой массив не превращается в правильную локаль: composeLocale даёт false. Здесь вызывающий код выбирает запасной en_US, затем формирует число. Второй набор содержит осмысленные language и region. Если эти настройки поступают от пользователя, сначала ограничьте их вариантами, которые поддерживает продукт; построение ID само по себе не проверяет наличие перевода.
Тот же механизм в процедурной форме: locale_compose. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale, Locale::canonicalize.
Locale::parseLocaleПолучить все части locale в массиве, когда экран настроек редактирует их отдельно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::parseLocale(string $locale): ?array| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Исходный ID; пустой использует default. До 15 variant/private и до 3 extlang в разборе. |
| Возврат | ?array с language, script, region и пронумерованными вариантами в их исходном порядке. Не все ключи обязательно присутствуют. Слишком длинный ID даёт null. |
<?php
declare(strict_types=1);
$parts = Locale::parseLocale("sr_Latn_RS");
echo $parts["language"], " / ", $parts["script"], " / ", $parts["region"], "
";
Ожидаемый результат
sr / Latn / RS
Массив здесь является словарём: имя ключа определяет смысл поля.
<?php
declare(strict_types=1);
$savedLocale = 'sr_Latn_RS';
$parts = Locale::parseLocale($savedLocale);
if ($parts === null) {
echo "Не удалось разобрать профиль\n";
} else {
echo 'Язык: ', $parts['language'] ?? 'не указан', "\n";
echo 'Письменность: ', $parts['script'] ?? 'не указана', "\n";
echo 'Регион языка: ', $parts['region'] ?? 'не указан', "\n";
}
Ожидаемый результат
Язык: sr
Письменность: Latn
Регион языка: RS
Разбор превращает один ID в отдельные значения для редактора настроек. Для en будет только язык: две остальные строки покажут подсказку, а не warning об отсутствующем ключе. В настоящем HTML подставляйте полученные значения в разрешённые варианты select и экранируйте текст. Обратная операция — composeLocale.
Тот же механизм в процедурной форме: locale_parse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::composeLocale, Locale::getAllVariants.
locale_parseПолучить все части locale в массиве, когда экран настроек редактирует их отдельно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_parse(string $locale): ?arrayПроцедурная форма Locale::parseLocale. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Исходный ID; пустой использует default. До 15 variant/private и до 3 extlang в разборе. |
| Возврат | ?array с language, script, region и пронумерованными вариантами в их исходном порядке. Не все ключи обязательно присутствуют. Слишком длинный ID даёт null. |
<?php
declare(strict_types=1);
$parts = Locale::parseLocale("sr_Latn_RS");
echo $parts["language"], " / ", $parts["script"], " / ", $parts["region"], "
";
Ожидаемый результат
sr / Latn / RS
Массив здесь является словарём: имя ключа определяет смысл поля.
<?php
declare(strict_types=1);
$savedLocale = 'sr_Latn_RS';
$parts = Locale::parseLocale($savedLocale);
if ($parts === null) {
echo "Не удалось разобрать профиль\n";
} else {
echo 'Язык: ', $parts['language'] ?? 'не указан', "\n";
echo 'Письменность: ', $parts['script'] ?? 'не указана', "\n";
echo 'Регион языка: ', $parts['region'] ?? 'не указан', "\n";
}
Ожидаемый результат
Язык: sr
Письменность: Latn
Регион языка: RS
Разбор превращает один ID в отдельные значения для редактора настроек. Для en будет только язык: две остальные строки покажут подсказку, а не warning об отсутствующем ключе. В настоящем HTML подставляйте полученные значения в разрешённые варианты select и экранируйте текст. Обратная операция — composeLocale.
Тот же механизм в процедурной форме: locale_parse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::composeLocale, Locale::getAllVariants.
Locale::getAllVariantsПолучить дополнительные варианты locale отдельно от языка и региона.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::getAllVariants(string $locale): ?array| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ID вроде en_US_POSIX. Variant уточняет правила, а не означает произвольное пользовательское поле. |
| Возврат | ?array строк вариантов; документация допускает null при отсутствии/слишком длинном ID, runtime может возвращать пустой массив. Проверяйте отсутствие через пустой результат, не обращайтесь без проверки к [0]. |
<?php
declare(strict_types=1);
echo implode(",", Locale::getAllVariants("en_US_POSIX") ?? []), "
";
Ожидаемый результат
POSIX
POSIX — отдельный вариант, а не регион.
<?php
declare(strict_types=1);
foreach (['en_US', 'en_US_POSIX'] as $locale) {
$variants = Locale::getAllVariants($locale);
if ($variants === null) {
echo "Профиль не удалось разобрать\n";
continue;
}
echo $locale, ': ', $variants === [] ? 'обычный вариант' : implode(', ', $variants), "\n";
}
Ожидаемый результат
en_US: обычный вариант
en_US_POSIX: POSIX
Экран диагностики показывает, почему два похожих профиля могут вести себя по-разному. US — регион, POSIX — отдельный вариант. Список может быть пустым. getAllVariants не сравнивает правила форматирования и не гарантирует одинаковую поддержку вариантов во всех операциях ICU.
Тот же механизм в процедурной форме: locale_get_all_variants. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale.
locale_get_all_variantsПолучить дополнительные варианты locale отдельно от языка и региона.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_get_all_variants(string $locale): ?arrayПроцедурная форма Locale::getAllVariants. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ID вроде en_US_POSIX. Variant уточняет правила, а не означает произвольное пользовательское поле. |
| Возврат | ?array строк вариантов; документация допускает null при отсутствии/слишком длинном ID, runtime может возвращать пустой массив. Проверяйте отсутствие через пустой результат, не обращайтесь без проверки к [0]. |
<?php
declare(strict_types=1);
echo implode(",", Locale::getAllVariants("en_US_POSIX") ?? []), "
";
Ожидаемый результат
POSIX
POSIX — отдельный вариант, а не регион.
<?php
declare(strict_types=1);
foreach (['en_US', 'en_US_POSIX'] as $locale) {
$variants = Locale::getAllVariants($locale);
if ($variants === null) {
echo "Профиль не удалось разобрать\n";
continue;
}
echo $locale, ': ', $variants === [] ? 'обычный вариант' : implode(', ', $variants), "\n";
}
Ожидаемый результат
en_US: обычный вариант
en_US_POSIX: POSIX
Экран диагностики показывает, почему два похожих профиля могут вести себя по-разному. US — регион, POSIX — отдельный вариант. Список может быть пустым. getAllVariants не сравнивает правила форматирования и не гарантирует одинаковую поддержку вариантов во всех операциях ICU.
Тот же механизм в процедурной форме: locale_get_all_variants. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::parseLocale.
Locale::filterMatchesПроверить, входит ли конкретный языковой тег в диапазон поддерживаемого языка.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::filterMatches(string $languageTag, string $locale, bool $canonicalize = false): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| languageTag,locale | Первый — конкретный тег, второй — диапазон basic filtering RFC 4647, например en_US и en. Это не приблизительное сравнение человеческих названий. |
| canonicalize | true сначала приводит входы к канонической форме. |
| Возврат | ?bool: совпадает, не совпадает, либо null при слишком длинном locale. Не равно поиску лучшего варианта из набора. |
<?php
declare(strict_types=1);
var_dump(Locale::filterMatches("en_US", "en", true));
Ожидаемый результат
bool(true)
Широкий диапазон языка охватывает региональный вариант.
<?php
declare(strict_types=1);
$articles = [
['locale' => 'en_US', 'title' => 'Installing the client'],
['locale' => 'de_DE', 'title' => 'Installation'],
['locale' => 'en_GB', 'title' => 'Colour settings'],
];
foreach ($articles as $article) {
if (Locale::filterMatches($article['locale'], 'en', true)) {
echo $article['title'], "\n";
}
}
Ожидаемый результат
Installing the client
Colour settings
Человек выбрал фильтр «английский». Обе региональные локали проходят языковой диапазон en; немецкая статья пропускается. Функция проверяет соответствие диапазону, не определяет язык текста автоматически. Для выбора единственного перевода из списка есть lookup; для вывода списка подходит такой перебор.
Тот же механизм в процедурной форме: locale_filter_matches. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup, Locale::acceptFromHttp.
locale_filter_matchesПроверить, входит ли конкретный языковой тег в диапазон поддерживаемого языка.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_filter_matches(string $languageTag, string $locale, bool $canonicalize = false): ?boolПроцедурная форма Locale::filterMatches. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| languageTag,locale | Первый — конкретный тег, второй — диапазон basic filtering RFC 4647, например en_US и en. Это не приблизительное сравнение человеческих названий. |
| canonicalize | true сначала приводит входы к канонической форме. |
| Возврат | ?bool: совпадает, не совпадает, либо null при слишком длинном locale. Не равно поиску лучшего варианта из набора. |
<?php
declare(strict_types=1);
var_dump(Locale::filterMatches("en_US", "en", true));
Ожидаемый результат
bool(true)
Широкий диапазон языка охватывает региональный вариант.
<?php
declare(strict_types=1);
$articles = [
['locale' => 'en_US', 'title' => 'Installing the client'],
['locale' => 'de_DE', 'title' => 'Installation'],
['locale' => 'en_GB', 'title' => 'Colour settings'],
];
foreach ($articles as $article) {
if (Locale::filterMatches($article['locale'], 'en', true)) {
echo $article['title'], "\n";
}
}
Ожидаемый результат
Installing the client
Colour settings
Человек выбрал фильтр «английский». Обе региональные локали проходят языковой диапазон en; немецкая статья пропускается. Функция проверяет соответствие диапазону, не определяет язык текста автоматически. Для выбора единственного перевода из списка есть lookup; для вывода списка подходит такой перебор.
Тот же механизм в процедурной форме: locale_filter_matches. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup, Locale::acceptFromHttp.
Locale::lookupВыбрать ближайший перевод из тех, которые действительно есть у сайта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::lookup(array $languageTag, string $locale, bool $canonicalize = false, ?string $defaultLocale = null): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| languageTag | Массив до 100 поддерживаемых тегов. |
| locale | Запрошенный язык/диапазон; поиск по RFC 4647 lookup. |
| canonicalize,defaultLocale | Канонизировать ли входы; запасной ID, если совпадения нет. defaultLocale допускает null с PHP 7.4. |
| Возврат | ?string: совпадение либо default. Слишком длинный locale даёт null. Не используйте результат как путь include без отдельного фиксированного отображения ID → файл. |
<?php
declare(strict_types=1);
echo Locale::lookup(["en", "de"], "en_GB", true, "de"), "
";
Ожидаемый результат
en
Запрос региона может отступить к общему языку.
<?php
declare(strict_types=1);
$translations = ['en' => 'Cart', 'de' => 'Warenkorb'];
foreach (['de_DE', 'ja_JP'] as $requested) {
$chosen = Locale::lookup(array_keys($translations), $requested, true, 'en');
echo $requested, ' -> ', $chosen, ': ', $translations[$chosen], "\n";
}
Ожидаемый результат
de_DE -> de: Warenkorb
ja_JP -> en: Cart
Список реальных переводов взят из ключей массива. de_DE отступает к доступному de; японского перевода нет, поэтому применён en. Сохранённый язык пользователя или один предпочтительный тег браузера передают вторым аргументом. Целую строку Accept-Language с запятыми и q сюда передавать нельзя. Обратите внимание: lookup не обязан превращать общий fr в произвольный fr_FR; выбирайте доступные теги и запасные правила продукта осознанно.
Тот же механизм в процедурной форме: locale_lookup. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::acceptFromHttp, Locale::filterMatches.
locale_lookupВыбрать ближайший перевод из тех, которые действительно есть у сайта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_lookup(array $languageTag, string $locale, bool $canonicalize = false, ?string $defaultLocale = null): ?stringПроцедурная форма Locale::lookup. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| languageTag | Массив до 100 поддерживаемых тегов. |
| locale | Запрошенный язык/диапазон; поиск по RFC 4647 lookup. |
| canonicalize,defaultLocale | Канонизировать ли входы; запасной ID, если совпадения нет. defaultLocale допускает null с PHP 7.4. |
| Возврат | ?string: совпадение либо default. Слишком длинный locale даёт null. Не используйте результат как путь include без отдельного фиксированного отображения ID → файл. |
<?php
declare(strict_types=1);
echo Locale::lookup(["en", "de"], "en_GB", true, "de"), "
";
Ожидаемый результат
en
Запрос региона может отступить к общему языку.
<?php
declare(strict_types=1);
$translations = ['en' => 'Cart', 'de' => 'Warenkorb'];
foreach (['de_DE', 'ja_JP'] as $requested) {
$chosen = Locale::lookup(array_keys($translations), $requested, true, 'en');
echo $requested, ' -> ', $chosen, ': ', $translations[$chosen], "\n";
}
Ожидаемый результат
de_DE -> de: Warenkorb
ja_JP -> en: Cart
Список реальных переводов взят из ключей массива. de_DE отступает к доступному de; японского перевода нет, поэтому применён en. Сохранённый язык пользователя или один предпочтительный тег браузера передают вторым аргументом. Целую строку Accept-Language с запятыми и q сюда передавать нельзя. Обратите внимание: lookup не обязан превращать общий fr в произвольный fr_FR; выбирайте доступные теги и запасные правила продукта осознанно.
Тот же механизм в процедурной форме: locale_lookup. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::acceptFromHttp, Locale::filterMatches.
Locale::acceptFromHttpПрочитать предпочтения браузера из Accept-Language, прежде чем выбрать поддерживаемый перевод.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::acceptFromHttp(string $header): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| header | Строка заголовка с тегами и весами q. Пользователь может подделать её, поэтому это предпочтение, а не доверенная идентичность. |
| Возврат | string|false; слишком длинный заголовок относительно INTL_MAX_LOCALE_LEN даёт false. После этого всё равно сопоставьте результат со списком ваших переводов. |
<?php
declare(strict_types=1);
echo Locale::acceptFromHttp("de-DE,de;q=0.9,en;q=0.5"), "
";
Ожидаемый результат
de_DE
Число q задаёт предпочтение, а не процент людей с этим языком.
<?php
declare(strict_types=1);
$header = 'fr-FR,fr;q=0.9,de;q=0.8';
$preferred = Locale::acceptFromHttp($header);
$translations = ['en' => 'Cart', 'de' => 'Warenkorb'];
$chosen = Locale::lookup(array_keys($translations), $preferred ?: 'en', true, 'en');
echo 'Предпочтение браузера: ', $preferred, "\n";
echo 'Выбор по одному тегу: ', $chosen, "\n";
echo 'Подпись: ', $translations[$chosen], "\n";
Ожидаемый результат
Предпочтение браузера: fr_FR
Выбор по одному тегу: en
Подпись: Cart
Это намеренно ограниченная политика: получено одно предпочтение fr_FR, оно недоступно, выбран запасной en. Хотя в заголовке указан de, цепочка уже потеряла остальные предпочтения. Поэтому её нельзя объявлять полноценным подбором лучшего поддерживаемого языка. Для такого подбора нужен разбор всех диапазонов и весов библиотекой согласования языка. Сохранённый явный выбор пользователя обычно ставят выше заголовка. acceptFromHttp не знает, какие тексты переведены именно у вас.
Тот же механизм в процедурной форме: locale_accept_from_http. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup, Locale::setDefault.
locale_accept_from_httpПрочитать предпочтения браузера из Accept-Language, прежде чем выбрать поддерживаемый перевод.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_accept_from_http(string $header): string|falseПроцедурная форма Locale::acceptFromHttp. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| header | Строка заголовка с тегами и весами q. Пользователь может подделать её, поэтому это предпочтение, а не доверенная идентичность. |
| Возврат | string|false; слишком длинный заголовок относительно INTL_MAX_LOCALE_LEN даёт false. После этого всё равно сопоставьте результат со списком ваших переводов. |
<?php
declare(strict_types=1);
echo Locale::acceptFromHttp("de-DE,de;q=0.9,en;q=0.5"), "
";
Ожидаемый результат
de_DE
Число q задаёт предпочтение, а не процент людей с этим языком.
<?php
declare(strict_types=1);
$header = 'fr-FR,fr;q=0.9,de;q=0.8';
$preferred = Locale::acceptFromHttp($header);
$translations = ['en' => 'Cart', 'de' => 'Warenkorb'];
$chosen = Locale::lookup(array_keys($translations), $preferred ?: 'en', true, 'en');
echo 'Предпочтение браузера: ', $preferred, "\n";
echo 'Выбор по одному тегу: ', $chosen, "\n";
echo 'Подпись: ', $translations[$chosen], "\n";
Ожидаемый результат
Предпочтение браузера: fr_FR
Выбор по одному тегу: en
Подпись: Cart
Это намеренно ограниченная политика: получено одно предпочтение fr_FR, оно недоступно, выбран запасной en. Хотя в заголовке указан de, цепочка уже потеряла остальные предпочтения. Поэтому её нельзя объявлять полноценным подбором лучшего поддерживаемого языка. Для такого подбора нужен разбор всех диапазонов и весов библиотекой согласования языка. Сохранённый явный выбор пользователя обычно ставят выше заголовка. acceptFromHttp не знает, какие тексты переведены именно у вас.
Тот же механизм в процедурной форме: locale_accept_from_http. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup, Locale::setDefault.
Locale::canonicalizeПривести написание идентификатора к форме ICU перед сравнением настроек.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::canonicalize(string $locale): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Строка ID; это нормализация написания, а не проверка существования перевода/реального языка. |
| Возврат | ?string; слишком длинная строка может дать null. Для получения вероятных недостающих частей нужен отдельный addLikelySubtags. |
<?php
declare(strict_types=1);
echo Locale::canonicalize("EN-us"), "
";
Ожидаемый результат
en_US
Одни и те же настройки могут прийти из разных клиентов с разным регистром.
<?php
declare(strict_types=1);
$labels = ['en_US' => 'English (US)', 'sr_Latn_RS' => 'Srpski — latinica'];
foreach (['EN-us', 'en_US', 'sr-latn-rs', 'xx-YY'] as $raw) {
$id = Locale::canonicalize($raw);
echo $raw, ': ', $labels[$id ?? ''] ?? 'Профиль не поддерживается', "\n";
}
Ожидаемый результат
EN-us: English (US)
en_US: English (US)
sr-latn-rs: Srpski — latinica
xx-YY: Профиль не поддерживается
Два написания английского профиля стали одним ключом конфигурации. Письменность Latn сохранена. Нормализация xx-YY не превращает его в поддерживаемый язык: решает явный список labels. Не подставляйте канонизированную пользовательскую строку напрямую в имя PHP-файла для include.
Тот же механизм в процедурной форме: locale_canonicalize. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::addLikelySubtags, Locale::minimizeSubtags.
locale_canonicalizeПривести написание идентификатора к форме ICU перед сравнением настроек.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_canonicalize(string $locale): ?stringПроцедурная форма Locale::canonicalize. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Строка ID; это нормализация написания, а не проверка существования перевода/реального языка. |
| Возврат | ?string; слишком длинная строка может дать null. Для получения вероятных недостающих частей нужен отдельный addLikelySubtags. |
<?php
declare(strict_types=1);
echo Locale::canonicalize("EN-us"), "
";
Ожидаемый результат
en_US
Одни и те же настройки могут прийти из разных клиентов с разным регистром.
<?php
declare(strict_types=1);
$labels = ['en_US' => 'English (US)', 'sr_Latn_RS' => 'Srpski — latinica'];
foreach (['EN-us', 'en_US', 'sr-latn-rs', 'xx-YY'] as $raw) {
$id = Locale::canonicalize($raw);
echo $raw, ': ', $labels[$id ?? ''] ?? 'Профиль не поддерживается', "\n";
}
Ожидаемый результат
EN-us: English (US)
en_US: English (US)
sr-latn-rs: Srpski — latinica
xx-YY: Профиль не поддерживается
Два написания английского профиля стали одним ключом конфигурации. Письменность Latn сохранена. Нормализация xx-YY не превращает его в поддерживаемый язык: решает явный список labels. Не подставляйте канонизированную пользовательскую строку напрямую в имя PHP-файла для include.
Тот же механизм в процедурной форме: locale_canonicalize. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::addLikelySubtags, Locale::minimizeSubtags.
Locale::addLikelySubtagsУточнить или сократить языковую настройку по известным ICU вероятным сочетаниям.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::addLikelySubtags(string $locale): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Добавляет вероятные язык/письменность/регион по данным ICU. Вероятность не доказывает фактическое предпочтение человека. |
| Возврат | string|false. Нулевой байт в locale вызывает ValueError. Новые операции: доступность проверяйте по версии установленного PHP/intl. |
<?php
declare(strict_types=1);
echo Locale::addLikelySubtags("en"), "
";
Ожидаемый результат
en_Latn_US
Добавляет вероятные язык/письменность/регион по данным ICU. Вероятность не доказывает фактическое предпочтение человека.
<?php
declare(strict_types=1);
foreach (['zh_TW', 'zh'] as $locale) {
$expanded = Locale::addLikelySubtags($locale);
if ($expanded === false) { echo "Нужно выбрать язык вручную\n"; continue; }
$script = Locale::getScript($expanded);
echo $locale, ': предложить ', $script === 'Hant' ? 'традиционное письмо' : 'упрощённое письмо', "\n";
}
Ожидаемый результат
zh_TW: предложить традиционное письмо
zh: предложить упрощённое письмо
В этом ограниченном примере рассматриваются только китайские профили. ICU дополняет zh_TW до вероятного Hant, а общий zh — до Hans. Это подсказка при первом выборе; она не доказывает предпочтение конкретного человека. Если он уже выбрал Hant, нельзя перезаписать его выбор результатом для общего zh.
Тот же механизм в процедурной форме: locale_add_likely_subtags. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::canonicalize, Locale::getScript.
locale_add_likely_subtagsУточнить или сократить языковую настройку по известным ICU вероятным сочетаниям.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_add_likely_subtags(string $locale): string|falseПроцедурная форма Locale::addLikelySubtags. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Добавляет вероятные язык/письменность/регион по данным ICU. Вероятность не доказывает фактическое предпочтение человека. |
| Возврат | string|false. Нулевой байт в locale вызывает ValueError. Новые операции: доступность проверяйте по версии установленного PHP/intl. |
<?php
declare(strict_types=1);
echo Locale::addLikelySubtags("en"), "
";
Ожидаемый результат
en_Latn_US
Добавляет вероятные язык/письменность/регион по данным ICU. Вероятность не доказывает фактическое предпочтение человека.
<?php
declare(strict_types=1);
foreach (['zh_TW', 'zh'] as $locale) {
$expanded = Locale::addLikelySubtags($locale);
if ($expanded === false) { echo "Нужно выбрать язык вручную\n"; continue; }
$script = Locale::getScript($expanded);
echo $locale, ': предложить ', $script === 'Hant' ? 'традиционное письмо' : 'упрощённое письмо', "\n";
}
Ожидаемый результат
zh_TW: предложить традиционное письмо
zh: предложить упрощённое письмо
В этом ограниченном примере рассматриваются только китайские профили. ICU дополняет zh_TW до вероятного Hant, а общий zh — до Hans. Это подсказка при первом выборе; она не доказывает предпочтение конкретного человека. Если он уже выбрал Hant, нельзя перезаписать его выбор результатом для общего zh.
Тот же механизм в процедурной форме: locale_add_likely_subtags. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::canonicalize, Locale::getScript.
Locale::minimizeSubtagsУточнить или сократить языковую настройку по известным ICU вероятным сочетаниям.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Locale::minimizeSubtags(string $locale): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Удаляет части, которые вероятные данные восстановят. Сокращение зависит от ICU и не предназначено для удаления пользовательской настройки без её согласия. |
| Возврат | string|false. Нулевой байт в locale вызывает ValueError. Новые операции: доступность проверяйте по версии установленного PHP/intl. |
<?php
declare(strict_types=1);
echo Locale::minimizeSubtags("en_Latn_US"), "
";
Ожидаемый результат
en
Удаляет части, которые вероятные данные восстановят. Сокращение зависит от ICU и не предназначено для удаления пользовательской настройки без её согласия.
<?php
declare(strict_types=1);
foreach (['en_Latn_US', 'zh_Hant_TW'] as $locale) {
$short = Locale::minimizeSubtags($locale);
if ($short === false) { echo "Не удалось сократить локаль\n"; continue; }
echo $locale, ' -> ', $short, ' -> ', Locale::addLikelySubtags($short), "\n";
}
Ожидаемый результат
en_Latn_US -> en -> en_Latn_US
zh_Hant_TW -> zh_TW -> zh_Hant_TW
Среднее значение — сокращённый идентификатор, последнее — восстановленный вероятный профиль. zh_TW не сокращён до zh: это поменяло бы вероятную письменность. Такая операция полезна при унификации ключей языковой конфигурации, но не должна молча удалять смысл сохранённых пользовательских настроек. Результат зависит от данных ICU.
Тот же механизм в процедурной форме: locale_minimize_subtags. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::canonicalize, Locale::getScript.
locale_minimize_subtagsУточнить или сократить языковую настройку по известным ICU вероятным сочетаниям.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
locale_minimize_subtags(string $locale): string|falseПроцедурная форма Locale::minimizeSubtags. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Удаляет части, которые вероятные данные восстановят. Сокращение зависит от ICU и не предназначено для удаления пользовательской настройки без её согласия. |
| Возврат | string|false. Нулевой байт в locale вызывает ValueError. Новые операции: доступность проверяйте по версии установленного PHP/intl. |
<?php
declare(strict_types=1);
echo Locale::minimizeSubtags("en_Latn_US"), "
";
Ожидаемый результат
en
Удаляет части, которые вероятные данные восстановят. Сокращение зависит от ICU и не предназначено для удаления пользовательской настройки без её согласия.
<?php
declare(strict_types=1);
foreach (['en_Latn_US', 'zh_Hant_TW'] as $locale) {
$short = Locale::minimizeSubtags($locale);
if ($short === false) { echo "Не удалось сократить локаль\n"; continue; }
echo $locale, ' -> ', $short, ' -> ', Locale::addLikelySubtags($short), "\n";
}
Ожидаемый результат
en_Latn_US -> en -> en_Latn_US
zh_Hant_TW -> zh_TW -> zh_Hant_TW
Среднее значение — сокращённый идентификатор, последнее — восстановленный вероятный профиль. zh_TW не сокращён до zh: это поменяло бы вероятную письменность. Такая операция полезна при унификации ключей языковой конфигурации, но не должна молча удалять смысл сохранённых пользовательских настроек. Результат зависит от данных ICU.
Тот же механизм в процедурной форме: locale_minimize_subtags. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::canonicalize, Locale::getScript.
Locale::isRightToLeftВыбрать направление интерфейса для языка с письмом справа налево.
PHP 8.5+ · intl
static Locale::isRightToLeft(string $locale): bool| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ID; пустая строка берёт default. Метод появился в PHP 8.5. |
| Возврат | bool. Это свойство локали, не анализ каждого символа в смешанном тексте. В HTML используйте dir/логические CSS-свойства, а для отдельных пользовательских фрагментов может понадобиться bdi. |
<?php
declare(strict_types=1);
var_dump(Locale::isRightToLeft("ar"));
var_dump(Locale::isRightToLeft("en"));
Ожидаемый результат
bool(true)
bool(false)
Направление изменяет расположение интерфейса; сами строки метод не переставляет.
<?php
declare(strict_types=1);
$locale = 'he';
$direction = Locale::isRightToLeft($locale) ? 'rtl' : 'ltr';
echo '<p lang="he" dir="', $direction, '">שלום — <bdi>ORD-42</bdi></p>';
Ожидаемый результат
<p lang="he" dir="rtl">שלום — <bdi>ORD-42</bdi></p>Сохраните как PHP-страницу и откройте через локальный сервер: абзац на иврите получает направление справа налево. PHP не переворачивает строку; браузер использует dir. bdi изолирует технический номер заказа со смешанным направлением. Здесь lang и текст заданы в коде, а dir принимает только два известных значения. Произвольный текст заказа для HTML отдельно экранируют. Метод доступен с PHP 8.5.
שלום — ORD-42
Тот же механизм в процедурной форме: locale_is_right_to_left. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getScript.
locale_is_right_to_leftВыбрать направление интерфейса для языка с письмом справа налево.
PHP 8.5+ · intl
locale_is_right_to_left(string $locale): boolПроцедурная форма Locale::isRightToLeft. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ID; пустая строка берёт default. Метод появился в PHP 8.5. |
| Возврат | bool. Это свойство локали, не анализ каждого символа в смешанном тексте. В HTML используйте dir/логические CSS-свойства, а для отдельных пользовательских фрагментов может понадобиться bdi. |
<?php
declare(strict_types=1);
var_dump(Locale::isRightToLeft("ar"));
var_dump(Locale::isRightToLeft("en"));
Ожидаемый результат
bool(true)
bool(false)
Направление изменяет расположение интерфейса; сами строки метод не переставляет.
<?php
declare(strict_types=1);
$locale = 'he';
$direction = Locale::isRightToLeft($locale) ? 'rtl' : 'ltr';
echo '<p lang="he" dir="', $direction, '">שלום — <bdi>ORD-42</bdi></p>';
Ожидаемый результат
<p lang="he" dir="rtl">שלום — <bdi>ORD-42</bdi></p>Сохраните как PHP-страницу и откройте через локальный сервер: абзац на иврите получает направление справа налево. PHP не переворачивает строку; браузер использует dir. bdi изолирует технический номер заказа со смешанным направлением. Здесь lang и текст заданы в коде, а dir принимает только два известных значения. Произвольный текст заказа для HTML отдельно экранируют. Метод доступен с PHP 8.5.
שלום — ORD-42
Тот же механизм в процедурной форме: locale_is_right_to_left. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getScript.
MessageFormatter::__constructПодготовить текст письма или интерфейса, в котором имена, числа и порядок слов зависят от языка.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
MessageFormatter::__construct(string $locale, string $pattern)| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Язык правил чисел, дат и множественного числа. Сам текст сообщения переводит автор шаблона. |
| pattern | Шаблон ICU MessageFormat: {name} подставляет значение, {count,number,integer} форматирует число, plural выбирает форму по числу, select — по строковому ключу. В сложных ветках нужен other. Это не PHP-интерполяция и не sprintf. |
| Результат | Конструктор создаёт объект либо бросает IntlException при неудаче. Фабрика create/msgfmt_create возвращает объект либо null; проверяйте до format. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->format(["name" => "Anna"]), "
";
Ожидаемый результат
Hello, Anna!
Ключ name в массиве совпадает с {name} в шаблоне; объект связывает шаблон с локалью.
<?php
declare(strict_types=1);
$message = msgfmt_create("en", "{count, plural, one {# item} other {# items}}");
echo msgfmt_format($message, ["count" => 2]), "
";
Ожидаемый результат
2 items
Не склеивайте перевод из нескольких обрывков: в другом языке порядок и согласование могут быть другими.
Рядом по задаче: MessageFormatter::format, MessageFormatter::formatMessage.
MessageFormatter::createПодготовить текст письма или интерфейса, в котором имена, числа и порядок слов зависят от языка.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static MessageFormatter::create(string $locale, string $pattern): ?MessageFormatter| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Язык правил чисел, дат и множественного числа. Сам текст сообщения переводит автор шаблона. |
| pattern | Шаблон ICU MessageFormat: {name} подставляет значение, {count,number,integer} форматирует число, plural выбирает форму по числу, select — по строковому ключу. В сложных ветках нужен other. Это не PHP-интерполяция и не sprintf. |
| Результат | Конструктор создаёт объект либо бросает IntlException при неудаче. Фабрика create/msgfmt_create возвращает объект либо null; проверяйте до format. |
<?php
declare(strict_types=1);
$message = MessageFormatter::create('ru', 'Здравствуйте, {name}!');
if ($message === null) {
echo "Шаблон не удалось подготовить\n";
} else {
echo $message->format(['name' => 'Анна']), "\n";
}
Ожидаемый результат
Здравствуйте, Анна!
create возвращает подготовленный объект либо null. Поэтому format вызывается только в ветке успеха. Ключ name в переданном массиве совпадает с {name} внутри шаблона. Фабрика и конструктор решают одну задачу, но при отказе ведут себя по-разному: new MessageFormatter может бросить IntlException.
<?php
declare(strict_types=1);
$message = msgfmt_create("en", "{count, plural, one {# item} other {# items}}");
echo msgfmt_format($message, ["count" => 2]), "
";
Ожидаемый результат
2 items
Не склеивайте перевод из нескольких обрывков: в другом языке порядок и согласование могут быть другими.
Тот же механизм в процедурной форме: msgfmt_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, MessageFormatter::formatMessage.
msgfmt_createПодготовить текст письма или интерфейса, в котором имена, числа и порядок слов зависят от языка.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_create(string $locale, string $pattern): ?MessageFormatterПроцедурная форма MessageFormatter::create. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | Язык правил чисел, дат и множественного числа. Сам текст сообщения переводит автор шаблона. |
| pattern | Шаблон ICU MessageFormat: {name} подставляет значение, {count,number,integer} форматирует число, plural выбирает форму по числу, select — по строковому ключу. В сложных ветках нужен other. Это не PHP-интерполяция и не sprintf. |
| Результат | Конструктор создаёт объект либо бросает IntlException при неудаче. Фабрика create/msgfmt_create возвращает объект либо null; проверяйте до format. |
<?php
declare(strict_types=1);
$message = MessageFormatter::create('ru', 'Здравствуйте, {name}!');
if ($message === null) {
echo "Шаблон не удалось подготовить\n";
} else {
echo $message->format(['name' => 'Анна']), "\n";
}
Ожидаемый результат
Здравствуйте, Анна!
create возвращает подготовленный объект либо null. Поэтому format вызывается только в ветке успеха. Ключ name в переданном массиве совпадает с {name} внутри шаблона. Фабрика и конструктор решают одну задачу, но при отказе ведут себя по-разному: new MessageFormatter может бросить IntlException.
<?php
declare(strict_types=1);
$message = msgfmt_create("en", "{count, plural, one {# item} other {# items}}");
echo msgfmt_format($message, ["count" => 2]), "
";
Ожидаемый результат
2 items
Не склеивайте перевод из нескольких обрывков: в другом языке порядок и согласование могут быть другими.
Тот же механизм в процедурной форме: msgfmt_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, MessageFormatter::formatMessage.
MessageFormatter::formatПодставить данные заказа в подготовленный шаблон, сохранив правила языка.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
MessageFormatter::format(array $values): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| values | Массив с числовыми или именованными ключами, соответствующими placeholder. Передавайте подходящие типы: число для plural/number, текст для обычной подстановки. |
| Возврат | string|false. Текст сам не выводится и не экранируется для HTML. HTML-экранирование применяйте на границе вывода, а не путайте с синтаксисом шаблона. |
| Повторные сообщения | Один объект можно использовать для разных получателей с одной локалью/шаблоном. Не создавайте и не разбирайте тот же шаблон внутри каждой итерации без причины. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->format(["name" => "Boris"]), "
";
Ожидаемый результат
Hello, Boris!
Значение из массива возвращается как часть новой строки.
<?php
declare(strict_types=1);
$message = new MessageFormatter("ru", "{n, plural, one {# товар} few {# товара} many {# товаров} other {# товара}}");
foreach ([1, 2, 5, 21] as $count) {
echo $message->format(["n" => $count]), "
";
}
Ожидаемый результат
1 товар
2 товара
5 товаров
21 товар
Категории one/few/many определяет локаль, а слова для каждой категории задаёт автор перевода.
<?php
declare(strict_types=1);
$cart = [['name' => 'Кисть', 'quantity' => 2], ['name' => 'Валик', 'quantity' => 3]];
$quantity = 0;
foreach ($cart as $line) { $quantity += $line['quantity']; }
$message = new MessageFormatter('ru',
'{n, plural, =0 {Корзина пуста} one {В корзине # товар} few {В корзине # товара} many {В корзине # товаров} other {В корзине # товара}}');
echo $message->format(['n' => $quantity]), "\n";
Ожидаемый результат
В корзине 5 товаров
Здесь считаются единицы товара: 2 кисти и 3 валика дают 5. count($cart) дал бы 2 строки, это другой вопрос. Сначала обычный PHP вычисляет количество, затем MessageFormatter выбирает форму готовой фразы. =0 — точное значение, а one/few/many — категории русского языка. Если корзина пуста, получите «Корзина пуста». Цена и списание остатков к этой функции не относятся.
Тот же механизм в процедурной форме: msgfmt_format. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::format, MessageFormatter::setPattern.
msgfmt_formatПодставить данные заказа в подготовленный шаблон, сохранив правила языка.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_format(MessageFormatter $formatter, array $values): string|falseПроцедурная форма MessageFormatter::format. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| values | Массив с числовыми или именованными ключами, соответствующими placeholder. Передавайте подходящие типы: число для plural/number, текст для обычной подстановки. |
| Возврат | string|false. Текст сам не выводится и не экранируется для HTML. HTML-экранирование применяйте на границе вывода, а не путайте с синтаксисом шаблона. |
| Повторные сообщения | Один объект можно использовать для разных получателей с одной локалью/шаблоном. Не создавайте и не разбирайте тот же шаблон внутри каждой итерации без причины. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->format(["name" => "Boris"]), "
";
Ожидаемый результат
Hello, Boris!
Значение из массива возвращается как часть новой строки.
<?php
declare(strict_types=1);
$message = new MessageFormatter("ru", "{n, plural, one {# товар} few {# товара} many {# товаров} other {# товара}}");
foreach ([1, 2, 5, 21] as $count) {
echo $message->format(["n" => $count]), "
";
}
Ожидаемый результат
1 товар
2 товара
5 товаров
21 товар
Категории one/few/many определяет локаль, а слова для каждой категории задаёт автор перевода.
<?php
declare(strict_types=1);
$cart = [['name' => 'Кисть', 'quantity' => 2], ['name' => 'Валик', 'quantity' => 3]];
$quantity = 0;
foreach ($cart as $line) { $quantity += $line['quantity']; }
$message = new MessageFormatter('ru',
'{n, plural, =0 {Корзина пуста} one {В корзине # товар} few {В корзине # товара} many {В корзине # товаров} other {В корзине # товара}}');
echo $message->format(['n' => $quantity]), "\n";
Ожидаемый результат
В корзине 5 товаров
Здесь считаются единицы товара: 2 кисти и 3 валика дают 5. count($cart) дал бы 2 строки, это другой вопрос. Сначала обычный PHP вычисляет количество, затем MessageFormatter выбирает форму готовой фразы. =0 — точное значение, а one/few/many — категории русского языка. Если корзина пуста, получите «Корзина пуста». Цена и списание остатков к этой функции не относятся.
Тот же механизм в процедурной форме: msgfmt_format. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: NumberFormatter::format, MessageFormatter::setPattern.
MessageFormatter::formatMessageОдин раз сформировать локализованную фразу без хранения форматтера.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static MessageFormatter::formatMessage(string $locale, string $pattern, array $values): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale,pattern,values | Те же язык, шаблон ICU и массив значений, что при create + format. |
| Возврат | string|false. Удобно для одиночного сообщения. При массовой рассылке создание объекта один раз обычно позволяет повторно использовать разобранный шаблон. |
<?php
declare(strict_types=1);
echo MessageFormatter::formatMessage("en", "Welcome, {0}", ["Mira"]), "
";
Ожидаемый результат
Welcome, Mira
Индекс 0 в массиве отвечает placeholder {0}.
<?php
declare(strict_types=1);
$pattern = 'Заказ {id}: {state, select, ready {можно забрать} sent {в пути} other {статус уточняется}}';
foreach (['ready', 'sent', 'returned'] as $state) {
$text = MessageFormatter::formatMessage('ru', $pattern, ['id' => 'ORD-42', 'state' => $state]);
if ($text === false) { echo "Сообщение недоступно\n"; continue; }
echo $text, "\n";
}
Ожидаемый результат
Заказ ORD-42: можно забрать
Заказ ORD-42: в пути
Заказ ORD-42: статус уточняется
Вся фраза остаётся одним переводимым шаблоном; переводчик может переставить номер заказа. select выбирает ветку по строковому ключу. returned не описан: сработал other. Для настоящего статуса возврата нужно добавить осмысленный текст, иначе пользователь получит только запасную подпись. formatMessage удобно использовать для единичного сообщения; в большом цикле создают MessageFormatter один раз.
<?php
declare(strict_types=1);
$message = new MessageFormatter('en',
'{count, plural, offset:1 =1 {Only you are joining} one {You and # other person are joining} other {You and # other people are joining}}');
foreach ([1, 2, 4] as $count) {
echo $message->format(['count' => $count]), "\n";
}
Ожидаемый результат
Only you are joining
You and 1 other person are joining
You and 3 other people are joining
В count входит и сам получатель. =1 сравнивается с исходным числом, а # и категория plural после offset:1 описывают остальных. Поэтому при общем количестве 4 в тексте получается 3 other people. Пример применим к приглашению в совместную заявку. Не вычитайте единицу ещё и в PHP: тогда участник будет вычтен дважды.
<?php
declare(strict_types=1);
$pattern = '{place, selectordinal, one {#st} two {#nd} few {#rd} other {#th}} place';
foreach ([1, 2, 3, 4, 11, 21] as $place) {
echo MessageFormatter::formatMessage('en', $pattern, ['place' => $place]), "\n";
}
Ожидаемый результат
1st place
2nd place
3rd place
4th place
11th place
21st place
selectordinal выбирает порядковое числительное, обычный plural — количественное. Разница видна на 11th и 21st; проверка только последней цифры дала бы неверный результат для 11. Шаблон написан для английского интерфейса таблицы мест, а не как универсальные окончания для всех языков.
Тот же механизм в процедурной форме: msgfmt_format_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::create, MessageFormatter::format.
msgfmt_format_messageОдин раз сформировать локализованную фразу без хранения форматтера.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_format_message(string $locale, string $pattern, array $values): string|falseПроцедурная форма MessageFormatter::formatMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale,pattern,values | Те же язык, шаблон ICU и массив значений, что при create + format. |
| Возврат | string|false. Удобно для одиночного сообщения. При массовой рассылке создание объекта один раз обычно позволяет повторно использовать разобранный шаблон. |
<?php
declare(strict_types=1);
echo MessageFormatter::formatMessage("en", "Welcome, {0}", ["Mira"]), "
";
Ожидаемый результат
Welcome, Mira
Индекс 0 в массиве отвечает placeholder {0}.
<?php
declare(strict_types=1);
$pattern = 'Заказ {id}: {state, select, ready {можно забрать} sent {в пути} other {статус уточняется}}';
foreach (['ready', 'sent', 'returned'] as $state) {
$text = MessageFormatter::formatMessage('ru', $pattern, ['id' => 'ORD-42', 'state' => $state]);
if ($text === false) { echo "Сообщение недоступно\n"; continue; }
echo $text, "\n";
}
Ожидаемый результат
Заказ ORD-42: можно забрать
Заказ ORD-42: в пути
Заказ ORD-42: статус уточняется
Вся фраза остаётся одним переводимым шаблоном; переводчик может переставить номер заказа. select выбирает ветку по строковому ключу. returned не описан: сработал other. Для настоящего статуса возврата нужно добавить осмысленный текст, иначе пользователь получит только запасную подпись. formatMessage удобно использовать для единичного сообщения; в большом цикле создают MessageFormatter один раз.
<?php
declare(strict_types=1);
$message = new MessageFormatter('en',
'{count, plural, offset:1 =1 {Only you are joining} one {You and # other person are joining} other {You and # other people are joining}}');
foreach ([1, 2, 4] as $count) {
echo $message->format(['count' => $count]), "\n";
}
Ожидаемый результат
Only you are joining
You and 1 other person are joining
You and 3 other people are joining
В count входит и сам получатель. =1 сравнивается с исходным числом, а # и категория plural после offset:1 описывают остальных. Поэтому при общем количестве 4 в тексте получается 3 other people. Пример применим к приглашению в совместную заявку. Не вычитайте единицу ещё и в PHP: тогда участник будет вычтен дважды.
<?php
declare(strict_types=1);
$pattern = '{place, selectordinal, one {#st} two {#nd} few {#rd} other {#th}} place';
foreach ([1, 2, 3, 4, 11, 21] as $place) {
echo MessageFormatter::formatMessage('en', $pattern, ['place' => $place]), "\n";
}
Ожидаемый результат
1st place
2nd place
3rd place
4th place
11th place
21st place
selectordinal выбирает порядковое числительное, обычный plural — количественное. Разница видна на 11th и 21st; проверка только последней цифры дала бы неверный результат для 11. Шаблон написан для английского интерфейса таблицы мест, а не как универсальные окончания для всех языков.
Тот же механизм в процедурной форме: msgfmt_format_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::create, MessageFormatter::format.
MessageFormatter::parseИзвлечь данные из известного формата сообщения, например из совместимого старого отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
MessageFormatter::parse(string $string): array|false| Аргумент или результат | Что означает на практике |
|---|---|
| Вход | У экземпляра string; у статического метода locale, pattern, message. Разбор использует шаблон, но не является универсально обратным ко всем форматированиям. |
| Возврат | array|false. Успех не доказывает правильность бизнес-значения или полного входа. Сложные plural/select не подходят для общего обратного парсинга; для обмена данными лучше JSON/структурированный формат. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "ID: {0,number,integer}");
var_export($message->parse("ID: 42"));
Ожидаемый результат
array (
0 => 42,
)Числовое поле стало элементом массива, а не строкой вместе с префиксом.
<?php
declare(strict_types=1);
$formatter = new MessageFormatter('en', 'ID: {0,number,integer}');
foreach (['ID: 42', 'broken', 'ID: 42 tail', 'ID: -3'] as $line) {
$values = $formatter->parse($line);
if ($values === false || $formatter->format($values) !== $line || $values[0] < 1) {
echo "Строку отчёта нужно исправить\n";
continue;
}
echo 'Можно искать заказ ', $values[0], "\n";
}
Ожидаемый результат
Можно искать заказ 42
Строку отчёта нужно исправить
Строку отчёта нужно исправить
Строку отчёта нужно исправить
Результат parse — массив, а не готовое решение о пригодности заказа. Для этого строго заданного старого формата обратное форматирование должно совпасть со всей строкой; так хвост tail не теряется молча. Дополнительно нужен положительный ID. Это намеренно строгая политика, которая отклонит и альтернативное написание вроде лишних пробелов. Она не является универсальным валидатором произвольных сообщений, особенно plural/select; новый обмен данными лучше проектировать структурированным.
Тот же механизм в процедурной форме: msgfmt_parse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, NumberFormatter::parse.
msgfmt_parseИзвлечь данные из известного формата сообщения, например из совместимого старого отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_parse(MessageFormatter $formatter, string $string): array|falseПроцедурная форма MessageFormatter::parse. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Вход | У экземпляра string; у статического метода locale, pattern, message. Разбор использует шаблон, но не является универсально обратным ко всем форматированиям. |
| Возврат | array|false. Успех не доказывает правильность бизнес-значения или полного входа. Сложные plural/select не подходят для общего обратного парсинга; для обмена данными лучше JSON/структурированный формат. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "ID: {0,number,integer}");
var_export($message->parse("ID: 42"));
Ожидаемый результат
array (
0 => 42,
)Числовое поле стало элементом массива, а не строкой вместе с префиксом.
<?php
declare(strict_types=1);
$formatter = new MessageFormatter('en', 'ID: {0,number,integer}');
foreach (['ID: 42', 'broken', 'ID: 42 tail', 'ID: -3'] as $line) {
$values = $formatter->parse($line);
if ($values === false || $formatter->format($values) !== $line || $values[0] < 1) {
echo "Строку отчёта нужно исправить\n";
continue;
}
echo 'Можно искать заказ ', $values[0], "\n";
}
Ожидаемый результат
Можно искать заказ 42
Строку отчёта нужно исправить
Строку отчёта нужно исправить
Строку отчёта нужно исправить
Результат parse — массив, а не готовое решение о пригодности заказа. Для этого строго заданного старого формата обратное форматирование должно совпасть со всей строкой; так хвост tail не теряется молча. Дополнительно нужен положительный ID. Это намеренно строгая политика, которая отклонит и альтернативное написание вроде лишних пробелов. Она не является универсальным валидатором произвольных сообщений, особенно plural/select; новый обмен данными лучше проектировать структурированным.
Тот же механизм в процедурной форме: msgfmt_parse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, NumberFormatter::parse.
MessageFormatter::parseMessageИзвлечь данные из известного формата сообщения, например из совместимого старого отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static MessageFormatter::parseMessage(string $locale, string $pattern, string $message): array|false| Аргумент или результат | Что означает на практике |
|---|---|
| Вход | У экземпляра string; у статического метода locale, pattern, message. Разбор использует шаблон, но не является универсально обратным ко всем форматированиям. |
| Возврат | array|false. Успех не доказывает правильность бизнес-значения или полного входа. Сложные plural/select не подходят для общего обратного парсинга; для обмена данными лучше JSON/структурированный формат. |
<?php
declare(strict_types=1);
var_export(MessageFormatter::parseMessage("en", "ID: {0,number,integer}", "ID: 42"));
Ожидаемый результат
array (
0 => 42,
)Числовое поле стало элементом массива, а не строкой вместе с префиксом.
<?php
declare(strict_types=1);
$formatter = new MessageFormatter('en', 'ID: {0,number,integer}');
foreach (['ID: 42', 'broken', 'ID: 42 tail', 'ID: -3'] as $line) {
$values = MessageFormatter::parseMessage('en', 'ID: {0,number,integer}', $line);
if ($values === false || $formatter->format($values) !== $line || $values[0] < 1) {
echo "Строку отчёта нужно исправить\n";
continue;
}
echo 'Можно искать заказ ', $values[0], "\n";
}
Ожидаемый результат
Можно искать заказ 42
Строку отчёта нужно исправить
Строку отчёта нужно исправить
Строку отчёта нужно исправить
Результат parse — массив, а не готовое решение о пригодности заказа. Для этого строго заданного старого формата обратное форматирование должно совпасть со всей строкой; так хвост tail не теряется молча. Дополнительно нужен положительный ID. Это намеренно строгая политика, которая отклонит и альтернативное написание вроде лишних пробелов. Она не является универсальным валидатором произвольных сообщений, особенно plural/select; новый обмен данными лучше проектировать структурированным.
Тот же механизм в процедурной форме: msgfmt_parse_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, NumberFormatter::parse.
msgfmt_parse_messageИзвлечь данные из известного формата сообщения, например из совместимого старого отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_parse_message(string $locale, string $pattern, string $message): array|falseПроцедурная форма MessageFormatter::parseMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Вход | У экземпляра string; у статического метода locale, pattern, message. Разбор использует шаблон, но не является универсально обратным ко всем форматированиям. |
| Возврат | array|false. Успех не доказывает правильность бизнес-значения или полного входа. Сложные plural/select не подходят для общего обратного парсинга; для обмена данными лучше JSON/структурированный формат. |
<?php
declare(strict_types=1);
var_export(MessageFormatter::parseMessage("en", "ID: {0,number,integer}", "ID: 42"));
Ожидаемый результат
array (
0 => 42,
)Числовое поле стало элементом массива, а не строкой вместе с префиксом.
<?php
declare(strict_types=1);
$formatter = new MessageFormatter('en', 'ID: {0,number,integer}');
foreach (['ID: 42', 'broken', 'ID: 42 tail', 'ID: -3'] as $line) {
$values = MessageFormatter::parseMessage('en', 'ID: {0,number,integer}', $line);
if ($values === false || $formatter->format($values) !== $line || $values[0] < 1) {
echo "Строку отчёта нужно исправить\n";
continue;
}
echo 'Можно искать заказ ', $values[0], "\n";
}
Ожидаемый результат
Можно искать заказ 42
Строку отчёта нужно исправить
Строку отчёта нужно исправить
Строку отчёта нужно исправить
Результат parse — массив, а не готовое решение о пригодности заказа. Для этого строго заданного старого формата обратное форматирование должно совпасть со всей строкой; так хвост tail не теряется молча. Дополнительно нужен положительный ID. Это намеренно строгая политика, которая отклонит и альтернативное написание вроде лишних пробелов. Она не является универсальным валидатором произвольных сообщений, особенно plural/select; новый обмен данными лучше проектировать структурированным.
Тот же механизм в процедурной форме: msgfmt_parse_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format, NumberFormatter::parse.
MessageFormatter::setPatternЗаменить или прочитать шаблон выбранного перевода, не меняя локаль объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
MessageFormatter::setPattern(string $pattern): bool| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | Шаблон ICU MessageFormat: {name} подставляет значение, {count,number,integer} форматирует число, plural выбирает форму по числу, select — по строковому ключу. В сложных ветках нужен other. Это не PHP-интерполяция и не sprintf. |
| Возврат | setPattern возвращает bool; getPattern — string|false. Новый шаблон может требовать совсем другие ключи массива. Не принимайте пользовательский шаблон без ограничения сложности и доверенной модели редактирования. |
<?php
declare(strict_types=1);
$message = new MessageFormatter('ru', 'Заказ {id} принят');
echo $message->format(['id' => 'ORD-42']), "\n";
if (!$message->setPattern('Заказ {id} готов к выдаче')) {
echo "Новый шаблон не принят\n";
} else {
echo $message->format(['id' => 'ORD-42']), "\n";
}
Ожидаемый результат
Заказ ORD-42 принят
Заказ ORD-42 готов к выдаче
Объект остался тем же, но его состояние изменилось: следующий format использует новый шаблон. Проверка результата setPattern не позволяет считать замену успешной при неверном синтаксисе. Если одновременно нужны несколько шаблонов, отдельные объекты часто понятнее постоянной перестройки одного.
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
$message->setPattern("Goodbye, {name}.");
echo $message->format(["name" => "Anna"]), "
";
Ожидаемый результат
Goodbye, Anna.
Названия полей сохранились; после изменения набора placeholder нужно согласовать передаваемый массив.
Тот же механизм в процедурной форме: msgfmt_set_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format.
msgfmt_set_patternЗаменить или прочитать шаблон выбранного перевода, не меняя локаль объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_set_pattern(MessageFormatter $formatter, string $pattern): boolПроцедурная форма MessageFormatter::setPattern. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | Шаблон ICU MessageFormat: {name} подставляет значение, {count,number,integer} форматирует число, plural выбирает форму по числу, select — по строковому ключу. В сложных ветках нужен other. Это не PHP-интерполяция и не sprintf. |
| Возврат | setPattern возвращает bool; getPattern — string|false. Новый шаблон может требовать совсем другие ключи массива. Не принимайте пользовательский шаблон без ограничения сложности и доверенной модели редактирования. |
<?php
declare(strict_types=1);
$message = new MessageFormatter('ru', 'Заказ {id} принят');
echo $message->format(['id' => 'ORD-42']), "\n";
if (!$message->setPattern('Заказ {id} готов к выдаче')) {
echo "Новый шаблон не принят\n";
} else {
echo $message->format(['id' => 'ORD-42']), "\n";
}
Ожидаемый результат
Заказ ORD-42 принят
Заказ ORD-42 готов к выдаче
Объект остался тем же, но его состояние изменилось: следующий format использует новый шаблон. Проверка результата setPattern не позволяет считать замену успешной при неверном синтаксисе. Если одновременно нужны несколько шаблонов, отдельные объекты часто понятнее постоянной перестройки одного.
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
$message->setPattern("Goodbye, {name}.");
echo $message->format(["name" => "Anna"]), "
";
Ожидаемый результат
Goodbye, Anna.
Названия полей сохранились; после изменения набора placeholder нужно согласовать передаваемый массив.
Тот же механизм в процедурной форме: msgfmt_set_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format.
MessageFormatter::getPatternЗаменить или прочитать шаблон выбранного перевода, не меняя локаль объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
MessageFormatter::getPattern(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | Шаблон ICU MessageFormat: {name} подставляет значение, {count,number,integer} форматирует число, plural выбирает форму по числу, select — по строковому ключу. В сложных ветках нужен other. Это не PHP-интерполяция и не sprintf. |
| Возврат | setPattern возвращает bool; getPattern — string|false. Новый шаблон может требовать совсем другие ключи массива. Не принимайте пользовательский шаблон без ограничения сложности и доверенной модели редактирования. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->getPattern(), "
";
Ожидаемый результат
Hello, {name}!
Возвращается описание сообщения, а не уже отформатированная строка.
<?php
declare(strict_types=1);
$templates = ['order_ready' => 'Заказ {id} принят'];
$message = new MessageFormatter('ru', $templates['order_ready']);
echo 'Ключ уведомления: order_ready', "\n";
echo 'Шаблон: ', $message->getPattern(), "\n";
echo 'Пример: ', $message->format(['id' => 'ORD-42']), "\n";
Ожидаемый результат
Ключ уведомления: order_ready
Шаблон: Заказ {id} принят
Пример: Заказ ORD-42 принят
Для события «готов к выдаче» случайно выбрали текст «принят». getPattern показывает именно активный шаблон, format — его результат. Разработчик видит, что проблема в настройке уведомления, а не в переданном ID. В журнал достаточно ключа шаблона и учебных данных; не нужно сохранять все личные данные получателя.
<?php
declare(strict_types=1);
$pattern = "Field '{name}' belongs to {owner}.";
echo MessageFormatter::formatMessage('en', $pattern, ['owner' => 'Anna']), "\n";
Ожидаемый результат
Field {name} belongs to Anna.
Апострофы вокруг {name} защищают синтаксические скобки ICU: в результате видно само имя поля. {owner} остаётся настоящим местом подстановки и получает Anna. PHP-кавычки вокруг всего шаблона и кавычки внутри ICU — два разных уровня синтаксиса. Это пригодится при подготовке локализованной инструкции к форме.
Тот же механизм в процедурной форме: msgfmt_get_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format.
msgfmt_get_patternЗаменить или прочитать шаблон выбранного перевода, не меняя локаль объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_get_pattern(MessageFormatter $formatter): string|falseПроцедурная форма MessageFormatter::getPattern. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | Шаблон ICU MessageFormat: {name} подставляет значение, {count,number,integer} форматирует число, plural выбирает форму по числу, select — по строковому ключу. В сложных ветках нужен other. Это не PHP-интерполяция и не sprintf. |
| Возврат | setPattern возвращает bool; getPattern — string|false. Новый шаблон может требовать совсем другие ключи массива. Не принимайте пользовательский шаблон без ограничения сложности и доверенной модели редактирования. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->getPattern(), "
";
Ожидаемый результат
Hello, {name}!
Возвращается описание сообщения, а не уже отформатированная строка.
<?php
declare(strict_types=1);
$templates = ['order_ready' => 'Заказ {id} принят'];
$message = new MessageFormatter('ru', $templates['order_ready']);
echo 'Ключ уведомления: order_ready', "\n";
echo 'Шаблон: ', $message->getPattern(), "\n";
echo 'Пример: ', $message->format(['id' => 'ORD-42']), "\n";
Ожидаемый результат
Ключ уведомления: order_ready
Шаблон: Заказ {id} принят
Пример: Заказ ORD-42 принят
Для события «готов к выдаче» случайно выбрали текст «принят». getPattern показывает именно активный шаблон, format — его результат. Разработчик видит, что проблема в настройке уведомления, а не в переданном ID. В журнал достаточно ключа шаблона и учебных данных; не нужно сохранять все личные данные получателя.
<?php
declare(strict_types=1);
$pattern = "Field '{name}' belongs to {owner}.";
echo MessageFormatter::formatMessage('en', $pattern, ['owner' => 'Anna']), "\n";
Ожидаемый результат
Field {name} belongs to Anna.
Апострофы вокруг {name} защищают синтаксические скобки ICU: в результате видно само имя поля. {owner} остаётся настоящим местом подстановки и получает Anna. PHP-кавычки вокруг всего шаблона и кавычки внутри ICU — два разных уровня синтаксиса. Это пригодится при подготовке локализованной инструкции к форме.
Тот же механизм в процедурной форме: msgfmt_get_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: MessageFormatter::format.
MessageFormatter::getLocaleПонять, какие языковые правила привязаны к шаблону письма.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
MessageFormatter::getLocale(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string: локаль создания форматтера. Нет аргументов у метода; процедурный msgfmt_get_locale принимает formatter. |
| Применение | Диагностика ситуации, когда русские слова ошибочно форматируются по английским правилам plural. Язык шаблона и локаль нужно хранить согласованно. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->getLocale(), "
";
Ожидаемый результат
en
Само наличие английских слов не определяет locale автоматически.
<?php
declare(strict_types=1);
$pattern = '{n, plural, one {# товар} few {# товара} many {# товаров} other {# товара}}';
foreach (['en', 'ru'] as $locale) {
$message = new MessageFormatter($locale, $pattern);
echo $message->getLocale(), ': ', $message->format(['n' => 21]), "\n";
}
Ожидаемый результат
en: 21 товара
ru: 21 товар
Русские слова в шаблоне не заставляют ICU выбрать русский язык. В английских правилах 21 попадает в other, в русских — в one. getLocale позволяет проверить настройку объекта. Исправление — согласовать язык шаблона и locale при создании, а не вручную дописывать условие для числа 21.
Тот же механизм в процедурной форме: msgfmt_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDefault, MessageFormatter::format.
msgfmt_get_localeПонять, какие языковые правила привязаны к шаблону письма.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_get_locale(MessageFormatter $formatter): stringПроцедурная форма MessageFormatter::getLocale. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string: локаль создания форматтера. Нет аргументов у метода; процедурный msgfmt_get_locale принимает formatter. |
| Применение | Диагностика ситуации, когда русские слова ошибочно форматируются по английским правилам plural. Язык шаблона и локаль нужно хранить согласованно. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->getLocale(), "
";
Ожидаемый результат
en
Само наличие английских слов не определяет locale автоматически.
<?php
declare(strict_types=1);
$pattern = '{n, plural, one {# товар} few {# товара} many {# товаров} other {# товара}}';
foreach (['en', 'ru'] as $locale) {
$message = new MessageFormatter($locale, $pattern);
echo $message->getLocale(), ': ', $message->format(['n' => 21]), "\n";
}
Ожидаемый результат
en: 21 товара
ru: 21 товар
Русские слова в шаблоне не заставляют ICU выбрать русский язык. В английских правилах 21 попадает в other, в русских — в one. getLocale позволяет проверить настройку объекта. Исправление — согласовать язык шаблона и locale при создании, а не вручную дописывать условие для числа 21.
Тот же механизм в процедурной форме: msgfmt_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDefault, MessageFormatter::format.
MessageFormatter::getErrorCodeУзнать причину последней неудачи у конкретного шаблона.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
MessageFormatter::getErrorCode(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Код int либо сообщение string. Начальное состояние — U_ZERO_ERROR. Проверка intl_is_failure учитывает разницу предупреждений и ошибок. |
| Порядок | Читайте сразу после неудачной операции, пока следующая не изменила состояние. Для фабрики, не создавшей объект, используйте глобальную диагностику intl. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
var_dump(intl_is_failure($message->getErrorCode()));
Ожидаемый результат
bool(false)
Успешное создание не оставляет ошибку для обработки.
<?php
declare(strict_types=1);
$message = new MessageFormatter('en', 'ID: {0,number,integer}');
$result = $message->parse('broken');
if ($result === false) {
$code = $message->getErrorCode();
echo "Отчёт не принят: исправьте строку с номером заказа\n";
echo 'Диагностика для разработчика: ', intl_error_name($code), "\n";
}
Ожидаемый результат
Отчёт не принят: исправьте строку с номером заказа
Диагностика для разработчика: U_MESSAGE_PARSE_ERROR
Сначала проверяется результат действия, затем читается причина у того же объекта. getErrorCode нужен журналу и классификации сбоя, а человеку показывается подсказка о его данных. Читайте код до следующей операции форматтера: она может изменить последнюю ошибку. Название ICU получено через intl_error_name.
Тот же механизм в процедурной форме: msgfmt_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_is_failure.
msgfmt_get_error_codeУзнать причину последней неудачи у конкретного шаблона.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_get_error_code(MessageFormatter $formatter): intПроцедурная форма MessageFormatter::getErrorCode. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Код int либо сообщение string. Начальное состояние — U_ZERO_ERROR. Проверка intl_is_failure учитывает разницу предупреждений и ошибок. |
| Порядок | Читайте сразу после неудачной операции, пока следующая не изменила состояние. Для фабрики, не создавшей объект, используйте глобальную диагностику intl. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
var_dump(intl_is_failure($message->getErrorCode()));
Ожидаемый результат
bool(false)
Успешное создание не оставляет ошибку для обработки.
<?php
declare(strict_types=1);
$message = new MessageFormatter('en', 'ID: {0,number,integer}');
$result = $message->parse('broken');
if ($result === false) {
$code = $message->getErrorCode();
echo "Отчёт не принят: исправьте строку с номером заказа\n";
echo 'Диагностика для разработчика: ', intl_error_name($code), "\n";
}
Ожидаемый результат
Отчёт не принят: исправьте строку с номером заказа
Диагностика для разработчика: U_MESSAGE_PARSE_ERROR
Сначала проверяется результат действия, затем читается причина у того же объекта. getErrorCode нужен журналу и классификации сбоя, а человеку показывается подсказка о его данных. Читайте код до следующей операции форматтера: она может изменить последнюю ошибку. Название ICU получено через intl_error_name.
Тот же механизм в процедурной форме: msgfmt_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_is_failure.
MessageFormatter::getErrorMessageУзнать причину последней неудачи у конкретного шаблона.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
MessageFormatter::getErrorMessage(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Код int либо сообщение string. Начальное состояние — U_ZERO_ERROR. Проверка intl_is_failure учитывает разницу предупреждений и ошибок. |
| Порядок | Читайте сразу после неудачной операции, пока следующая не изменила состояние. Для фабрики, не создавшей объект, используйте глобальную диагностику intl. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Успешное создание не оставляет ошибку для обработки.
<?php
declare(strict_types=1);
$message = new MessageFormatter('en', 'ID: {0,number,integer}');
$values = $message->parse('broken');
if ($values === false) {
$diagnostic = $message->getErrorMessage();
$message->format([42]);
echo 'Сохранённая причина: ', str_contains($diagnostic, 'U_MESSAGE_PARSE_ERROR') ? 'неверная строка отчёта' : $diagnostic, "\n";
echo 'Текущее состояние: ', $message->getErrorMessage(), "\n";
}
Ожидаемый результат
Сохранённая причина: неверная строка отчёта
Текущее состояние: U_ZERO_ERROR
Ошибка была, но следующий успешный format изменил состояние. Переменная diagnostic сохранила прежнее сообщение, поэтому причина не потеряна. В приложении её передают внутреннему журналу; текст ICU не стоит превращать в устойчивый протокол для клиента, он может различаться между версиями. Для логической классификации предпочтительнее код.
Тот же механизм в процедурной форме: msgfmt_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_is_failure.
msgfmt_get_error_messageУзнать причину последней неудачи у конкретного шаблона.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
msgfmt_get_error_message(MessageFormatter $formatter): stringПроцедурная форма MessageFormatter::getErrorMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Код int либо сообщение string. Начальное состояние — U_ZERO_ERROR. Проверка intl_is_failure учитывает разницу предупреждений и ошибок. |
| Порядок | Читайте сразу после неудачной операции, пока следующая не изменила состояние. Для фабрики, не создавшей объект, используйте глобальную диагностику intl. |
<?php
declare(strict_types=1);
$message = new MessageFormatter("en", "Hello, {name}!");
echo $message->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Успешное создание не оставляет ошибку для обработки.
<?php
declare(strict_types=1);
$message = new MessageFormatter('en', 'ID: {0,number,integer}');
$values = $message->parse('broken');
if ($values === false) {
$diagnostic = $message->getErrorMessage();
$message->format([42]);
echo 'Сохранённая причина: ', str_contains($diagnostic, 'U_MESSAGE_PARSE_ERROR') ? 'неверная строка отчёта' : $diagnostic, "\n";
echo 'Текущее состояние: ', $message->getErrorMessage(), "\n";
}
Ожидаемый результат
Сохранённая причина: неверная строка отчёта
Текущее состояние: U_ZERO_ERROR
Ошибка была, но следующий успешный format изменил состояние. Переменная diagnostic сохранила прежнее сообщение, поэтому причина не потеряна. В приложении её передают внутреннему журналу; текст ICU не стоит превращать в устойчивый протокол для клиента, он может различаться между версиями. Для логической классификации предпочтительнее код.
Тот же механизм в процедурной форме: msgfmt_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_is_failure.
Transliterator::__constructПонять, почему этот объект получают через фабрику, а не через new.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Transliterator::__construct()| Аргумент или результат | Что означает на практике |
|---|---|
| Доступ | Конструктор final private: прямое создание запрещено. Он не выполняет пользовательское преобразование. |
| Вместо new | Выберите create с зарегистрированным ID или createFromRules с собственными правилами; обе фабрики могут вернуть null. |
<?php
declare(strict_types=1);
$transform = Transliterator::create("Any-Lower");
echo $transform->transliterate("HELLO"), "
";
Ожидаемый результат
hello
Фабрика проверяет наличие преобразования и возвращает готовый объект.
<?php
declare(strict_types=1);
try {
new Transliterator();
} catch (Error $error) {
echo "use a factory
";
}
Ожидаемый результат
use a factory
Это ограничение API, а не проблема autoload. Нельзя исправить его передачей других аргументов.
Рядом по задаче: Transliterator::create, Transliterator::createFromRules.
Transliterator::createПодготовить повторяемое преобразование текста: привести регистр, алфавит или ширину символов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Transliterator::create(string $id, int $direction = Transliterator::FORWARD): ?Transliterator| Аргумент или результат | Что означает на практике |
|---|---|
| id | Зарегистрированный ID ICU, например Any-Lower, Latin-ASCII или цепочка через ;. Доступные ID перечисляет listIDs. |
| direction | FORWARD по умолчанию; REVERSE запрашивает обратное направление, если оно поддерживается. |
| Возврат | Transliterator|null. Не все преобразования обратимы: потерянные акценты и регистр восстановить невозможно. Преобразованный поисковый ключ храните рядом с оригиналом, а не вместо него. |
<?php
declare(strict_types=1);
$transform = Transliterator::create('Any-Latin; Latin-ASCII; Lower()');
if ($transform === null) { throw new RuntimeException('Преобразование недоступно'); }
$original = 'Чайник Café';
$searchKey = $transform->transliterate($original);
echo 'Показываем: ', $original, "\n";
echo 'Ищем также по: ', $searchKey, "\n";
Ожидаемый результат
Показываем: Чайник Café
Ищем также по: cajnik cafe
create подготавливает цепочку правил: Any-Latin переводит разные письменности в латиницу, Latin-ASCII упрощает акценты, Lower приводит регистр. Исходное название сохраняется для человека, а cajnik cafe используется как дополнительный приблизительный ключ. Это не перевод слова на другой язык и не гарантия ожидаемой паспортной транслитерации. Несколько названий могут получить одинаковый ключ, поэтому он не служит уникальным ID.
<?php
declare(strict_types=1);
$transform = transliterator_create('Any-Latin; Latin-ASCII; Lower()');
if ($transform === null) { throw new RuntimeException('Преобразование недоступно'); }
$queryKey = $transform->transliterate('cafe');
foreach (['Чайник', 'Café в зёрнах', 'Какао'] as $title) {
$titleKey = $transform->transliterate($title);
if (str_contains($titleKey, $queryKey)) {
echo 'Найдено: ', $title, "\n";
}
}
Ожидаемый результат
Найдено: Café в зёрнах
Одинаковая цепочка применена и к запросу, и к названиям. Пользователь написал cafe без акцента, но увидел исходное Café в зёрнах. На большом каталоге ключи вычисляют при сохранении и индексируют, а не преобразуют все записи в каждом HTTP-запросе. Для морфологии, опечаток и ранжирования нужны отдельные поисковые механизмы.
<?php
declare(strict_types=1);
$transform = Transliterator::create('Any-Latin; Latin-ASCII; Lower()');
if ($transform === null) { throw new RuntimeException('Преобразование недоступно'); }
$used = [];
foreach ([41 => 'Чайник Café', 42 => 'Cajnik cafe'] as $id => $title) {
$base = $transform->transliterate($title);
$base = preg_replace('/[^a-z0-9]+/', '-', $base);
$base = trim((string) $base, '-');
$slug = isset($used[$base]) ? $base . '-' . $id : $base;
$used[$base] = true;
echo $id, ': /catalog/', $slug, "\n";
}
Ожидаемый результат
41: /catalog/cajnik-cafe
42: /catalog/cajnik-cafe-42
Оба разных названия свелись к одному cajnik-cafe. Программа обнаружила занятый базовый адрес и добавила устойчивый ID второй записи. Транслитерация решает лишь представление текста; уникальность обеспечивает база данных или явная проверка. preg_replace здесь вводится как следующий отдельный шаг: он заменяет группы посторонних знаков дефисом, а trim убирает дефисы по краям. Готовая библиотека slug обычно учитывает больше языков, зарезервированные адреса, максимальную длину и конкурентные записи.
Тот же механизм в процедурной форме: transliterator_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Transliterator::listIDs, Transliterator::transliterate, Normalizer::normalize.
transliterator_createПодготовить повторяемое преобразование текста: привести регистр, алфавит или ширину символов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
transliterator_create(string $id, int $direction = Transliterator::FORWARD): ?TransliteratorПроцедурная форма Transliterator::create. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| id | Зарегистрированный ID ICU, например Any-Lower, Latin-ASCII или цепочка через ;. Доступные ID перечисляет listIDs. |
| direction | FORWARD по умолчанию; REVERSE запрашивает обратное направление, если оно поддерживается. |
| Возврат | Transliterator|null. Не все преобразования обратимы: потерянные акценты и регистр восстановить невозможно. Преобразованный поисковый ключ храните рядом с оригиналом, а не вместо него. |
<?php
declare(strict_types=1);
$transform = Transliterator::create('Any-Latin; Latin-ASCII; Lower()');
if ($transform === null) { throw new RuntimeException('Преобразование недоступно'); }
$original = 'Чайник Café';
$searchKey = $transform->transliterate($original);
echo 'Показываем: ', $original, "\n";
echo 'Ищем также по: ', $searchKey, "\n";
Ожидаемый результат
Показываем: Чайник Café
Ищем также по: cajnik cafe
create подготавливает цепочку правил: Any-Latin переводит разные письменности в латиницу, Latin-ASCII упрощает акценты, Lower приводит регистр. Исходное название сохраняется для человека, а cajnik cafe используется как дополнительный приблизительный ключ. Это не перевод слова на другой язык и не гарантия ожидаемой паспортной транслитерации. Несколько названий могут получить одинаковый ключ, поэтому он не служит уникальным ID.
<?php
declare(strict_types=1);
$transform = transliterator_create('Any-Latin; Latin-ASCII; Lower()');
if ($transform === null) { throw new RuntimeException('Преобразование недоступно'); }
$queryKey = $transform->transliterate('cafe');
foreach (['Чайник', 'Café в зёрнах', 'Какао'] as $title) {
$titleKey = $transform->transliterate($title);
if (str_contains($titleKey, $queryKey)) {
echo 'Найдено: ', $title, "\n";
}
}
Ожидаемый результат
Найдено: Café в зёрнах
Одинаковая цепочка применена и к запросу, и к названиям. Пользователь написал cafe без акцента, но увидел исходное Café в зёрнах. На большом каталоге ключи вычисляют при сохранении и индексируют, а не преобразуют все записи в каждом HTTP-запросе. Для морфологии, опечаток и ранжирования нужны отдельные поисковые механизмы.
<?php
declare(strict_types=1);
$transform = Transliterator::create('Any-Latin; Latin-ASCII; Lower()');
if ($transform === null) { throw new RuntimeException('Преобразование недоступно'); }
$used = [];
foreach ([41 => 'Чайник Café', 42 => 'Cajnik cafe'] as $id => $title) {
$base = $transform->transliterate($title);
$base = preg_replace('/[^a-z0-9]+/', '-', $base);
$base = trim((string) $base, '-');
$slug = isset($used[$base]) ? $base . '-' . $id : $base;
$used[$base] = true;
echo $id, ': /catalog/', $slug, "\n";
}
Ожидаемый результат
41: /catalog/cajnik-cafe
42: /catalog/cajnik-cafe-42
Оба разных названия свелись к одному cajnik-cafe. Программа обнаружила занятый базовый адрес и добавила устойчивый ID второй записи. Транслитерация решает лишь представление текста; уникальность обеспечивает база данных или явная проверка. preg_replace здесь вводится как следующий отдельный шаг: он заменяет группы посторонних знаков дефисом, а trim убирает дефисы по краям. Готовая библиотека slug обычно учитывает больше языков, зарезервированные адреса, максимальную длину и конкурентные записи.
Тот же механизм в процедурной форме: transliterator_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Transliterator::listIDs, Transliterator::transliterate, Normalizer::normalize.
Transliterator::createFromRulesОписать свою замену для известного формата данных, когда стандартного ID недостаточно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Transliterator::createFromRules(string $rules, int $direction = Transliterator::FORWARD): ?Transliterator| Аргумент или результат | Что означает на практике |
|---|---|
| rules | Синтаксис Transform Rules из UTS #35: правила завершаются ;, > задаёт прямую замену, <> двустороннюю. Это не PHP regex и не обычный массив str_replace. |
| direction | FORWARD или REVERSE. Смысл зависит от того, какие направления правила допускают. |
| Возврат | Объект либо null. Ошибка компиляции доступна через глобальную диагностику intl. Для двух буквенных замен часто проще strtr; сложные правила требуют отдельного контракта. |
<?php
declare(strict_types=1);
$rules = "— > '-'; [:White_Space:] > ;";
$transform = Transliterator::createFromRules($rules);
if ($transform === null) { throw new RuntimeException('Ошибка правил артикула'); }
echo $transform->transliterate('AB — 0041'), "\n";
Ожидаемый результат
AB-0041
Договор поставщика разрешает длинное тире и пробелы, а внутренний каталог ожидает AB-0041. Первое правило меняет именно длинное тире на дефис, второе удаляет Unicode-пробелы. Это небольшой известный формат, поэтому собственное правило уместно. Оно не проверяет, что после AB идут четыре цифры: структуру артикула затем проверяет отдельное условие или регулярное выражение.
<?php
declare(strict_types=1);
$display = Transliterator::createFromRules('x <> ×;', Transliterator::FORWARD);
$storage = Transliterator::createFromRules('x <> ×;', Transliterator::REVERSE);
if ($display === null || $storage === null) { throw new RuntimeException('Правило недоступно'); }
echo 'Для человека: ', $display->transliterate('20x30'), "\n";
echo 'Для поиска: ', $storage->transliterate('20×30'), "\n";
Ожидаемый результат
Для человека: 20×30
Для поиска: 20x30
Двустороннее правило <> позволяет выбрать направление при создании объекта. В карточке товара можно показать знак умножения ×, а в простом поисковом ключе хранить x. Это контролируемая замена одного знака. Цепочки Any-Latin или удаления акцентов обычно необратимы, поэтому createInverse не следует понимать как восстановление любого оригинала.
Тот же механизм в процедурной форме: transliterator_create_from_rules. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Transliterator::createInverse, Transliterator::create.
transliterator_create_from_rulesОписать свою замену для известного формата данных, когда стандартного ID недостаточно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
transliterator_create_from_rules(string $rules, int $direction = Transliterator::FORWARD): ?TransliteratorПроцедурная форма Transliterator::createFromRules. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| rules | Синтаксис Transform Rules из UTS #35: правила завершаются ;, > задаёт прямую замену, <> двустороннюю. Это не PHP regex и не обычный массив str_replace. |
| direction | FORWARD или REVERSE. Смысл зависит от того, какие направления правила допускают. |
| Возврат | Объект либо null. Ошибка компиляции доступна через глобальную диагностику intl. Для двух буквенных замен часто проще strtr; сложные правила требуют отдельного контракта. |
<?php
declare(strict_types=1);
$rules = "— > '-'; [:White_Space:] > ;";
$transform = Transliterator::createFromRules($rules);
if ($transform === null) { throw new RuntimeException('Ошибка правил артикула'); }
echo $transform->transliterate('AB — 0041'), "\n";
Ожидаемый результат
AB-0041
Договор поставщика разрешает длинное тире и пробелы, а внутренний каталог ожидает AB-0041. Первое правило меняет именно длинное тире на дефис, второе удаляет Unicode-пробелы. Это небольшой известный формат, поэтому собственное правило уместно. Оно не проверяет, что после AB идут четыре цифры: структуру артикула затем проверяет отдельное условие или регулярное выражение.
<?php
declare(strict_types=1);
$display = Transliterator::createFromRules('x <> ×;', Transliterator::FORWARD);
$storage = Transliterator::createFromRules('x <> ×;', Transliterator::REVERSE);
if ($display === null || $storage === null) { throw new RuntimeException('Правило недоступно'); }
echo 'Для человека: ', $display->transliterate('20x30'), "\n";
echo 'Для поиска: ', $storage->transliterate('20×30'), "\n";
Ожидаемый результат
Для человека: 20×30
Для поиска: 20x30
Двустороннее правило <> позволяет выбрать направление при создании объекта. В карточке товара можно показать знак умножения ×, а в простом поисковом ключе хранить x. Это контролируемая замена одного знака. Цепочки Any-Latin или удаления акцентов обычно необратимы, поэтому createInverse не следует понимать как восстановление любого оригинала.
Тот же механизм в процедурной форме: transliterator_create_from_rules. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Transliterator::createInverse, Transliterator::create.
Transliterator::createInverseПолучить преобразование противоположного направления, если оно существует.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Transliterator::createInverse(): ?Transliterator| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; процедурный алиас принимает исходный Transliterator. |
| Возврат | Новый Transliterator|null. Обратное направление не равно восстановлению исходных байтов: Any-Lower теряет информацию, Latin-ASCII теряет различия. |
<?php
declare(strict_types=1);
$lower = Transliterator::create('Any-Lower');
$upper = $lower?->createInverse();
if ($lower === null || $upper === null) { throw new RuntimeException('Пара недоступна'); }
$original = 'OrderId';
$normalized = $lower->transliterate($original);
$restored = $upper->transliterate($normalized);
echo 'Ключ: ', $normalized, "\n";
echo 'Обратное направление: ', $restored, "\n";
Ожидаемый результат
Ключ: orderid
Обратное направление: ORDERID
Обратный преобразователь делает верхний регистр, но не знает, что в OrderId заглавными были только O и I. Информация потеряна на первом шаге. Поэтому оригинал хранится отдельно; inverse — парное действие, а не undo или дешифрование.
<?php
declare(strict_types=1);
$simplify = Transliterator::create('Latin-ASCII');
$inverse = $simplify?->createInverse();
$original = 'café';
$roundTrip = $inverse?->transliterate($simplify->transliterate($original));
echo $roundTrip === $original
? "Точное восстановление возможно\n"
: "Точное восстановление невозможно — сохраняем оригинал\n";
Ожидаемый результат
Точное восстановление невозможно — сохраняем оригинал
Акцент é исчез при Latin-ASCII. Даже если ICU предоставляет обратное направление, из cafe нельзя определить, было ли исходно café, cafè или cafe. Пример превращает ограничение в решение схемы данных: хранить оригинал и производный ключ рядом.
Тот же механизм в процедурной форме: transliterator_create_inverse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Transliterator::createFromRules.
transliterator_create_inverseПолучить преобразование противоположного направления, если оно существует.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
transliterator_create_inverse(Transliterator $transliterator): ?TransliteratorПроцедурная форма Transliterator::createInverse. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; процедурный алиас принимает исходный Transliterator. |
| Возврат | Новый Transliterator|null. Обратное направление не равно восстановлению исходных байтов: Any-Lower теряет информацию, Latin-ASCII теряет различия. |
<?php
declare(strict_types=1);
$lower = Transliterator::create('Any-Lower');
$upper = $lower?->createInverse();
if ($lower === null || $upper === null) { throw new RuntimeException('Пара недоступна'); }
$original = 'OrderId';
$normalized = $lower->transliterate($original);
$restored = $upper->transliterate($normalized);
echo 'Ключ: ', $normalized, "\n";
echo 'Обратное направление: ', $restored, "\n";
Ожидаемый результат
Ключ: orderid
Обратное направление: ORDERID
Обратный преобразователь делает верхний регистр, но не знает, что в OrderId заглавными были только O и I. Информация потеряна на первом шаге. Поэтому оригинал хранится отдельно; inverse — парное действие, а не undo или дешифрование.
<?php
declare(strict_types=1);
$simplify = Transliterator::create('Latin-ASCII');
$inverse = $simplify?->createInverse();
$original = 'café';
$roundTrip = $inverse?->transliterate($simplify->transliterate($original));
echo $roundTrip === $original
? "Точное восстановление возможно\n"
: "Точное восстановление невозможно — сохраняем оригинал\n";
Ожидаемый результат
Точное восстановление невозможно — сохраняем оригинал
Акцент é исчез при Latin-ASCII. Даже если ICU предоставляет обратное направление, из cafe нельзя определить, было ли исходно café, cafè или cafe. Пример превращает ограничение в решение схемы данных: хранить оригинал и производный ключ рядом.
Тот же механизм в процедурной форме: transliterator_create_inverse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Transliterator::createFromRules.
Transliterator::listIDsУзнать, какие преобразования доступны в конкретной сборке ICU, прежде чем предложить их пользователю.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static Transliterator::listIDs(): array|false| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | array строк ID либо false. Состав зависит от версии и набора данных ICU. Для интерфейса выбирайте осмысленный разрешённый поднабор, а не тысячи технических вариантов без пояснений. |
<?php
declare(strict_types=1);
$installed = Transliterator::listIDs();
if (!is_array($installed)) { throw new RuntimeException('Список ICU недоступен'); }
$allowed = [
'Latin-ASCII' => 'убрать акценты для дополнительного поиска',
'Cyrillic-Latin' => 'получить латинское написание кириллицы',
];
foreach ($allowed as $id => $purpose) {
if (in_array($id, $installed, true)) {
echo $id, ': ', $purpose, "\n";
}
}
Ожидаемый результат
Latin-ASCII: убрать акценты для дополнительного поиска
Cyrillic-Latin: получить латинское написание кириллицы
listIDs возвращает большой технический список конкретной ICU-сборки. Интерфейс показывает только заранее выбранные варианты и объясняет их действие. Наличие ID означает техническую возможность, но не соответствие юридическому стандарту транслитерации или требованиям паспорта.
<?php
declare(strict_types=1);
$required = 'Cyrillic-Latin';
$ids = transliterator_list_ids();
if (!is_array($ids) || !in_array($required, $ids, true)) {
echo "Импорт остановлен: на сервере нет {$required}\n";
} else {
$transform = Transliterator::create($required);
echo 'Москва → ', $transform->transliterate('Москва'), "\n";
}
Ожидаемый результат
Москва → Moskva
Проверка нужна при диагностике окружения или выборе необязательной функции. После подтверждения показан реальный результат, а не bool(true). Точное написание определяется ICU и может не совпасть с отраслевым стандартом; для нормативного формата требуется реализация именно этого стандарта.
Тот же механизм в процедурной форме: transliterator_list_ids. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Transliterator::create.
transliterator_list_idsУзнать, какие преобразования доступны в конкретной сборке ICU, прежде чем предложить их пользователю.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
transliterator_list_ids(): array|falseПроцедурная форма Transliterator::listIDs. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | array строк ID либо false. Состав зависит от версии и набора данных ICU. Для интерфейса выбирайте осмысленный разрешённый поднабор, а не тысячи технических вариантов без пояснений. |
<?php
declare(strict_types=1);
$installed = Transliterator::listIDs();
if (!is_array($installed)) { throw new RuntimeException('Список ICU недоступен'); }
$allowed = [
'Latin-ASCII' => 'убрать акценты для дополнительного поиска',
'Cyrillic-Latin' => 'получить латинское написание кириллицы',
];
foreach ($allowed as $id => $purpose) {
if (in_array($id, $installed, true)) {
echo $id, ': ', $purpose, "\n";
}
}
Ожидаемый результат
Latin-ASCII: убрать акценты для дополнительного поиска
Cyrillic-Latin: получить латинское написание кириллицы
listIDs возвращает большой технический список конкретной ICU-сборки. Интерфейс показывает только заранее выбранные варианты и объясняет их действие. Наличие ID означает техническую возможность, но не соответствие юридическому стандарту транслитерации или требованиям паспорта.
<?php
declare(strict_types=1);
$required = 'Cyrillic-Latin';
$ids = transliterator_list_ids();
if (!is_array($ids) || !in_array($required, $ids, true)) {
echo "Импорт остановлен: на сервере нет {$required}\n";
} else {
$transform = Transliterator::create($required);
echo 'Москва → ', $transform->transliterate('Москва'), "\n";
}
Ожидаемый результат
Москва → Moskva
Проверка нужна при диагностике окружения или выборе необязательной функции. После подтверждения показан реальный результат, а не bool(true). Точное написание определяется ICU и может не совпасть с отраслевым стандартом; для нормативного формата требуется реализация именно этого стандарта.
Тот же механизм в процедурной форме: transliterator_list_ids. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Transliterator::create.
Transliterator::transliterateПрименить выбранные правила ко всей строке или ограниченному фрагменту.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Transliterator::transliterate(string $string, int $start = 0, int $end = -1): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| string | Вход UTF-8. Процедурный transliterator_transliterate первым аргументом принимает объект либо ID строкой; передача ID создаёт преобразователь для вызова. |
| start,end | Позиции в UTF-16 code units: start включён, end исключён, -1 до конца. Это не UTF-8 байты strlen и не графемы. Текст вне диапазона остаётся на месте. |
| Возврат | Новая string|false. Метод не делает HTML безопасным, не гарантирует уникальный slug и не переводит слова на другой язык. |
<?php
declare(strict_types=1);
$transform = Transliterator::create('Latin-ASCII');
if ($transform === null) { throw new RuntimeException('Latin-ASCII недоступен'); }
$title = 'Café Déjà Vu';
echo 'Карточка: ', $title, "\n";
echo 'Дополнительный ключ: ', $transform->transliterate($title), "\n";
Ожидаемый результат
Карточка: Café Déjà Vu
Дополнительный ключ: Cafe Deja Vu
transliterate возвращает новую строку; переменная title остаётся неизменной. Это полезно для поиска и совместимости со старой системой, но не повод показывать упрощённое имя владельцу. Результат не экранирован для HTML и не проверен на уникальность — это отдельные обязанности.
<?php
declare(strict_types=1);
$text = '📦 café';
$result = transliterator_transliterate('Latin-ASCII', $text, 3, -1);
echo $result, "\n";
Ожидаемый результат
📦 cafe
Эмодзи 📦 занимает две кодовые единицы UTF-16, пробел — ещё одну, поэтому café начинается с позиции 3. start включён, end=-1 означает до конца. Байтовая strlen дала бы для того же префикса 5 и указала бы другое место. Для пользовательского выделения часто удобнее преобразовать всю логическую часть заранее, а ручные индексы применять только при ясно выбранной единице.
Тот же механизм в процедурной форме: transliterator_transliterate. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Normalizer::normalize, grapheme_substr.
transliterator_transliterateПрименить выбранные правила ко всей строке или ограниченному фрагменту.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
transliterator_transliterate(Transliterator|string $transliterator, string $string, int $start = 0, int $end = -1): string|falseПроцедурная форма Transliterator::transliterate. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string | Вход UTF-8. Процедурный transliterator_transliterate первым аргументом принимает объект либо ID строкой; передача ID создаёт преобразователь для вызова. |
| start,end | Позиции в UTF-16 code units: start включён, end исключён, -1 до конца. Это не UTF-8 байты strlen и не графемы. Текст вне диапазона остаётся на месте. |
| Возврат | Новая string|false. Метод не делает HTML безопасным, не гарантирует уникальный slug и не переводит слова на другой язык. |
<?php
declare(strict_types=1);
$transform = Transliterator::create('Latin-ASCII');
if ($transform === null) { throw new RuntimeException('Latin-ASCII недоступен'); }
$title = 'Café Déjà Vu';
echo 'Карточка: ', $title, "\n";
echo 'Дополнительный ключ: ', $transform->transliterate($title), "\n";
Ожидаемый результат
Карточка: Café Déjà Vu
Дополнительный ключ: Cafe Deja Vu
transliterate возвращает новую строку; переменная title остаётся неизменной. Это полезно для поиска и совместимости со старой системой, но не повод показывать упрощённое имя владельцу. Результат не экранирован для HTML и не проверен на уникальность — это отдельные обязанности.
<?php
declare(strict_types=1);
$text = '📦 café';
$result = transliterator_transliterate('Latin-ASCII', $text, 3, -1);
echo $result, "\n";
Ожидаемый результат
📦 cafe
Эмодзи 📦 занимает две кодовые единицы UTF-16, пробел — ещё одну, поэтому café начинается с позиции 3. start включён, end=-1 означает до конца. Байтовая strlen дала бы для того же префикса 5 и указала бы другое место. Для пользовательского выделения часто удобнее преобразовать всю логическую часть заранее, а ручные индексы применять только при ясно выбранной единице.
Тот же механизм в процедурной форме: transliterator_transliterate. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Normalizer::normalize, grapheme_substr.
Transliterator::getErrorCodeПроверить состояние конкретного преобразователя после вызова.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Transliterator::getErrorCode(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | В текущем API int для кода и string для сообщения; старый текст страницы PHP упоминает false, но актуальная сигнатура runtime его не включает. |
| Диагностика | Для неудачной фабрики объекта ещё нет: используйте intl_get_error_code/message. Для существующего объекта читайте его состояние сразу после операции. |
<?php
declare(strict_types=1);
$transform = Transliterator::create("Any-Lower");
$transform->transliterate("ABC");
var_dump(intl_is_failure($transform->getErrorCode()));
Ожидаемый результат
bool(false)
Успех может сопровождаться ICU warning; intl_is_failure отличает его от ошибки.
<?php
declare(strict_types=1);
$transform = Transliterator::create('Definitely-Not-A-Real-Transform');
if ($transform === null) {
echo "Поисковый ключ не создан; оригинальное название сохранено\n";
echo 'Диагностика: ', intl_error_name(intl_get_error_code()), "\n";
}
Ожидаемый результат
Поисковый ключ не создан; оригинальное название сохранено
Диагностика: U_INVALID_ID
При неудаче фабрика не создаёт объект, поэтому вызвать объектный getErrorCode/getErrorMessage невозможно. Считывается глобальное состояние Intl сразу после create. Основные данные не теряются: оригинальное название остаётся, а необязательный поисковый ключ можно пересоздать после исправления конфигурации. Текст сообщения пригоден для журнала, а решение строится по null и коду, не по подстроке сообщения.
Тот же механизм в процедурной форме: transliterator_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_get_error_message.
transliterator_get_error_codeПроверить состояние конкретного преобразователя после вызова.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
transliterator_get_error_code(Transliterator $transliterator): intПроцедурная форма Transliterator::getErrorCode. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | В текущем API int для кода и string для сообщения; старый текст страницы PHP упоминает false, но актуальная сигнатура runtime его не включает. |
| Диагностика | Для неудачной фабрики объекта ещё нет: используйте intl_get_error_code/message. Для существующего объекта читайте его состояние сразу после операции. |
<?php
declare(strict_types=1);
$transform = Transliterator::create("Any-Lower");
$transform->transliterate("ABC");
var_dump(intl_is_failure($transform->getErrorCode()));
Ожидаемый результат
bool(false)
Успех может сопровождаться ICU warning; intl_is_failure отличает его от ошибки.
<?php
declare(strict_types=1);
$transform = Transliterator::create('Definitely-Not-A-Real-Transform');
if ($transform === null) {
echo "Поисковый ключ не создан; оригинальное название сохранено\n";
echo 'Диагностика: ', intl_error_name(intl_get_error_code()), "\n";
}
Ожидаемый результат
Поисковый ключ не создан; оригинальное название сохранено
Диагностика: U_INVALID_ID
При неудаче фабрика не создаёт объект, поэтому вызвать объектный getErrorCode/getErrorMessage невозможно. Считывается глобальное состояние Intl сразу после create. Основные данные не теряются: оригинальное название остаётся, а необязательный поисковый ключ можно пересоздать после исправления конфигурации. Текст сообщения пригоден для журнала, а решение строится по null и коду, не по подстроке сообщения.
Тот же механизм в процедурной форме: transliterator_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_get_error_message.
Transliterator::getErrorMessageПроверить состояние конкретного преобразователя после вызова.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Transliterator::getErrorMessage(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | В текущем API int для кода и string для сообщения; старый текст страницы PHP упоминает false, но актуальная сигнатура runtime его не включает. |
| Диагностика | Для неудачной фабрики объекта ещё нет: используйте intl_get_error_code/message. Для существующего объекта читайте его состояние сразу после операции. |
<?php
declare(strict_types=1);
$transform = Transliterator::create("Any-Lower");
$transform->transliterate("ABC");
echo $transform->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Успех может сопровождаться ICU warning; intl_is_failure отличает его от ошибки.
<?php
declare(strict_types=1);
$transform = Transliterator::create('Definitely-Not-A-Real-Transform');
if ($transform === null) {
echo "Поисковый ключ не создан; оригинальное название сохранено\n";
echo 'Диагностика: ', intl_error_name(intl_get_error_code()), "\n";
}
Ожидаемый результат
Поисковый ключ не создан; оригинальное название сохранено
Диагностика: U_INVALID_ID
При неудаче фабрика не создаёт объект, поэтому вызвать объектный getErrorCode/getErrorMessage невозможно. Считывается глобальное состояние Intl сразу после create. Основные данные не теряются: оригинальное название остаётся, а необязательный поисковый ключ можно пересоздать после исправления конфигурации. Текст сообщения пригоден для журнала, а решение строится по null и коду, не по подстроке сообщения.
Тот же механизм в процедурной форме: transliterator_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_get_error_message.
transliterator_get_error_messageПроверить состояние конкретного преобразователя после вызова.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
transliterator_get_error_message(Transliterator $transliterator): stringПроцедурная форма Transliterator::getErrorMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | В текущем API int для кода и string для сообщения; старый текст страницы PHP упоминает false, но актуальная сигнатура runtime его не включает. |
| Диагностика | Для неудачной фабрики объекта ещё нет: используйте intl_get_error_code/message. Для существующего объекта читайте его состояние сразу после операции. |
<?php
declare(strict_types=1);
$transform = Transliterator::create("Any-Lower");
$transform->transliterate("ABC");
echo $transform->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Успех может сопровождаться ICU warning; intl_is_failure отличает его от ошибки.
<?php
declare(strict_types=1);
$transform = Transliterator::create('Definitely-Not-A-Real-Transform');
if ($transform === null) {
echo "Поисковый ключ не создан; оригинальное название сохранено\n";
echo 'Диагностика: ', intl_error_name(intl_get_error_code()), "\n";
}
Ожидаемый результат
Поисковый ключ не создан; оригинальное название сохранено
Диагностика: U_INVALID_ID
При неудаче фабрика не создаёт объект, поэтому вызвать объектный getErrorCode/getErrorMessage невозможно. Считывается глобальное состояние Intl сразу после create. Основные данные не теряются: оригинальное название остаётся, а необязательный поисковый ключ можно пересоздать после исправления конфигурации. Текст сообщения пригоден для журнала, а решение строится по null и коду, не по подстроке сообщения.
Тот же механизм в процедурной форме: transliterator_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_get_error_message.
ResourceBundle::__constructОткрыть языковые ресурсы ICU или заранее подготовленный ресурсный пакет приложения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
ResourceBundle::__construct(?string $locale, ?string $bundle, bool $fallback = true)| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string: нужная локаль. null использует default; root обозначает базовый пакет без региональных уточнений. |
| bundle | ?string: каталог данных или имя .dat; null выбирает стандартные данные ICU. Это не JSON/PHP-файл с переводами. |
| fallback | true разрешает родительскую локаль. false требует точного соответствия. Fallback может сопровождаться предупреждением ICU, которое не равно ошибке. |
| Возврат | Конструктор создаёт объект, фабрика возвращает объект|null. Ошибку создания проверяйте до доступа к ресурсам; данные и доступные ключи зависят от пакета и ICU. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$symbols = $bundle->get('NumberElements')?->get('latn')?->get('symbols');
if (!$symbols instanceof ResourceBundle) {
echo "Правила чисел не найдены\n";
} else {
echo 'Дробная часть: ', $symbols->get('decimal'), "\n";
$group = $symbols->get('group');
echo 'Группы разрядов: ',
$group === "\u{00A0}" ? 'неразрывный пробел' : $group, "\n";
}
Ожидаемый результат
Дробная часть: ,
Группы разрядов: неразрывный пробел
new создаёт объект, который открывает встроенное дерево ICU для ru_RU. Первый get выбирает большую ветку NumberElements, второй — обычные латинские цифры 0–9, третий — именованные символы. В результате видны реальные правила, которыми пользуются форматтеры чисел. Знак группировки не печатается «пустотой»: программа узнаёт U+00A0 и подписывает его. Для обычного вывода числа используйте NumberFormatter; прямой ResourceBundle нужен, когда изучаете или используете сами ресурсные данные. Знак ?-> здесь безопасно прекращает цепочку на null; instanceof затем отличает найденную ветку от отсутствующей.
<?php
declare(strict_types=1);
$bundle = ResourceBundle::create('ru_RU', null, true);
if ($bundle === null) {
echo "Точный русский пакет недоступен\n";
} else {
$nan = $bundle->get('NumberElements')?->get('latn')?->get('symbols')?->get('nan');
echo 'Подпись нечислового значения: ', str_replace("\u{00A0}", ' ', (string) $nan), "\n";
}
Ожидаемый результат
Подпись нечислового значения: не число
Фабрика возвращает объект либо null, поэтому её удобно применять там, где отсутствие пакета — ожидаемая ветка. true разрешает брать отдельные отсутствующие значения из родительского русского/root-ресурса; именно так здесь находится nan. Значение содержит неразрывный пробел; только для понятного консольного показа он заменён обычным. Это ресурсная подпись ICU, а не перевод всех сообщений сайта. Если точное физическое наличие каждого ключа критично, передайте false и обработайте null.
Рядом по задаче: ResourceBundle::get, ResourceBundle::getLocales.
ResourceBundle::createОткрыть языковые ресурсы ICU или заранее подготовленный ресурсный пакет приложения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static ResourceBundle::create(?string $locale, ?string $bundle, bool $fallback = true): ?ResourceBundle| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string: нужная локаль. null использует default; root обозначает базовый пакет без региональных уточнений. |
| bundle | ?string: каталог данных или имя .dat; null выбирает стандартные данные ICU. Это не JSON/PHP-файл с переводами. |
| fallback | true разрешает родительскую локаль. false требует точного соответствия. Fallback может сопровождаться предупреждением ICU, которое не равно ошибке. |
| Возврат | Конструктор создаёт объект, фабрика возвращает объект|null. Ошибку создания проверяйте до доступа к ресурсам; данные и доступные ключи зависят от пакета и ICU. |
<?php
declare(strict_types=1);
foreach (['ru_RU', 'zz_ZZ'] as $locale) {
$bundle = ResourceBundle::create($locale, null, false);
echo $locale, $bundle === null ? ': пакет недоступен' : ': пакет подключён', "\n";
}
Ожидаемый результат
ru_RU: пакет подключён
zz_ZZ: пакет недоступен
zz_ZZ намеренно несуществующая локаль. Фабрика позволяет не вызывать get у null и не обещать пользователю язык, для которого нет точного ресурсного пакета. В реальном продукте это только одна проверка: собственные переводы интерфейса также должны существовать. Locale::lookup помогает выбрать один из действительно поддерживаемых языков.
<?php
declare(strict_types=1);
$bundle = resourcebundle_create('ru_RU', null, true);
if (!$bundle instanceof ResourceBundle) {
echo "Пакет не открыт\n";
} else {
echo "Пакет открыт; отдельные ключи могут прийти из родительской локали\n";
}
Ожидаемый результат
Пакет открыт; отдельные ключи могут прийти из родительской локали
Третий аргумент true разрешает наследование ресурсов. Это полезно, когда общий русский ресурс подходит региональным вариантам, но приложение должно честно понимать такую политику. Успешный объект не доказывает, что каждый ключ физически определён именно в ru_RU. Для критичных различий читайте статус сразу после конкретного get либо запретите fallback.
Тот же механизм в процедурной форме: resourcebundle_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: ResourceBundle::get, ResourceBundle::getLocales.
resourcebundle_createОткрыть языковые ресурсы ICU или заранее подготовленный ресурсный пакет приложения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
resourcebundle_create(?string $locale, ?string $bundle, bool $fallback = true): ?ResourceBundleПроцедурная форма ResourceBundle::create. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string: нужная локаль. null использует default; root обозначает базовый пакет без региональных уточнений. |
| bundle | ?string: каталог данных или имя .dat; null выбирает стандартные данные ICU. Это не JSON/PHP-файл с переводами. |
| fallback | true разрешает родительскую локаль. false требует точного соответствия. Fallback может сопровождаться предупреждением ICU, которое не равно ошибке. |
| Возврат | Конструктор создаёт объект, фабрика возвращает объект|null. Ошибку создания проверяйте до доступа к ресурсам; данные и доступные ключи зависят от пакета и ICU. |
<?php
declare(strict_types=1);
foreach (['ru_RU', 'zz_ZZ'] as $locale) {
$bundle = ResourceBundle::create($locale, null, false);
echo $locale, $bundle === null ? ': пакет недоступен' : ': пакет подключён', "\n";
}
Ожидаемый результат
ru_RU: пакет подключён
zz_ZZ: пакет недоступен
zz_ZZ намеренно несуществующая локаль. Фабрика позволяет не вызывать get у null и не обещать пользователю язык, для которого нет точного ресурсного пакета. В реальном продукте это только одна проверка: собственные переводы интерфейса также должны существовать. Locale::lookup помогает выбрать один из действительно поддерживаемых языков.
<?php
declare(strict_types=1);
$bundle = resourcebundle_create('ru_RU', null, true);
if (!$bundle instanceof ResourceBundle) {
echo "Пакет не открыт\n";
} else {
echo "Пакет открыт; отдельные ключи могут прийти из родительской локали\n";
}
Ожидаемый результат
Пакет открыт; отдельные ключи могут прийти из родительской локали
Третий аргумент true разрешает наследование ресурсов. Это полезно, когда общий русский ресурс подходит региональным вариантам, но приложение должно честно понимать такую политику. Успешный объект не доказывает, что каждый ключ физически определён именно в ru_RU. Для критичных различий читайте статус сразу после конкретного get либо запретите fallback.
Тот же механизм в процедурной форме: resourcebundle_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: ResourceBundle::get, ResourceBundle::getLocales.
ResourceBundle::getПройти к нужному элементу дерева ресурсов: по строковому имени или числовому индексу.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
ResourceBundle::get(string|int $index, bool $fallback = true): ResourceBundle|array|string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| index | string|int. Имя выбирает элемент таблицы; число — позицию массива ресурсов. Неверный тип вызывает TypeError, пустое имя/выход за int32 — ValueError в PHP 8.4+. |
| fallback | Разрешать ли наследование из родительского пакета при этом чтении. |
| Возврат | ResourceBundle для сложной ветки; array для массива целых; string, int либо null. Бинарные данные также строка. null требует диагностики: отсутствующее имя не превращается в пустой перевод. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$numberSystems = $bundle->get('NumberElements');
$latinDigits = $numberSystems instanceof ResourceBundle ? $numberSystems->get('latn') : null;
$symbols = $latinDigits instanceof ResourceBundle ? $latinDigits->get('symbols') : null;
$decimal = $symbols instanceof ResourceBundle ? $symbols->get('decimal') : null;
echo is_string($decimal) ? "В русском числе дробная часть начинается с {$decimal}\n" : "Правило не найдено\n";
Ожидаемый результат
В русском числе дробная часть начинается с ,
Каждый get открывает подписанное отделение дерева. Ветка остаётся объектом ResourceBundle, а лист decimal оказывается строкой. Пошаговая запись длиннее цепочки, зато новичок видит тип на каждой ступени и место возможного null. Это похоже на органайзер с коробками внутри, но порядок и состав дерева задаёт ICU, а не PHP-массив вашего приложения.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$label = $bundle->get('shop_checkout_button_that_does_not_exist', false);
echo is_string($label) ? $label : 'Оформить заказ', "\n";
Ожидаемый результат
Оформить заказ
Произвольного ключа приложения нет во встроенном пакете ICU, поэтому get возвращает null, а интерфейс получает заранее подготовленную подпись. false запрещает искать этот ключ у родителя. В своём ресурсном пакете принцип тот же: отсутствие перевода обрабатывается явно. Пустая строка может быть настоящим значением, поэтому проверка is_string точнее оператора ?:, который счёл бы её отсутствующей.
Тот же механизм в процедурной форме: resourcebundle_get. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: ResourceBundle::getErrorCode, ResourceBundle::count.
resourcebundle_getПройти к нужному элементу дерева ресурсов: по строковому имени или числовому индексу.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
resourcebundle_get(ResourceBundle $bundle, string|int $index, bool $fallback = true): ResourceBundle|array|string|int|nullПроцедурная форма ResourceBundle::get. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| index | string|int. Имя выбирает элемент таблицы; число — позицию массива ресурсов. Неверный тип вызывает TypeError, пустое имя/выход за int32 — ValueError в PHP 8.4+. |
| fallback | Разрешать ли наследование из родительского пакета при этом чтении. |
| Возврат | ResourceBundle для сложной ветки; array для массива целых; string, int либо null. Бинарные данные также строка. null требует диагностики: отсутствующее имя не превращается в пустой перевод. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$numberSystems = $bundle->get('NumberElements');
$latinDigits = $numberSystems instanceof ResourceBundle ? $numberSystems->get('latn') : null;
$symbols = $latinDigits instanceof ResourceBundle ? $latinDigits->get('symbols') : null;
$decimal = $symbols instanceof ResourceBundle ? $symbols->get('decimal') : null;
echo is_string($decimal) ? "В русском числе дробная часть начинается с {$decimal}\n" : "Правило не найдено\n";
Ожидаемый результат
В русском числе дробная часть начинается с ,
Каждый get открывает подписанное отделение дерева. Ветка остаётся объектом ResourceBundle, а лист decimal оказывается строкой. Пошаговая запись длиннее цепочки, зато новичок видит тип на каждой ступени и место возможного null. Это похоже на органайзер с коробками внутри, но порядок и состав дерева задаёт ICU, а не PHP-массив вашего приложения.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$label = $bundle->get('shop_checkout_button_that_does_not_exist', false);
echo is_string($label) ? $label : 'Оформить заказ', "\n";
Ожидаемый результат
Оформить заказ
Произвольного ключа приложения нет во встроенном пакете ICU, поэтому get возвращает null, а интерфейс получает заранее подготовленную подпись. false запрещает искать этот ключ у родителя. В своём ресурсном пакете принцип тот же: отсутствие перевода обрабатывается явно. Пустая строка может быть настоящим значением, поэтому проверка is_string точнее оператора ?:, который счёл бы её отсутствующей.
Тот же механизм в процедурной форме: resourcebundle_get. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: ResourceBundle::getErrorCode, ResourceBundle::count.
ResourceBundle::countУзнать число элементов текущей ветки, прежде чем показать список или пройти индексами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
ResourceBundle::count(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; procedural принимает bundle. Объект реализует Countable, поэтому count($bundle) вызывает тот же механизм. |
| Возврат | int: количество непосредственных элементов, не всех вложенных потомков. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$numberSystems = $bundle->get('NumberElements');
if (!$numberSystems instanceof ResourceBundle) {
echo "Ветка систем счисления не найдена\n";
} else {
echo 'Непосредственных систем счисления в этой сборке ICU: ', $numberSystems->count(), "\n";
}
Ожидаемый результат
Непосредственных систем счисления в этой сборке ICU: 2
Метод считает только элементы, физически находящиеся на этом уровне ru_RU NumberElements, не все унаследованные системы и не вложенные patterns/symbols. Поэтому здесь 2, хотя через get с fallback доступно больше веток из родительских ресурсов. Число относится к проверенной ICU 77.1 и может измениться после обновления данных; его нельзя превращать в бизнес-условие. Прикладной интерфейс обычно фильтрует заранее разрешённый небольшой набор вместо показа всех технических систем.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$symbols = $bundle->get('NumberElements')?->get('latn')?->get('symbols');
if (!$symbols instanceof ResourceBundle) { throw new RuntimeException('Нет ветки symbols'); }
echo 'Элементов в ветке: ', count($symbols), "\n";
echo 'Дробный разделитель: ', $symbols['decimal'], "\n";
Ожидаемый результат
Элементов в ветке: 4
Дробный разделитель: ,
count работает благодаря Countable, а чтение в квадратных скобках — благодаря ArrayAccess. Оба действия относятся к одной ветке. Явный get удобнее, когда надо управлять fallback; квадратные скобки подходят для короткого чтения известного ключа. Точное количество также зависит от версии ICU.
Тот же механизм в процедурной форме: resourcebundle_count. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: ResourceBundle::getIterator.
resourcebundle_countУзнать число элементов текущей ветки, прежде чем показать список или пройти индексами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
resourcebundle_count(ResourceBundle $bundle): intПроцедурная форма ResourceBundle::count. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; procedural принимает bundle. Объект реализует Countable, поэтому count($bundle) вызывает тот же механизм. |
| Возврат | int: количество непосредственных элементов, не всех вложенных потомков. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$numberSystems = $bundle->get('NumberElements');
if (!$numberSystems instanceof ResourceBundle) {
echo "Ветка систем счисления не найдена\n";
} else {
echo 'Непосредственных систем счисления в этой сборке ICU: ', $numberSystems->count(), "\n";
}
Ожидаемый результат
Непосредственных систем счисления в этой сборке ICU: 2
Метод считает только элементы, физически находящиеся на этом уровне ru_RU NumberElements, не все унаследованные системы и не вложенные patterns/symbols. Поэтому здесь 2, хотя через get с fallback доступно больше веток из родительских ресурсов. Число относится к проверенной ICU 77.1 и может измениться после обновления данных; его нельзя превращать в бизнес-условие. Прикладной интерфейс обычно фильтрует заранее разрешённый небольшой набор вместо показа всех технических систем.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$symbols = $bundle->get('NumberElements')?->get('latn')?->get('symbols');
if (!$symbols instanceof ResourceBundle) { throw new RuntimeException('Нет ветки symbols'); }
echo 'Элементов в ветке: ', count($symbols), "\n";
echo 'Дробный разделитель: ', $symbols['decimal'], "\n";
Ожидаемый результат
Элементов в ветке: 4
Дробный разделитель: ,
count работает благодаря Countable, а чтение в квадратных скобках — благодаря ArrayAccess. Оба действия относятся к одной ветке. Явный get удобнее, когда надо управлять fallback; квадратные скобки подходят для короткого чтения известного ключа. Точное количество также зависит от версии ICU.
Тот же механизм в процедурной форме: resourcebundle_count. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: ResourceBundle::getIterator.
ResourceBundle::getLocalesПолучить локали, для которых пакет действительно содержит ресурсы.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static ResourceBundle::getLocales(string $bundle): array|false| Аргумент или результат | Что означает на практике |
|---|---|
| bundle | Строка пути/имени пакета; пустая строка выбирает встроенный список ICU. |
| Возврат | array строк либо false. Это список ICU-пакета, а не перечень страниц сайта с готовым переводом. Состав меняется при обновлении данных. |
<?php
declare(strict_types=1);
$icuLocales = ResourceBundle::getLocales('');
$wanted = ['ru' => 'Русский', 'en' => 'English', 'zz' => 'Несуществующий'];
if (!is_array($icuLocales)) { throw new RuntimeException('Список локалей недоступен'); }
foreach ($wanted as $locale => $label) {
if (in_array($locale, $icuLocales, true)) {
echo $locale, ': ', $label, "\n";
}
}
Ожидаемый результат
ru: Русский
en: English
В интерфейс попали два реально присутствующих ресурса, а вымышленный zz отброшен. Это ещё не доказательство готового перевода вашего продукта: пересечение нужно делать и со списком собственных переводов. Метод принимает имя/путь пакета, а пустая строка просит локали встроенных данных ICU; состав меняется между версиями.
<?php
declare(strict_types=1);
$available = resourcebundle_locales("");
$translated = ["en", "de"];
echo implode(",", array_values(array_intersect($translated, $available))), "
";
Ожидаемый результат
en,de
Только переведённые продуктом языки следует показывать пользователю как готовые.
Тот же механизм в процедурной форме: resourcebundle_locales. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup.
resourcebundle_localesПолучить локали, для которых пакет действительно содержит ресурсы.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
resourcebundle_locales(string $bundle): array|falseПроцедурная форма ResourceBundle::getLocales. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| bundle | Строка пути/имени пакета; пустая строка выбирает встроенный список ICU. |
| Возврат | array строк либо false. Это список ICU-пакета, а не перечень страниц сайта с готовым переводом. Состав меняется при обновлении данных. |
<?php
declare(strict_types=1);
$icuLocales = ResourceBundle::getLocales('');
$wanted = ['ru' => 'Русский', 'en' => 'English', 'zz' => 'Несуществующий'];
if (!is_array($icuLocales)) { throw new RuntimeException('Список локалей недоступен'); }
foreach ($wanted as $locale => $label) {
if (in_array($locale, $icuLocales, true)) {
echo $locale, ': ', $label, "\n";
}
}
Ожидаемый результат
ru: Русский
en: English
В интерфейс попали два реально присутствующих ресурса, а вымышленный zz отброшен. Это ещё не доказательство готового перевода вашего продукта: пересечение нужно делать и со списком собственных переводов. Метод принимает имя/путь пакета, а пустая строка просит локали встроенных данных ICU; состав меняется между версиями.
<?php
declare(strict_types=1);
$available = resourcebundle_locales("");
$translated = ["en", "de"];
echo implode(",", array_values(array_intersect($translated, $available))), "
";
Ожидаемый результат
en,de
Только переведённые продуктом языки следует показывать пользователю как готовые.
Тот же механизм в процедурной форме: resourcebundle_locales. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup.
ResourceBundle::getIteratorПеребрать непосредственные ресурсы с помощью foreach, не вручную вычисляя индексы.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
ResourceBundle::getIterator(): Iterator| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Iterator для текущего пакета. Это метод интерфейса IteratorAggregate; у него нет процедурного алиаса. |
| Порядок и типы | Ключи и значения определяет пакет. Значение может быть вложенным ResourceBundle: проверяйте тип перед выводом. Рекурсивный обход должен учитывать глубину и задачу, а не бездумно печатать все данные ICU. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$symbols = $bundle->get('NumberElements')?->get('latn')?->get('symbols');
if (!$symbols instanceof ResourceBundle) { throw new RuntimeException('Нет ветки symbols'); }
$labels = ['decimal' => 'дробная часть', 'nan' => 'не число'];
foreach ($symbols->getIterator() as $key => $value) {
if (isset($labels[$key]) && is_string($value)) {
echo $labels[$key], ': ', str_replace("\u{00A0}", ' ', $value), "\n";
}
}
Ожидаемый результат
дробная часть: ,
не число: не число
Итератор обходит непосредственные дочерние элементы ветки. Мы не печатаем всё дерево ICU: выбираем два ключа, смысл которых объяснён читателю. Значение может быть другой веткой, строкой или числом, поэтому перед строковыми действиями проверен тип. foreach запросил бы тот же итератор автоматически; явный getIterator показан потому, что разбирается именно этот метод.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$symbols = $bundle->get('NumberElements')?->get('latn')?->get('symbols');
if (!$symbols instanceof ResourceBundle) { throw new RuntimeException('Нет ветки symbols'); }
$keys = [];
foreach ($symbols as $key => $value) { $keys[] = $key; }
echo 'Ключи текущей ветки: ', implode(', ', $keys), "\n";
Ожидаемый результат
Ключи текущей ветки: approximatelySign, decimal, group, nan
Получена карта только одного уровня: approximatelySign, decimal, group и nan. Это помогает исследовать схему небольшого известного пакета. Рекурсивное превращение всего ICU в массив потребует больше памяти и даст огромный набор технических данных; для прикладной задачи лучше читать известный путь.
Рядом по задаче: ResourceBundle::get, ResourceBundle::count.
ResourceBundle::getErrorCodeОтличить отсутствующий ресурс от допустимого fallback и получить причину неудачи.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
ResourceBundle::getErrorCode(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Код int или сообщение string последнего вызова на этом объекте. |
| Предупреждение | ICU предупреждения имеют отрицательные коды: используйте intl_is_failure, если нужно понять, потерпела ли операция неудачу. Читайте состояние немедленно после проверяемого вызова. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle("root", null);
var_dump(intl_is_failure($bundle->getErrorCode()));
Ожидаемый результат
bool(false)
root выбран для определённого примера без регионального fallback.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$value = $bundle->get('missing_shop_label', false);
if ($value === null && intl_is_failure($bundle->getErrorCode())) {
echo "Использована запасная подпись: Оформить заказ\n";
echo 'Диагностика: ', intl_error_name($bundle->getErrorCode()), "\n";
}
Ожидаемый результат
Использована запасная подпись: Оформить заказ
Диагностика: U_MISSING_RESOURCE_ERROR
Сначала проверен результат get, затем сразу состояние того же объекта. Интерфейс получает безопасную запасную подпись, а разработчик — устойчивое имя кода. getErrorMessage можно сохранить в технический журнал, но разбирать его текст для ветвления не следует: формулировка зависит от ICU. Отрицательные предупреждения fallback и настоящие ошибки различает intl_is_failure.
Тот же механизм в процедурной форме: resourcebundle_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, ResourceBundle::get.
resourcebundle_get_error_codeОтличить отсутствующий ресурс от допустимого fallback и получить причину неудачи.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
resourcebundle_get_error_code(ResourceBundle $bundle): intПроцедурная форма ResourceBundle::getErrorCode. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Код int или сообщение string последнего вызова на этом объекте. |
| Предупреждение | ICU предупреждения имеют отрицательные коды: используйте intl_is_failure, если нужно понять, потерпела ли операция неудачу. Читайте состояние немедленно после проверяемого вызова. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle("root", null);
var_dump(intl_is_failure($bundle->getErrorCode()));
Ожидаемый результат
bool(false)
root выбран для определённого примера без регионального fallback.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$value = $bundle->get('missing_shop_label', false);
if ($value === null && intl_is_failure($bundle->getErrorCode())) {
echo "Использована запасная подпись: Оформить заказ\n";
echo 'Диагностика: ', intl_error_name($bundle->getErrorCode()), "\n";
}
Ожидаемый результат
Использована запасная подпись: Оформить заказ
Диагностика: U_MISSING_RESOURCE_ERROR
Сначала проверен результат get, затем сразу состояние того же объекта. Интерфейс получает безопасную запасную подпись, а разработчик — устойчивое имя кода. getErrorMessage можно сохранить в технический журнал, но разбирать его текст для ветвления не следует: формулировка зависит от ICU. Отрицательные предупреждения fallback и настоящие ошибки различает intl_is_failure.
Тот же механизм в процедурной форме: resourcebundle_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, ResourceBundle::get.
ResourceBundle::getErrorMessageОтличить отсутствующий ресурс от допустимого fallback и получить причину неудачи.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
ResourceBundle::getErrorMessage(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Код int или сообщение string последнего вызова на этом объекте. |
| Предупреждение | ICU предупреждения имеют отрицательные коды: используйте intl_is_failure, если нужно понять, потерпела ли операция неудачу. Читайте состояние немедленно после проверяемого вызова. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle("root", null);
echo $bundle->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
root выбран для определённого примера без регионального fallback.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$value = $bundle->get('missing_shop_label', false);
if ($value === null && intl_is_failure($bundle->getErrorCode())) {
echo "Использована запасная подпись: Оформить заказ\n";
echo 'Диагностика: ', intl_error_name($bundle->getErrorCode()), "\n";
}
Ожидаемый результат
Использована запасная подпись: Оформить заказ
Диагностика: U_MISSING_RESOURCE_ERROR
Сначала проверен результат get, затем сразу состояние того же объекта. Интерфейс получает безопасную запасную подпись, а разработчик — устойчивое имя кода. getErrorMessage можно сохранить в технический журнал, но разбирать его текст для ветвления не следует: формулировка зависит от ICU. Отрицательные предупреждения fallback и настоящие ошибки различает intl_is_failure.
Тот же механизм в процедурной форме: resourcebundle_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, ResourceBundle::get.
resourcebundle_get_error_messageОтличить отсутствующий ресурс от допустимого fallback и получить причину неудачи.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
resourcebundle_get_error_message(ResourceBundle $bundle): stringПроцедурная форма ResourceBundle::getErrorMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | Код int или сообщение string последнего вызова на этом объекте. |
| Предупреждение | ICU предупреждения имеют отрицательные коды: используйте intl_is_failure, если нужно понять, потерпела ли операция неудачу. Читайте состояние немедленно после проверяемого вызова. |
<?php
declare(strict_types=1);
$bundle = new ResourceBundle("root", null);
echo $bundle->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
root выбран для определённого примера без регионального fallback.
<?php
declare(strict_types=1);
$bundle = new ResourceBundle('ru_RU', null);
$value = $bundle->get('missing_shop_label', false);
if ($value === null && intl_is_failure($bundle->getErrorCode())) {
echo "Использована запасная подпись: Оформить заказ\n";
echo 'Диагностика: ', intl_error_name($bundle->getErrorCode()), "\n";
}
Ожидаемый результат
Использована запасная подпись: Оформить заказ
Диагностика: U_MISSING_RESOURCE_ERROR
Сначала проверен результат get, затем сразу состояние того же объекта. Интерфейс получает безопасную запасную подпись, а разработчик — устойчивое имя кода. getErrorMessage можно сохранить в технический журнал, но разбирать его текст для ветвления не следует: формулировка зависит от ICU. Отрицательные предупреждения fallback и настоящие ошибки различает intl_is_failure.
Тот же механизм в процедурной форме: resourcebundle_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure, ResourceBundle::get.
grapheme_strlenОграничить подпись по видимым символам, не считая акцент или части emoji отдельными буквами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_strlen(string $string): int|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| string | Строка для измерения. Это не ширина текста в пикселях: даже две графемы могут занимать разное место. |
| Возврат | int|false|null. Пустая строка имеет длину 0, что не равно ошибке. Для байтового ограничения API/БД всё равно нужна проверка strlen. |
<?php
declare(strict_types=1);
$text = "e\u{0301}";
echo strlen($text), " / ", grapheme_strlen($text), "
";
Ожидаемый результат
3 / 1
strlen считает три байта UTF-8; grapheme_strlen одну букву с акцентом.
<?php
declare(strict_types=1);
$text = "👍🏽";
echo grapheme_strlen($text), "
";
Ожидаемый результат
1
Модификатор оттенка кожи не должен занимать отдельный шаг обрезки интерфейса.
<?php
declare(strict_types=1);
foreach (['Чай 👍🏽', 'Кофе и чай'] as $caption) {
$length = grapheme_strlen($caption);
if ($length === false || $length === null) { echo "Исправьте кодировку подписи\n"; continue; }
echo $caption, ': ', $length <= 5 ? 'подпись принята' : 'нужно не больше 5 видимых знаков', "\n";
}
Ожидаемый результат
Чай 👍🏽: подпись принята
Кофе и чай: нужно не больше 5 видимых знаков
В первой подписи пять графем: Ч, а, й, пробел и эмодзи с модификатором оттенка кожи. Лимит относится к этой учебной подписи. Сначала отделены false/null — ошибки обработки; нулевая длина сама по себе не ошибка. Обязательность непустого поля и размер в байтах проверяются отдельно. Графемы не гарантируют, что подпись поместится в пять одинаковых ячеек: ширина шрифта — другая задача.
Рядом по задаче: grapheme_substr, grapheme_str_split.
grapheme_substrСократить подпись или взять фрагмент, сохранив целые графемы.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_substr(string $string, int $offset, ?int $length = null, string $locale = ""): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| offset | Начало от нуля в графемах; отрицательное считается с конца. |
| length | null до конца; положительное — максимум графем; отрицательное исключает указанное число графем с конца. Если начало оказывается после обрезанного конца, результат пустой. |
| locale | Опциональная локаль с PHP 8.5. |
| Возврат | string|false. С PHP 8.0 выходящие за диапазон позиции прижимаются к границе строки. Это не байтовая substr; её результаты нельзя смешивать с байтовыми индексами. |
<?php
declare(strict_types=1);
$text = "e\u{0301}clair";
echo grapheme_substr($text, 0, 1), "
";
Ожидаемый результат
é
В результате сохраняется исходное составное представление буквы, а не только e.
<?php
declare(strict_types=1);
$title = "Кофе и чай";
$limit = 4;
echo grapheme_substr($title, 0, $limit), grapheme_strlen($title) > $limit ? "…" : "", "
";
Ожидаемый результат
Кофе…
Сначала определяем нужный фрагмент, затем добавляем многоточие. Для HTML результат всё ещё нужно экранировать.
Рядом по задаче: grapheme_strlen, grapheme_extract.
grapheme_str_splitРазбить текст на графемы или группы графем для редактора, подсказки или безопасной посимвольной обработки.
PHP 8.4+ · intl
grapheme_str_split(string $string, int $length = 1): array|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| length | Количество графем в каждом элементе; по умолчанию 1, меньше 1 вызывает ValueError. |
| Возврат | array строк либо false. Последний элемент может быть короче. Полный массив потребляет дополнительную память; для большого текста рассмотрите последовательный BreakIterator. |
<?php
declare(strict_types=1);
$parts = grapheme_str_split("e\u{0301}x");
echo count($parts), " / ", bin2hex($parts[0]), "
";
Ожидаемый результат
2 / 65cc81
Первый элемент содержит оба компонента первой графемы.
<?php
declare(strict_types=1);
echo implode("|", grapheme_str_split("ABCDE", 2)), "
";
Ожидаемый результат
AB|CD|E
Разбиение по фиксированным графемам не равно переносам по словам и предложениям.
<?php
declare(strict_types=1);
$icons = grapheme_str_split('👍🏽☕📦');
if ($icons === false) {
echo '<p>Не удалось прочитать значки.</p>';
} else {
echo '<p>';
foreach ($icons as $icon) {
echo '<span style="display:inline-block;padding:.4em;border:1px solid #84999a">',
htmlspecialchars($icon, ENT_QUOTES, 'UTF-8'), '</span>';
}
echo '</p>';
}
Ожидаемый результат
<p><span style="display:inline-block;padding:.4em;border:1px solid #84999a">👍🏽</span><span style="display:inline-block;padding:.4em;border:1px solid #84999a">☕</span><span style="display:inline-block;padding:.4em;border:1px solid #84999a">📦</span></p>В браузере получатся три элемента, а не отдельные части эмодзи. Такой массив можно использовать в редакторе статусов или при посимвольном показе текста. Это настоящий HTML, полученный PHP; JavaScript-анимация для его понимания не нужна. Наличие графемного разделения не разрешает вставлять произвольный текст без htmlspecialchars. grapheme_str_split доступна с PHP 8.4.
👍🏽☕📦
Рядом по задаче: IntlBreakIterator::createCharacterInstance, grapheme_extract.
grapheme_strposНайти первое совпадение в тексте с учётом регистра и получить позицию для дальнейшей работы с графемами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_strpos(string $haystack, string $needle, int $offset = 0, string $locale = ""): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| haystack,needle | Текст и искомая строка UTF-8. Это поиск Unicode по ICU, а не побайтовая проверка идентификатора безопасности. |
| offset | В графемах; отрицательное значение отсчитывается от конца. Возвращаемая позиция всегда от начала исходной строки. Для r-варианта поиск идёт справа налево в выбранном диапазоне. |
| locale | Опциональная локаль добавлена в PHP 8.5; не полагайтесь на неявное окружение там, где результат поиска входит в договор. |
| Возврат | int|false. Позиция 0 означает совпадение в начале; проверяйте === false, а не if (!$position). |
<?php
declare(strict_types=1);
$text = "e\u{0301}a a";
echo grapheme_strpos($text, "a"), "
";
Ожидаемый результат
1
Первый видимый символ занимает несколько байтов, но позиция считается в графемах.
<?php
declare(strict_types=1);
$position = grapheme_strpos("abc", "a");
echo $position === false ? "missing
" : "found at " . $position . "
";
Ожидаемый результат
found at 0
Строгая проверка не теряет совпадение в самом начале.
<?php
declare(strict_types=1);
$caption = '☕ чай и чай';
$needle = 'чай';
$position = grapheme_strpos($caption, $needle);
if ($position === false) {
echo "Совпадений нет\n";
} else {
$length = grapheme_strlen($needle);
echo grapheme_substr($caption, 0, $position), '[',
grapheme_substr($caption, $position, $length), ']',
grapheme_substr($caption, $position + $length), "\n";
}
Ожидаемый результат
☕ [чай] и чай
Поиск вернул позицию в графемах; той же единицей пользуется grapheme_substr. Байтовая substr с таким индексом могла бы разрезать UTF-8. Квадратные скобки делают найденный фрагмент видимым в консоли; на сайте вместо них можно сформировать mark, экранируя каждую текстовую часть. В этом примере искомое слово и совпадение имеют по три графемы. Для произвольного сложного языкового сопоставления нельзя без проверки предполагать одинаковую длину эквивалентных записей. Строгое === false оставляет позицию 0 успешной.
Рядом по задаче: grapheme_substr, grapheme_strstr.
grapheme_striposНайти первое совпадение в тексте без учёта регистра и получить позицию для дальнейшей работы с графемами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_stripos(string $haystack, string $needle, int $offset = 0, string $locale = ""): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| haystack,needle | Текст и искомая строка UTF-8. Это поиск Unicode по ICU, а не побайтовая проверка идентификатора безопасности. |
| offset | В графемах; отрицательное значение отсчитывается от конца. Возвращаемая позиция всегда от начала исходной строки. Для r-варианта поиск идёт справа налево в выбранном диапазоне. |
| locale | Опциональная локаль добавлена в PHP 8.5; не полагайтесь на неявное окружение там, где результат поиска входит в договор. |
| Возврат | int|false. Позиция 0 означает совпадение в начале; проверяйте === false, а не if (!$position). |
<?php
declare(strict_types=1);
$text = "e\u{0301}a a";
echo grapheme_stripos($text, "A"), "
";
Ожидаемый результат
1
Первый видимый символ занимает несколько байтов, но позиция считается в графемах.
<?php
declare(strict_types=1);
$position = grapheme_stripos("abc", "A");
echo $position === false ? "missing
" : "found at " . $position . "
";
Ожидаемый результат
found at 0
Строгая проверка не теряет совпадение в самом начале.
<?php
declare(strict_types=1);
$caption = '☕ чай и чай';
$needle = 'ЧАЙ';
$position = grapheme_stripos($caption, $needle);
if ($position === false) {
echo "Совпадений нет\n";
} else {
$length = grapheme_strlen($needle);
echo grapheme_substr($caption, 0, $position), '[',
grapheme_substr($caption, $position, $length), ']',
grapheme_substr($caption, $position + $length), "\n";
}
Ожидаемый результат
☕ [чай] и чай
Поиск вернул позицию в графемах; той же единицей пользуется grapheme_substr. Байтовая substr с таким индексом могла бы разрезать UTF-8. Квадратные скобки делают найденный фрагмент видимым в консоли; на сайте вместо них можно сформировать mark, экранируя каждую текстовую часть. В этом примере искомое слово и совпадение имеют по три графемы. Для произвольного сложного языкового сопоставления нельзя без проверки предполагать одинаковую длину эквивалентных записей. Строгое === false оставляет позицию 0 успешной.
Рядом по задаче: grapheme_substr, grapheme_stristr.
grapheme_strrposНайти последнее совпадение в тексте с учётом регистра и получить позицию для дальнейшей работы с графемами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_strrpos(string $haystack, string $needle, int $offset = 0, string $locale = ""): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| haystack,needle | Текст и искомая строка UTF-8. Это поиск Unicode по ICU, а не побайтовая проверка идентификатора безопасности. |
| offset | В графемах; отрицательное значение отсчитывается от конца. Возвращаемая позиция всегда от начала исходной строки. Для r-варианта поиск идёт справа налево в выбранном диапазоне. |
| locale | Опциональная локаль добавлена в PHP 8.5; не полагайтесь на неявное окружение там, где результат поиска входит в договор. |
| Возврат | int|false. Позиция 0 означает совпадение в начале; проверяйте === false, а не if (!$position). |
<?php
declare(strict_types=1);
$text = "e\u{0301}a a";
echo grapheme_strrpos($text, "a"), "
";
Ожидаемый результат
3
Первый видимый символ занимает несколько байтов, но позиция считается в графемах.
<?php
declare(strict_types=1);
$position = grapheme_strrpos("abc", "a");
echo $position === false ? "missing
" : "found at " . $position . "
";
Ожидаемый результат
found at 0
Строгая проверка не теряет совпадение в самом начале.
<?php
declare(strict_types=1);
$caption = '☕ чай и чай';
$needle = 'чай';
$position = grapheme_strrpos($caption, $needle);
if ($position === false) {
echo "Совпадений нет\n";
} else {
$length = grapheme_strlen($needle);
echo grapheme_substr($caption, 0, $position), '[',
grapheme_substr($caption, $position, $length), ']',
grapheme_substr($caption, $position + $length), "\n";
}
Ожидаемый результат
☕ чай и [чай]
Поиск вернул позицию в графемах; той же единицей пользуется grapheme_substr. Байтовая substr с таким индексом могла бы разрезать UTF-8. Квадратные скобки делают найденный фрагмент видимым в консоли; на сайте вместо них можно сформировать mark, экранируя каждую текстовую часть. В этом примере искомое слово и совпадение имеют по три графемы. Для произвольного сложного языкового сопоставления нельзя без проверки предполагать одинаковую длину эквивалентных записей. Строгое === false оставляет позицию 0 успешной.
Рядом по задаче: grapheme_substr, grapheme_strstr.
grapheme_strriposНайти последнее совпадение в тексте без учёта регистра и получить позицию для дальнейшей работы с графемами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_strripos(string $haystack, string $needle, int $offset = 0, string $locale = ""): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| haystack,needle | Текст и искомая строка UTF-8. Это поиск Unicode по ICU, а не побайтовая проверка идентификатора безопасности. |
| offset | В графемах; отрицательное значение отсчитывается от конца. Возвращаемая позиция всегда от начала исходной строки. Для r-варианта поиск идёт справа налево в выбранном диапазоне. |
| locale | Опциональная локаль добавлена в PHP 8.5; не полагайтесь на неявное окружение там, где результат поиска входит в договор. |
| Возврат | int|false. Позиция 0 означает совпадение в начале; проверяйте === false, а не if (!$position). |
<?php
declare(strict_types=1);
$text = "e\u{0301}a a";
echo grapheme_strripos($text, "A"), "
";
Ожидаемый результат
3
Первый видимый символ занимает несколько байтов, но позиция считается в графемах.
<?php
declare(strict_types=1);
$position = grapheme_strripos("abc", "A");
echo $position === false ? "missing
" : "found at " . $position . "
";
Ожидаемый результат
found at 0
Строгая проверка не теряет совпадение в самом начале.
<?php
declare(strict_types=1);
$caption = '☕ чай и чай';
$needle = 'ЧАЙ';
$position = grapheme_strripos($caption, $needle);
if ($position === false) {
echo "Совпадений нет\n";
} else {
$length = grapheme_strlen($needle);
echo grapheme_substr($caption, 0, $position), '[',
grapheme_substr($caption, $position, $length), ']',
grapheme_substr($caption, $position + $length), "\n";
}
Ожидаемый результат
☕ чай и [чай]
Поиск вернул позицию в графемах; той же единицей пользуется grapheme_substr. Байтовая substr с таким индексом могла бы разрезать UTF-8. Квадратные скобки делают найденный фрагмент видимым в консоли; на сайте вместо них можно сформировать mark, экранируя каждую текстовую часть. В этом примере искомое слово и совпадение имеют по три графемы. Для произвольного сложного языкового сопоставления нельзя без проверки предполагать одинаковую длину эквивалентных записей. Строгое === false оставляет позицию 0 успешной.
Рядом по задаче: grapheme_substr, grapheme_stristr.
grapheme_strstrВзять часть текста от найденного слова либо всё перед ним, учитывая регистр.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_strstr(string $haystack, string $needle, bool $beforeNeedle = false, string $locale = ""): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| haystack,needle | Исходный текст и искомая строка UTF-8. |
| beforeNeedle | false: от первого совпадения включительно до конца; true: до совпадения, исключая needle. |
| locale | Опциональная локаль с PHP 8.5. |
| Возврат | string|false. Пустая строка перед совпадением в начале является успешным результатом. Для получения позиции используйте соответствующий strpos. |
<?php
declare(strict_types=1);
echo grapheme_strstr("Visit café today", "café"), "
";
Ожидаемый результат
café today
Возвращён исходный фрагмент, поэтому его регистр сохраняется.
<?php
declare(strict_types=1);
echo "[", grapheme_strstr("Visit café today", "café", true), "]
";
Ожидаемый результат
[Visit ]
Пробел перед совпадением остаётся частью фрагмента; trim применяйте только если таков договор.
<?php
declare(strict_types=1);
$line = 'Заказ 42. Комментарий: café у входа';
$comment = grapheme_strstr($line, 'Комментарий:');
if ($comment === false) {
echo "В заявке нет комментария\n";
} else {
echo $comment, "\n";
}
Ожидаемый результат
Комментарий: café у входа
Получен хвост исходной строки вместе с меткой. Этот простой текстовый договор допускает только одну метку; если поля могут содержать такие же слова, нужен структурированный формат, а не поиск подстроки. Исходный регистр и акцент сохранены. beforeNeedle=true вернул бы часть до метки, что разобрано в предыдущем примере.
Рядом по задаче: grapheme_strpos, grapheme_stripos.
grapheme_stristrВзять часть текста от найденного слова либо всё перед ним, игнорируя регистр.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_stristr(string $haystack, string $needle, bool $beforeNeedle = false, string $locale = ""): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| haystack,needle | Исходный текст и искомая строка UTF-8. |
| beforeNeedle | false: от первого совпадения включительно до конца; true: до совпадения, исключая needle. |
| locale | Опциональная локаль с PHP 8.5. |
| Возврат | string|false. Пустая строка перед совпадением в начале является успешным результатом. Для получения позиции используйте соответствующий strpos. |
<?php
declare(strict_types=1);
echo grapheme_stristr("Visit café today", "CAFÉ"), "
";
Ожидаемый результат
café today
Возвращён исходный фрагмент, поэтому его регистр сохраняется.
<?php
declare(strict_types=1);
echo "[", grapheme_stristr("Visit café today", "CAFÉ", true), "]
";
Ожидаемый результат
[Visit ]
Пробел перед совпадением остаётся частью фрагмента; trim применяйте только если таков договор.
<?php
declare(strict_types=1);
$line = 'Заказ 42. Комментарий: café у входа';
$comment = grapheme_stristr($line, 'КОММЕНТАРИЙ:');
if ($comment === false) {
echo "В заявке нет комментария\n";
} else {
echo $comment, "\n";
}
Ожидаемый результат
Комментарий: café у входа
Получен хвост исходной строки вместе с меткой. Этот простой текстовый договор допускает только одну метку; если поля могут содержать такие же слова, нужен структурированный формат, а не поиск подстроки. Исходный регистр и акцент сохранены. beforeNeedle=true вернул бы часть до метки, что разобрано в предыдущем примере.
Рядом по задаче: grapheme_strpos, grapheme_stripos.
grapheme_extractПорционно читать UTF-8 буфер целыми графемами, одновременно получая байтовую позицию следующего чтения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
grapheme_extract(string $haystack, int $size, int $type = GRAPHEME_EXTR_COUNT, int $offset = 0, &$next = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| size,type | size — предел. GRAPHEME_EXTR_COUNT считает графемы; MAXBYTES ограничивает байты; MAXCHARS ограничивает кодовые точки UTF-8. Граница результата всё равно не разрезает графему. |
| offset | Байтовая позиция, в отличие от grapheme_substr. Отрицательная — с конца (PHP 7.1+). Если попали внутрь UTF-8 символа, начало переносится к следующей границе кодовой точки; лучше всегда использовать возвращённый next. |
| next | Переменная по ссылке получает следующую байтовую позицию, вплоть до длины буфера. |
| Возврат | string|false. Слишком малый лимит байтов может не вместить даже одну графему: следите, чтобы цикл продвигался и не зависал на пустом фрагменте. |
<?php
declare(strict_types=1);
$text = "e\u{0301}x";
$next = 0;
$first = grapheme_extract($text, 1, GRAPHEME_EXTR_COUNT, 0, $next);
echo bin2hex($first), " / ", $next, "
";
Ожидаемый результат
65cc81 / 3
Одна графема заняла три байта; next подходит для следующего extract, а не для grapheme_substr.
<?php
declare(strict_types=1);
$next = 0;
$piece = grapheme_extract("e\u{0301}x", 3, GRAPHEME_EXTR_MAXBYTES, 0, $next);
echo strlen($piece), " / ", grapheme_strlen($piece), "
";
Ожидаемый результат
3 / 1
Лимит транспортного пакета измеряется байтами, а целостность сохраняется на уровне графем.
<?php
declare(strict_types=1);
$text = 'A👍🏽BC';
$offset = 0;
while ($offset < strlen($text)) {
$next = $offset;
$part = grapheme_extract($text, 8, GRAPHEME_EXTR_MAXBYTES, $offset, $next);
if ($part === false || $next <= $offset) {
throw new RuntimeException('Лимит не вмещает следующую графему или текст повреждён');
}
echo '[', $part, ']: ', strlen($part), " байт\n";
$offset = $next;
}
Ожидаемый результат
[A]: 1 байт
[👍🏽]: 8 байт
[BC]: 2 байт
Наш учебный транспорт принимает не больше 8 байт в части. A плюс целый эмодзи уже занимают 9, поэтому первая часть содержит только A. Вторая сохраняет эмодзи с модификатором целиком. next — байтовая позиция следующего чтения, поэтому она согласована со strlen. Проверка продвижения останавливает цикл, если одна графема вообще не помещается. Настоящий лимит сервиса надо читать в его документации: он может считать не байты. Здесь части только подготовлены и показаны; сетевой отправки нет.
Рядом по задаче: grapheme_substr, IntlBreakIterator::createCharacterInstance.
grapheme_levenshteinПредложить похожее название при опечатке, считая изменения видимых символов, а не байтов.
PHP 8.5+ · intl
grapheme_levenshtein(string $string1, string $string2, int $insertion_cost = 1, int $replacement_cost = 1, int $deletion_cost = 1, string $locale = ""): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Единицы | Вход должен быть корректным UTF-8. Графема — пользовательски воспринимаемая единица: e плюс отдельный акцент часто одна графема, хотя кодовых точек две, а байтов три. Правила сегментации зависят от Unicode/ICU. |
| string1,string2 | Два текста UTF-8. Канонически составленные и разложенные варианты одной буквы считаются эквивалентными. |
| insertion_cost,replacement_cost,deletion_cost | Положительные стоимости трёх операций, по умолчанию 1. Неположительное значение вызывает ValueError. Если вставка+удаление дешевле замены, алгоритм выбирает их. |
| locale | Локаль сегментации; неверная локаль/UTF-8 или ошибка ICU дают false. |
| Возврат и скорость | int|false; 0 — равенство в этой модели. Сложность O(m×n) по числу графем. Ограничивайте длину ввода и список кандидатов, не сравнивайте без ограничений все тексты базы с запросом. |
<?php
declare(strict_types=1);
echo grapheme_levenshtein("кот", "кит"), "
";
Ожидаемый результат
1
Одной замены достаточно для превращения слова; это мера похожести, а не понимание смысла.
<?php
declare(strict_types=1);
echo grapheme_levenshtein("é", "e\u{0301}"), "
";
Ожидаемый результат
0
В отличие от байтового levenshtein, различие представления не создаёт ложную опечатку.
<?php
declare(strict_types=1);
$query = 'кафе';
$catalog = ['кофе', 'чай', 'какао'];
$bestName = null;
$bestDistance = 2;
foreach ($catalog as $name) {
$distance = grapheme_levenshtein($query, $name);
if ($distance !== false && $distance < $bestDistance) {
$bestDistance = $distance;
$bestName = $name;
}
}
echo $bestName === null ? 'Подходящих подсказок нет' : 'Возможно, вы искали: '.$bestName, "\n";
Ожидаемый результат
Возможно, вы искали: кофе
Каталог здесь состоит из трёх заранее ограниченных кандидатов. Порог строго меньше 2 допускает не больше одного изменения; кофе отличается от кафе одной заменой. Функция измеряет расстояние, а выбор лучшего кандидата выполняет PHP-цикл. Не заменяйте запрос автоматически: похожее слово может означать другое. Для большой базы сначала отберите небольшую группу кандидатов и ограничьте длину, иначе стоимость O(m×n) каждого сравнения быстро накопится. Метод доступен с PHP 8.5.
Рядом по задаче: Normalizer::normalize, grapheme_strlen.
idn_to_asciiПодготовить международное доменное имя для систем, принимающих ASCII-форму.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
idn_to_ascii(string $domain, int $flags = IDNA_DEFAULT, int $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| domain | Только имя домена, не полный URL, путь, порт или адрес электронной почты. Вход должен быть UTF-8. |
| flags | Битовая комбинация IDNA_* опций, кроме IDNA_ERROR_*. По умолчанию IDNA_DEFAULT; явно выбирайте профиль transitional/nontransitional и STD3 по контракту. |
| variant | В PHP 8.4+ допустим только INTL_IDNA_VARIANT_UTS46; другое значение вызывает ValueError. Старый IDNA 2003 устарел с PHP 7.2, default сменился в 7.4. |
| idna_info | По ссылке массив result, isTransitionalDifferent, errors. result может быть недопустимым частичным результатом; errors — битовая маска IDNA_ERROR_*, не флаги настройки. |
| Возврат | string|false; пустой domain вызывает ValueError с PHP 8.4. Преобразование не доказывает существование DNS, владение доменом, отсутствие фишинга или разрешённость сетевого адреса. |
<?php
declare(strict_types=1);
echo idn_to_ascii("bücher.example"), "
";
Ожидаемый результат
xn--bcher-kva.example
Имя .example используется как учебное; никаких сетевых запросов пример не делает.
<?php
declare(strict_types=1);
$info = [];
$result = idn_to_ascii("example.com", IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46, $info);
echo $result, " / ", $info["errors"], "
";
Ожидаемый результат
example.com / 0
Нулевая маска означает отсутствие ошибок IDNA, а не доверие к удалённому серверу.
<?php
declare(strict_types=1);
$unicode = 'straße.example';
$transitional = idn_to_ascii($unicode, 0, INTL_IDNA_VARIANT_UTS46);
$nontransitional = idn_to_ascii($unicode, IDNA_NONTRANSITIONAL_TO_ASCII, INTL_IDNA_VARIANT_UTS46);
if ($transitional === false || $nontransitional === false) {
echo "Имя домена недопустимо\n";
} else {
echo 'Transitional: ', $transitional, "\n";
echo 'Nontransitional: ', $nontransitional, "\n";
}
Ожидаемый результат
Transitional: strasse.example
Nontransitional: xn--strae-oqa.example
Это разные ASCII-имена, а не два косметических написания одного адреса. Число 0 намеренно воспроизводит старый transitional-режим для разбора миграции; для нового кода выбирают nontransitional. Не подменяйте 0 константой IDNA_DEFAULT: после пересборки с ICU 76+ default уже включает nontransitional-флаги, тогда обе строки совпадут. Режим нужно согласовать с договором интеграции и хранением домена. Подробнее: изменение IDNA default в ICU 76. В примере только вычисляются строки; DNS и сетевого запроса нет. После IDNA отдельно проверяют назначение адреса и права доступа; функция принимает имя домена, не весь URL.
Рядом по задаче: idn_to_utf8, Spoofchecker::isSuspicious.
idn_to_utf8Подготовить международное доменное имя для понятного отображения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
idn_to_utf8(string $domain, int $flags = IDNA_DEFAULT, int $variant = INTL_IDNA_VARIANT_UTS46, &$idna_info = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| domain | Только имя домена, не полный URL, путь, порт или адрес электронной почты. Вход — ASCII-совместимое IDNA имя. |
| flags | Битовая комбинация IDNA_* опций, кроме IDNA_ERROR_*. По умолчанию IDNA_DEFAULT; явно выбирайте профиль transitional/nontransitional и STD3 по контракту. |
| variant | В PHP 8.4+ допустим только INTL_IDNA_VARIANT_UTS46; другое значение вызывает ValueError. Старый IDNA 2003 устарел с PHP 7.2, default сменился в 7.4. |
| idna_info | По ссылке массив result, isTransitionalDifferent, errors. result может быть недопустимым частичным результатом; errors — битовая маска IDNA_ERROR_*, не флаги настройки. |
| Возврат | string|false; пустой domain вызывает ValueError с PHP 8.4. Преобразование не доказывает существование DNS, владение доменом, отсутствие фишинга или разрешённость сетевого адреса. |
<?php
declare(strict_types=1);
echo idn_to_utf8("xn--bcher-kva.example"), "
";
Ожидаемый результат
bücher.example
Имя .example используется как учебное; никаких сетевых запросов пример не делает.
<?php
declare(strict_types=1);
$info = [];
$result = idn_to_utf8("example.com", IDNA_DEFAULT, INTL_IDNA_VARIANT_UTS46, $info);
echo $result, " / ", $info["errors"], "
";
Ожидаемый результат
example.com / 0
Нулевая маска означает отсутствие ошибок IDNA, а не доверие к удалённому серверу.
<?php
declare(strict_types=1);
$host = 'xn--bcher-kva.example';
$label = idn_to_utf8($host, IDNA_NONTRANSITIONAL_TO_UNICODE, INTL_IDNA_VARIANT_UTS46);
if ($label === false) {
echo "Проверьте доменное имя\n";
} else {
echo 'Название: ', $label, "\n";
echo 'Техническое имя: ', $host, "\n";
}
Ожидаемый результат
Название: bücher.example
Техническое имя: xn--bcher-kva.example
В настройках подключения человеку удобно видеть читаемый домен, но техническое ASCII-имя оставлено рядом. Это помогает сопоставить настройки и журнал. Обратное преобразование не доказывает владение доменом и не защищает от визуально похожих букв: такие риски разбирает Spoofchecker и политика продукта.
Рядом по задаче: idn_to_ascii, Spoofchecker::isSuspicious.
IntlDateFormatter::__constructПоказать дату заказа по языку посетителя и в нужном часовом поясе.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::__construct(?string $locale, int $dateType = IntlDateFormatter::FULL, int $timeType = IntlDateFormatter::FULL, IntlTimeZone|DateTimeZone|string|null $timezone = null, $calendar = null, ?string $pattern = null)| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string; null использует intl.default_locale. Неверная locale вызывает ValueError в PHP 8.4+. |
| dateType,timeType | FULL/LONG/MEDIUM/SHORT/NONE и поддержанные относительные стили. С PHP 8.1 оба необязательны, по умолчанию FULL. |
| timezone | ID ICU, явное GMT-смещение, IntlTimeZone, DateTimeZone или null. null использует пояс переданного календаря, иначе date_default_timezone_get; locale не выбирает пояс автоматически. |
| calendar | IntlCalendar, GREGORIAN/TRADITIONAL или null (GREGORIAN). Переданный объект клонируется; исходный календарь не меняется. |
| pattern | ?string — шаблон ICU; при заданном шаблоне он определяет представление. Буквы отличаются от PHP date(): yyyy-MM-dd, не Y-m-d. |
| Возврат | Готовый объект; фабрика — объект|null при ошибке. Календарная система, язык и часовой пояс — три разные настройки. |
Начинаем с задачи и одного вызова
Заказ хранит момент создания, а покупатель хочет видеть понятную дату. Настроим язык, календарь, часовой пояс и вид записи отдельно: эти четыре настройки решают разные задачи.
| Запись в примере | Что именно происходит |
|---|---|
| 1709209800 | Unix timestamp: число секунд от начала 1970 года. Здесь это заранее известный момент заказа, 29.02.2024 12:30 UTC. |
| "en_GB" | Язык и регион представления; не определяют часовой пояс автоматически. |
| NONE, NONE | Отключаем готовые стили, потому что дальше передаём собственный шаблон. |
| "UTC", GREGORIAN | Явно задаём часовой пояс и григорианский календарь. |
| "dd.MM.yyyy HH:mm" | ICU-шаблон: день, месяц, календарный год, часы и минуты. Это не язык PHP date(). |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Заказ создан: ", $formatter->format($createdAt), " UTC
";
Ожидаемый результат
Заказ создан: 29.02.2024 12:30 UTC
Форматтер вернул строку; echo добавил подпись. В базе остаётся исходный момент, чтобы позже показать его в другом поясе.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Order date: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Order date: February 29, 2024
Стиль LONG использует естественную для английского подпись. Для другого языка меняется locale, а не массив переведённых вручную месяцев.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo "Время покупателя: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Время покупателя: 29.02.2024 15:30
Изменились настенные часы, но timestamp заказа остался тем же. Часовой пояс берут из настройки пользователя/заказа, не выводят из языка.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->format(0), "
";
Ожидаемый результат
1970-01-01 00:00
0 — секунды Unix timestamp, а UTC явно устраняет влияние часового пояса компьютера.
<?php
declare(strict_types=1);
$formatter = datefmt_create("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
echo datefmt_format($formatter, 0), "
";
Ожидаемый результат
January 1, 1970
Стиль LONG выбирает языковое представление из ICU; его данные могут обновляться.
Рядом по задаче: IntlDateFormatter::format, IntlDatePatternGenerator::getBestPattern.
IntlDateFormatter::createПоказать дату заказа по языку посетителя и в нужном часовом поясе.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlDateFormatter::create(?string $locale, int $dateType = IntlDateFormatter::FULL, int $timeType = IntlDateFormatter::FULL, IntlTimeZone|DateTimeZone|string|null $timezone = null, IntlCalendar|int|null $calendar = null, ?string $pattern = null): ?IntlDateFormatter| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string; null использует intl.default_locale. Неверная locale вызывает ValueError в PHP 8.4+. |
| dateType,timeType | FULL/LONG/MEDIUM/SHORT/NONE и поддержанные относительные стили. С PHP 8.1 оба необязательны, по умолчанию FULL. |
| timezone | ID ICU, явное GMT-смещение, IntlTimeZone, DateTimeZone или null. null использует пояс переданного календаря, иначе date_default_timezone_get; locale не выбирает пояс автоматически. |
| calendar | IntlCalendar, GREGORIAN/TRADITIONAL или null (GREGORIAN). Переданный объект клонируется; исходный календарь не меняется. |
| pattern | ?string — шаблон ICU; при заданном шаблоне он определяет представление. Буквы отличаются от PHP date(): yyyy-MM-dd, не Y-m-d. |
| Возврат | Готовый объект; фабрика — объект|null при ошибке. Календарная система, язык и часовой пояс — три разные настройки. |
Начинаем с задачи и одного вызова
Заказ хранит момент создания, а покупатель хочет видеть понятную дату. Настроим язык, календарь, часовой пояс и вид записи отдельно: эти четыре настройки решают разные задачи.
| Запись в примере | Что именно происходит |
|---|---|
| 1709209800 | Unix timestamp: число секунд от начала 1970 года. Здесь это заранее известный момент заказа, 29.02.2024 12:30 UTC. |
| "en_GB" | Язык и регион представления; не определяют часовой пояс автоматически. |
| NONE, NONE | Отключаем готовые стили, потому что дальше передаём собственный шаблон. |
| "UTC", GREGORIAN | Явно задаём часовой пояс и григорианский календарь. |
| "dd.MM.yyyy HH:mm" | ICU-шаблон: день, месяц, календарный год, часы и минуты. Это не язык PHP date(). |
<?php
declare(strict_types=1);
$formatter = IntlDateFormatter::create("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Заказ создан: ", $formatter->format($createdAt), " UTC
";
Ожидаемый результат
Заказ создан: 29.02.2024 12:30 UTC
Форматтер вернул строку; echo добавил подпись. В базе остаётся исходный момент, чтобы позже показать его в другом поясе.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Order date: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Order date: February 29, 2024
Стиль LONG использует естественную для английского подпись. Для другого языка меняется locale, а не массив переведённых вручную месяцев.
<?php
declare(strict_types=1);
$formatter = IntlDateFormatter::create("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo "Время покупателя: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Время покупателя: 29.02.2024 15:30
Изменились настенные часы, но timestamp заказа остался тем же. Часовой пояс берут из настройки пользователя/заказа, не выводят из языка.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->format(0), "
";
Ожидаемый результат
1970-01-01 00:00
0 — секунды Unix timestamp, а UTC явно устраняет влияние часового пояса компьютера.
<?php
declare(strict_types=1);
$formatter = datefmt_create("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
echo datefmt_format($formatter, 0), "
";
Ожидаемый результат
January 1, 1970
Стиль LONG выбирает языковое представление из ICU; его данные могут обновляться.
Тот же механизм в процедурной форме: datefmt_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::format, IntlDatePatternGenerator::getBestPattern.
datefmt_createПоказать дату заказа по языку посетителя и в нужном часовом поясе.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_create(?string $locale, int $dateType = IntlDateFormatter::FULL, int $timeType = IntlDateFormatter::FULL, IntlTimeZone|DateTimeZone|string|null $timezone = null, IntlCalendar|int|null $calendar = null, ?string $pattern = null): ?IntlDateFormatterПроцедурная форма IntlDateFormatter::create. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string; null использует intl.default_locale. Неверная locale вызывает ValueError в PHP 8.4+. |
| dateType,timeType | FULL/LONG/MEDIUM/SHORT/NONE и поддержанные относительные стили. С PHP 8.1 оба необязательны, по умолчанию FULL. |
| timezone | ID ICU, явное GMT-смещение, IntlTimeZone, DateTimeZone или null. null использует пояс переданного календаря, иначе date_default_timezone_get; locale не выбирает пояс автоматически. |
| calendar | IntlCalendar, GREGORIAN/TRADITIONAL или null (GREGORIAN). Переданный объект клонируется; исходный календарь не меняется. |
| pattern | ?string — шаблон ICU; при заданном шаблоне он определяет представление. Буквы отличаются от PHP date(): yyyy-MM-dd, не Y-m-d. |
| Возврат | Готовый объект; фабрика — объект|null при ошибке. Календарная система, язык и часовой пояс — три разные настройки. |
Начинаем с задачи и одного вызова
Заказ хранит момент создания, а покупатель хочет видеть понятную дату. Настроим язык, календарь, часовой пояс и вид записи отдельно: эти четыре настройки решают разные задачи.
| Запись в примере | Что именно происходит |
|---|---|
| 1709209800 | Unix timestamp: число секунд от начала 1970 года. Здесь это заранее известный момент заказа, 29.02.2024 12:30 UTC. |
| "en_GB" | Язык и регион представления; не определяют часовой пояс автоматически. |
| NONE, NONE | Отключаем готовые стили, потому что дальше передаём собственный шаблон. |
| "UTC", GREGORIAN | Явно задаём часовой пояс и григорианский календарь. |
| "dd.MM.yyyy HH:mm" | ICU-шаблон: день, месяц, календарный год, часы и минуты. Это не язык PHP date(). |
<?php
declare(strict_types=1);
$formatter = IntlDateFormatter::create("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Заказ создан: ", $formatter->format($createdAt), " UTC
";
Ожидаемый результат
Заказ создан: 29.02.2024 12:30 UTC
Форматтер вернул строку; echo добавил подпись. В базе остаётся исходный момент, чтобы позже показать его в другом поясе.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Order date: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Order date: February 29, 2024
Стиль LONG использует естественную для английского подпись. Для другого языка меняется locale, а не массив переведённых вручную месяцев.
<?php
declare(strict_types=1);
$formatter = IntlDateFormatter::create("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo "Время покупателя: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Время покупателя: 29.02.2024 15:30
Изменились настенные часы, но timestamp заказа остался тем же. Часовой пояс берут из настройки пользователя/заказа, не выводят из языка.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->format(0), "
";
Ожидаемый результат
1970-01-01 00:00
0 — секунды Unix timestamp, а UTC явно устраняет влияние часового пояса компьютера.
<?php
declare(strict_types=1);
$formatter = datefmt_create("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
echo datefmt_format($formatter, 0), "
";
Ожидаемый результат
January 1, 1970
Стиль LONG выбирает языковое представление из ICU; его данные могут обновляться.
Тот же механизм в процедурной форме: datefmt_create. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::format, IntlDatePatternGenerator::getBestPattern.
IntlDateFormatter::formatПреобразовать момент или календарные поля в строку для человека.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::format($datetime): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| datetime | IntlCalendar, DateTimeInterface, число секунд Unix timestamp (возможна дробная часть) или массив структуры localtime. Строковый числовой ввод поддержан сигнатурой, но произвольный текст вроде tomorrow здесь не контракт. |
| Часовой пояс | При передаче DateTime/IntlCalendar используется пояс форматтера, а не объекта! Для пояса самого объекта есть formatObject или явный setTimeZone. |
| Возврат | string|false. IntlCalendar::getTime возвращает миллисекунды; не передавайте их как секунды без деления на 1000. Для машинного API выбирайте согласованный ISO-формат, а не локализованную подпись. |
Начинаем с задачи и одного вызова
Из момента хранения получить надпись на странице заказа. Сначала один вызов, затем разберём типичную ошибку: переданный DateTime имеет свой пояс, но форматтер применяет собственный.
| Запись в примере | Что именно происходит |
|---|---|
| $formatter->format($createdAt) | Метод получает момент в секундах и возвращает строку. |
| DateTimeImmutable | Объект момента и его часового пояса. Вызов format всё равно использует пояс форматтера. |
| Возвращённая строка | Подходит для человека. В API отправляют согласованный машинный формат, а не локализованную подпись. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$label = $formatter->format($createdAt);
echo "Создан: ", $label, "
";
Ожидаемый результат
Создан: 29.02.2024 12:30
Переменная label содержит готовый текст, а createdAt продолжает хранить число момента.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$date = new DateTimeImmutable("2024-02-29 15:30:00", new DateTimeZone("Europe/Moscow"));
echo "Часы объекта: ", $date->format("H:i"), "
";
echo "Подпись в UTC: ", $formatter->format($date), "
";
Ожидаемый результат
Часы объекта: 15:30
Подпись в UTC: 29.02.2024 12:30
Такое расхождение не означает сдвиг самого события. DateTime показывает свои часы, форматтер — часы UTC. Это частая причина вопросов о «неправильной дате».
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->format(3600), "
";
Ожидаемый результат
1970-01-01 01:00
Число 3600 — один час после эпохи, не количество миллисекунд.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$date = new DateTimeImmutable("1970-01-01 03:00:00", new DateTimeZone("+03:00"));
echo datefmt_format($formatter, $date), "
";
Ожидаемый результат
1970-01-01 00:00
Один момент имеет разные настенные часы. Здесь formatter настроен на UTC.
Тот же механизм в процедурной форме: datefmt_format. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::formatObject, IntlCalendar::getTime.
datefmt_formatПреобразовать момент или календарные поля в строку для человека.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_format(IntlDateFormatter $formatter, $datetime): string|falseПроцедурная форма IntlDateFormatter::format. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| datetime | IntlCalendar, DateTimeInterface, число секунд Unix timestamp (возможна дробная часть) или массив структуры localtime. Строковый числовой ввод поддержан сигнатурой, но произвольный текст вроде tomorrow здесь не контракт. |
| Часовой пояс | При передаче DateTime/IntlCalendar используется пояс форматтера, а не объекта! Для пояса самого объекта есть formatObject или явный setTimeZone. |
| Возврат | string|false. IntlCalendar::getTime возвращает миллисекунды; не передавайте их как секунды без деления на 1000. Для машинного API выбирайте согласованный ISO-формат, а не локализованную подпись. |
Начинаем с задачи и одного вызова
Из момента хранения получить надпись на странице заказа. Сначала один вызов, затем разберём типичную ошибку: переданный DateTime имеет свой пояс, но форматтер применяет собственный.
| Запись в примере | Что именно происходит |
|---|---|
| $formatter->format($createdAt) | Метод получает момент в секундах и возвращает строку. |
| DateTimeImmutable | Объект момента и его часового пояса. Вызов format всё равно использует пояс форматтера. |
| Возвращённая строка | Подходит для человека. В API отправляют согласованный машинный формат, а не локализованную подпись. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$label = $formatter->format($createdAt);
echo "Создан: ", $label, "
";
Ожидаемый результат
Создан: 29.02.2024 12:30
Переменная label содержит готовый текст, а createdAt продолжает хранить число момента.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$date = new DateTimeImmutable("2024-02-29 15:30:00", new DateTimeZone("Europe/Moscow"));
echo "Часы объекта: ", $date->format("H:i"), "
";
echo "Подпись в UTC: ", $formatter->format($date), "
";
Ожидаемый результат
Часы объекта: 15:30
Подпись в UTC: 29.02.2024 12:30
Такое расхождение не означает сдвиг самого события. DateTime показывает свои часы, форматтер — часы UTC. Это частая причина вопросов о «неправильной дате».
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->format(3600), "
";
Ожидаемый результат
1970-01-01 01:00
Число 3600 — один час после эпохи, не количество миллисекунд.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$date = new DateTimeImmutable("1970-01-01 03:00:00", new DateTimeZone("+03:00"));
echo datefmt_format($formatter, $date), "
";
Ожидаемый результат
1970-01-01 00:00
Один момент имеет разные настенные часы. Здесь formatter настроен на UTC.
Тот же механизм в процедурной форме: datefmt_format. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::formatObject, IntlCalendar::getTime.
IntlDateFormatter::formatObjectОдин раз отобразить объект даты в его собственном часовом поясе.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlDateFormatter::formatObject($datetime, $format = null, ?string $locale = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| datetime | IntlCalendar или DateTimeInterface. ID пояса должен поддерживаться ICU: используются данные ICU, а не непосредственно база часовых поясов PHP. |
| format | null — default; int — общий стиль даты и времени; массив [dateStyle,timeStyle]; string — шаблон ICU. |
| locale | ?string: явная локаль либо default. |
| Возврат | string|false. В отличие от format у ранее созданного форматтера, временный форматтер берёт пояс из объекта. |
Начинаем с задачи и одного вызова
Есть готовый объект даты покупателя. Нужно один раз показать его в собственном поясе, не создавая отдельный форматтер с риском выбрать другой пояс.
| Запись в примере | Что именно происходит |
|---|---|
| $date | Объект DateTimeInterface либо IntlCalendar; из него берутся момент и пояс. |
| "dd.MM.yyyy HH:mm" | Шаблон ICU, а не PHP date. |
| [LONG, NONE] | Альтернативная форма аргумента format: два стиля, дата и время. |
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("2024-02-29 15:30:00", new DateTimeZone("Europe/Moscow"));
echo "Встреча: ", IntlDateFormatter::formatObject($date, "dd.MM.yyyy HH:mm", "ru_RU"), "
";
Ожидаемый результат
Встреча: 29.02.2024 15:30
Пояс взят из date. В отличие от вызова format у существующего форматтера здесь нет отдельной ранее выбранной зоны.
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("2024-02-29 15:30:00", new DateTimeZone("Europe/Moscow"));
$label = IntlDateFormatter::formatObject($date, [IntlDateFormatter::LONG, IntlDateFormatter::NONE], "en_US");
echo "Appointment date: ", $label, "
";
Ожидаемый результат
Appointment date: February 29, 2024
Отдельная подпись для письма использует тот же момент и пояс, но английские названия. Сам объект не изменяется.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("1970-01-01 03:00:00", new DateTimeZone("GMT+03:00"));
echo IntlDateFormatter::formatObject($date, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
1970-01-01 03:00
Показаны именно часы объекта, потому что пояс взят из него.
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("1970-01-01", new DateTimeZone("UTC"));
echo datefmt_format_object($date, [IntlDateFormatter::LONG, IntlDateFormatter::NONE], "en_US"), "
";
Ожидаемый результат
January 1, 1970
Массив из двух стилей не является массивом календарных полей: здесь это настройки вывода.
Тот же механизм в процедурной форме: datefmt_format_object. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::format.
datefmt_format_objectОдин раз отобразить объект даты в его собственном часовом поясе.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_format_object($datetime, $format = null, ?string $locale = null): string|falseПроцедурная форма IntlDateFormatter::formatObject. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| datetime | IntlCalendar или DateTimeInterface. ID пояса должен поддерживаться ICU: используются данные ICU, а не непосредственно база часовых поясов PHP. |
| format | null — default; int — общий стиль даты и времени; массив [dateStyle,timeStyle]; string — шаблон ICU. |
| locale | ?string: явная локаль либо default. |
| Возврат | string|false. В отличие от format у ранее созданного форматтера, временный форматтер берёт пояс из объекта. |
Начинаем с задачи и одного вызова
Есть готовый объект даты покупателя. Нужно один раз показать его в собственном поясе, не создавая отдельный форматтер с риском выбрать другой пояс.
| Запись в примере | Что именно происходит |
|---|---|
| $date | Объект DateTimeInterface либо IntlCalendar; из него берутся момент и пояс. |
| "dd.MM.yyyy HH:mm" | Шаблон ICU, а не PHP date. |
| [LONG, NONE] | Альтернативная форма аргумента format: два стиля, дата и время. |
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("2024-02-29 15:30:00", new DateTimeZone("Europe/Moscow"));
echo "Встреча: ", IntlDateFormatter::formatObject($date, "dd.MM.yyyy HH:mm", "ru_RU"), "
";
Ожидаемый результат
Встреча: 29.02.2024 15:30
Пояс взят из date. В отличие от вызова format у существующего форматтера здесь нет отдельной ранее выбранной зоны.
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("2024-02-29 15:30:00", new DateTimeZone("Europe/Moscow"));
$label = IntlDateFormatter::formatObject($date, [IntlDateFormatter::LONG, IntlDateFormatter::NONE], "en_US");
echo "Appointment date: ", $label, "
";
Ожидаемый результат
Appointment date: February 29, 2024
Отдельная подпись для письма использует тот же момент и пояс, но английские названия. Сам объект не изменяется.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("1970-01-01 03:00:00", new DateTimeZone("GMT+03:00"));
echo IntlDateFormatter::formatObject($date, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
1970-01-01 03:00
Показаны именно часы объекта, потому что пояс взят из него.
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("1970-01-01", new DateTimeZone("UTC"));
echo datefmt_format_object($date, [IntlDateFormatter::LONG, IntlDateFormatter::NONE], "en_US"), "
";
Ожидаемый результат
January 1, 1970
Массив из двух стилей не является массивом календарных полей: здесь это настройки вывода.
Тот же механизм в процедурной форме: datefmt_format_object. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::format.
IntlDateFormatter::getDateTypeПрочитать выбранный стиль даты при диагностике форматтера.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getDateType(): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int из констант стилей либо false. NONE = -1 допустим; при шаблонном формате может использоваться PATTERN. Это не извлечение дня/часа из даты. |
| Применение | Стиль выбирается при создании; конкретное содержимое шаблона читается getPattern. Не судите о точном выводе только по названию стиля. |
Начинаем с задачи и одного вызова
Настраиваемый виджет показывает дату и время. Getter нужен, чтобы узнать выбранный стиль даты и сопоставить его с результатом, а не извлечь день или часы.
| Запись в примере | Что именно происходит |
|---|---|
| getDateType()/getTimeType() | Возвращает константу настройки, не часть конкретной даты. |
| LONG / SHORT / NONE | Именованные варианты оформления. NONE означает намеренно скрытую часть. |
| getPattern() | Если нужно узнать точную грамматику полей, используйте отдельный getter шаблона. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::LONG, IntlDateFormatter::SHORT, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getDateType() === IntlDateFormatter::LONG ? "Выбран стиль LONG.
" : "Другой стиль.
";
echo "Событие: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Выбран стиль LONG.
Событие: 29 February 2024 at 12:30
Человек видит конкретную подпись, а разработчик может объяснить, почему выбран именно такой объём даты/времени.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::SHORT, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getDateType() === IntlDateFormatter::NONE ? "Компонент скрыт.
" : "Компонент виден.
";
echo "Подпись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Компонент скрыт.
Подпись: 12:30
NONE — нормальная настройка. Виджет времени не обязан выводить год, а историческая дата не обязана показывать часы.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::SHORT, "UTC");
var_dump($formatter->getDateType() === IntlDateFormatter::LONG);
Ожидаемый результат
bool(true)
Выбранное значение сравнивается с именованной константой, не магическим числом.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC");
var_dump($formatter->getDateType() === IntlDateFormatter::NONE);
Ожидаемый результат
bool(true)
NONE не означает ошибку: компонент намеренно отсутствует.
Тот же механизм в процедурной форме: datefmt_get_datetype. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getPattern.
datefmt_get_datetypeПрочитать выбранный стиль даты при диагностике форматтера.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_datetype(IntlDateFormatter $formatter): int|falseПроцедурная форма IntlDateFormatter::getDateType. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int из констант стилей либо false. NONE = -1 допустим; при шаблонном формате может использоваться PATTERN. Это не извлечение дня/часа из даты. |
| Применение | Стиль выбирается при создании; конкретное содержимое шаблона читается getPattern. Не судите о точном выводе только по названию стиля. |
Начинаем с задачи и одного вызова
Настраиваемый виджет показывает дату и время. Getter нужен, чтобы узнать выбранный стиль даты и сопоставить его с результатом, а не извлечь день или часы.
| Запись в примере | Что именно происходит |
|---|---|
| getDateType()/getTimeType() | Возвращает константу настройки, не часть конкретной даты. |
| LONG / SHORT / NONE | Именованные варианты оформления. NONE означает намеренно скрытую часть. |
| getPattern() | Если нужно узнать точную грамматику полей, используйте отдельный getter шаблона. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::LONG, IntlDateFormatter::SHORT, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getDateType() === IntlDateFormatter::LONG ? "Выбран стиль LONG.
" : "Другой стиль.
";
echo "Событие: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Выбран стиль LONG.
Событие: 29 February 2024 at 12:30
Человек видит конкретную подпись, а разработчик может объяснить, почему выбран именно такой объём даты/времени.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::SHORT, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getDateType() === IntlDateFormatter::NONE ? "Компонент скрыт.
" : "Компонент виден.
";
echo "Подпись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Компонент скрыт.
Подпись: 12:30
NONE — нормальная настройка. Виджет времени не обязан выводить год, а историческая дата не обязана показывать часы.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::SHORT, "UTC");
var_dump($formatter->getDateType() === IntlDateFormatter::LONG);
Ожидаемый результат
bool(true)
Выбранное значение сравнивается с именованной константой, не магическим числом.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC");
var_dump($formatter->getDateType() === IntlDateFormatter::NONE);
Ожидаемый результат
bool(true)
NONE не означает ошибку: компонент намеренно отсутствует.
Тот же механизм в процедурной форме: datefmt_get_datetype. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getPattern.
IntlDateFormatter::getTimeTypeПрочитать выбранный стиль времени при диагностике форматтера.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getTimeType(): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int из констант стилей либо false. NONE = -1 допустим; при шаблонном формате может использоваться PATTERN. Это не извлечение дня/часа из даты. |
| Применение | Стиль выбирается при создании; конкретное содержимое шаблона читается getPattern. Не судите о точном выводе только по названию стиля. |
Начинаем с задачи и одного вызова
Настраиваемый виджет показывает дату и время. Getter нужен, чтобы узнать выбранный стиль времени и сопоставить его с результатом, а не извлечь день или часы.
| Запись в примере | Что именно происходит |
|---|---|
| getDateType()/getTimeType() | Возвращает константу настройки, не часть конкретной даты. |
| LONG / SHORT / NONE | Именованные варианты оформления. NONE означает намеренно скрытую часть. |
| getPattern() | Если нужно узнать точную грамматику полей, используйте отдельный getter шаблона. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::LONG, IntlDateFormatter::SHORT, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeType() === IntlDateFormatter::SHORT ? "Выбран стиль SHORT.
" : "Другой стиль.
";
echo "Событие: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Выбран стиль SHORT.
Событие: 29 February 2024 at 12:30
Человек видит конкретную подпись, а разработчик может объяснить, почему выбран именно такой объём даты/времени.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeType() === IntlDateFormatter::NONE ? "Компонент скрыт.
" : "Компонент виден.
";
echo "Подпись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Компонент скрыт.
Подпись: 29 February 2024
NONE — нормальная настройка. Виджет времени не обязан выводить год, а историческая дата не обязана показывать часы.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::SHORT, "UTC");
var_dump($formatter->getTimeType() === IntlDateFormatter::SHORT);
Ожидаемый результат
bool(true)
Выбранное значение сравнивается с именованной константой, не магическим числом.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC");
var_dump($formatter->getTimeType() === IntlDateFormatter::NONE);
Ожидаемый результат
bool(true)
NONE не означает ошибку: компонент намеренно отсутствует.
Тот же механизм в процедурной форме: datefmt_get_timetype. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getPattern.
datefmt_get_timetypeПрочитать выбранный стиль времени при диагностике форматтера.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_timetype(IntlDateFormatter $formatter): int|falseПроцедурная форма IntlDateFormatter::getTimeType. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int из констант стилей либо false. NONE = -1 допустим; при шаблонном формате может использоваться PATTERN. Это не извлечение дня/часа из даты. |
| Применение | Стиль выбирается при создании; конкретное содержимое шаблона читается getPattern. Не судите о точном выводе только по названию стиля. |
Начинаем с задачи и одного вызова
Настраиваемый виджет показывает дату и время. Getter нужен, чтобы узнать выбранный стиль времени и сопоставить его с результатом, а не извлечь день или часы.
| Запись в примере | Что именно происходит |
|---|---|
| getDateType()/getTimeType() | Возвращает константу настройки, не часть конкретной даты. |
| LONG / SHORT / NONE | Именованные варианты оформления. NONE означает намеренно скрытую часть. |
| getPattern() | Если нужно узнать точную грамматику полей, используйте отдельный getter шаблона. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::LONG, IntlDateFormatter::SHORT, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeType() === IntlDateFormatter::SHORT ? "Выбран стиль SHORT.
" : "Другой стиль.
";
echo "Событие: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Выбран стиль SHORT.
Событие: 29 February 2024 at 12:30
Человек видит конкретную подпись, а разработчик может объяснить, почему выбран именно такой объём даты/времени.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeType() === IntlDateFormatter::NONE ? "Компонент скрыт.
" : "Компонент виден.
";
echo "Подпись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Компонент скрыт.
Подпись: 29 February 2024
NONE — нормальная настройка. Виджет времени не обязан выводить год, а историческая дата не обязана показывать часы.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::SHORT, "UTC");
var_dump($formatter->getTimeType() === IntlDateFormatter::SHORT);
Ожидаемый результат
bool(true)
Выбранное значение сравнивается с именованной константой, не магическим числом.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC");
var_dump($formatter->getTimeType() === IntlDateFormatter::NONE);
Ожидаемый результат
bool(true)
NONE не означает ошибку: компонент намеренно отсутствует.
Тот же механизм в процедурной форме: datefmt_get_timetype. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getPattern.
IntlDateFormatter::getCalendarУзнать выбранный общий режим календаря форматтера.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getCalendar(): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false: GREGORIAN или TRADITIONAL. Для конкретного типа вроде buddhist/persian получите объект через getCalendarObject и вызовите getType. |
| Разница | Календарь переводит момент в год/месяц/день своей системы. Часовой пояс отдельно определяет местное время. |
Начинаем с задачи и одного вызова
Календарь определяет, как одному моменту соответствуют год, месяц и день. Это понадобится международному приложению: буддийский календарь показывает другой номер года, хотя событие остаётся тем же.
| Запись в примере | Что именно происходит |
|---|---|
| GREGORIAN / TRADITIONAL | Общий режим: григорианская система либо традиционная для locale. |
| getCalendarObject() | Даёт копию внутреннего календаря, у которой можно прочитать конкретный тип. Случайное время этой копии не равно последнему format. |
| setCalendar($calendar) | Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Система: ", $formatter->getCalendarObject()->getType(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Система: gregorian
Дата заказа: 29.02.2024 12:30
getType называет календарную систему. Это не язык текста и не часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US@calendar=buddhist", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::TRADITIONAL, "yyyy-MM-dd");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Традиционная запись: ", $formatter->format($createdAt), "
";
$formatter->setCalendar(IntlDateFormatter::GREGORIAN);
echo "Григорианская запись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Традиционная запись: 2567-02-29
Григорианская запись: 2024-02-29
Смена системы не добавила 543 года жизни заказу: по-разному названы поля одного момента. В контракте интеграции календарь должен быть однозначным.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump($formatter->getCalendar() === IntlDateFormatter::GREGORIAN);
Ожидаемый результат
bool(true)
Сравниваем режим с понятным именем.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump(datefmt_get_calendar($formatter) === IntlDateFormatter::GREGORIAN);
Ожидаемый результат
bool(true)
Алиас требует форматтер первым аргументом.
Тот же механизм в процедурной форме: datefmt_get_calendar. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getCalendarObject, IntlDateFormatter::setCalendar.
datefmt_get_calendarУзнать выбранный общий режим календаря форматтера.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_calendar(IntlDateFormatter $formatter): int|falseПроцедурная форма IntlDateFormatter::getCalendar. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false: GREGORIAN или TRADITIONAL. Для конкретного типа вроде buddhist/persian получите объект через getCalendarObject и вызовите getType. |
| Разница | Календарь переводит момент в год/месяц/день своей системы. Часовой пояс отдельно определяет местное время. |
Начинаем с задачи и одного вызова
Календарь определяет, как одному моменту соответствуют год, месяц и день. Это понадобится международному приложению: буддийский календарь показывает другой номер года, хотя событие остаётся тем же.
| Запись в примере | Что именно происходит |
|---|---|
| GREGORIAN / TRADITIONAL | Общий режим: григорианская система либо традиционная для locale. |
| getCalendarObject() | Даёт копию внутреннего календаря, у которой можно прочитать конкретный тип. Случайное время этой копии не равно последнему format. |
| setCalendar($calendar) | Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Система: ", $formatter->getCalendarObject()->getType(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Система: gregorian
Дата заказа: 29.02.2024 12:30
getType называет календарную систему. Это не язык текста и не часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US@calendar=buddhist", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::TRADITIONAL, "yyyy-MM-dd");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Традиционная запись: ", $formatter->format($createdAt), "
";
$formatter->setCalendar(IntlDateFormatter::GREGORIAN);
echo "Григорианская запись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Традиционная запись: 2567-02-29
Григорианская запись: 2024-02-29
Смена системы не добавила 543 года жизни заказу: по-разному названы поля одного момента. В контракте интеграции календарь должен быть однозначным.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump($formatter->getCalendar() === IntlDateFormatter::GREGORIAN);
Ожидаемый результат
bool(true)
Сравниваем режим с понятным именем.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump(datefmt_get_calendar($formatter) === IntlDateFormatter::GREGORIAN);
Ожидаемый результат
bool(true)
Алиас требует форматтер первым аргументом.
Тот же механизм в процедурной форме: datefmt_get_calendar. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getCalendarObject, IntlDateFormatter::setCalendar.
IntlDateFormatter::getCalendarObjectПолучить копию внутреннего календаря, чтобы узнать его тип и пояс.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getCalendarObject(): IntlCalendar|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | IntlCalendar, null если не установлен, false при ошибке. Тип и пояс соответствуют форматтеру, но момент времени копии не определён контрактом. |
| Копия | Изменение полученного календаря не настраивает сам форматтер. Для этого нужен setCalendar; не используйте случайное время копии как дату последнего format. |
Начинаем с задачи и одного вызова
Календарь определяет, как одному моменту соответствуют год, месяц и день. Это понадобится международному приложению: буддийский календарь показывает другой номер года, хотя событие остаётся тем же.
| Запись в примере | Что именно происходит |
|---|---|
| GREGORIAN / TRADITIONAL | Общий режим: григорианская система либо традиционная для locale. |
| getCalendarObject() | Даёт копию внутреннего календаря, у которой можно прочитать конкретный тип. Случайное время этой копии не равно последнему format. |
| setCalendar($calendar) | Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Система: ", $formatter->getCalendarObject()->getType(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Система: gregorian
Дата заказа: 29.02.2024 12:30
getType называет календарную систему. Это не язык текста и не часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US@calendar=buddhist", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::TRADITIONAL, "yyyy-MM-dd");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Традиционная запись: ", $formatter->format($createdAt), "
";
$formatter->setCalendar(IntlDateFormatter::GREGORIAN);
echo "Григорианская запись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Традиционная запись: 2567-02-29
Григорианская запись: 2024-02-29
Смена системы не добавила 543 года жизни заказу: по-разному названы поля одного момента. В контракте интеграции календарь должен быть однозначным.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$calendar = $formatter->getCalendarObject();
echo $calendar->getType(), "
";
Ожидаемый результат
gregorian
Сначала проверяйте объект в прикладном коде, если создание форматтера не гарантировано.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$calendar = datefmt_get_calendar_object($formatter);
$calendar->setTimeZone("GMT+03:00");
echo $formatter->getTimeZoneId(), "
";
Ожидаемый результат
UTC
Это самостоятельная копия, а не ссылка на скрытое изменяемое состояние форматтера.
Тот же механизм в процедурной форме: datefmt_get_calendar_object. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::setCalendar.
datefmt_get_calendar_objectПолучить копию внутреннего календаря, чтобы узнать его тип и пояс.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_calendar_object(IntlDateFormatter $formatter): IntlCalendar|false|nullПроцедурная форма IntlDateFormatter::getCalendarObject. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | IntlCalendar, null если не установлен, false при ошибке. Тип и пояс соответствуют форматтеру, но момент времени копии не определён контрактом. |
| Копия | Изменение полученного календаря не настраивает сам форматтер. Для этого нужен setCalendar; не используйте случайное время копии как дату последнего format. |
Начинаем с задачи и одного вызова
Календарь определяет, как одному моменту соответствуют год, месяц и день. Это понадобится международному приложению: буддийский календарь показывает другой номер года, хотя событие остаётся тем же.
| Запись в примере | Что именно происходит |
|---|---|
| GREGORIAN / TRADITIONAL | Общий режим: григорианская система либо традиционная для locale. |
| getCalendarObject() | Даёт копию внутреннего календаря, у которой можно прочитать конкретный тип. Случайное время этой копии не равно последнему format. |
| setCalendar($calendar) | Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Система: ", $formatter->getCalendarObject()->getType(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Система: gregorian
Дата заказа: 29.02.2024 12:30
getType называет календарную систему. Это не язык текста и не часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US@calendar=buddhist", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::TRADITIONAL, "yyyy-MM-dd");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Традиционная запись: ", $formatter->format($createdAt), "
";
$formatter->setCalendar(IntlDateFormatter::GREGORIAN);
echo "Григорианская запись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Традиционная запись: 2567-02-29
Григорианская запись: 2024-02-29
Смена системы не добавила 543 года жизни заказу: по-разному названы поля одного момента. В контракте интеграции календарь должен быть однозначным.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$calendar = $formatter->getCalendarObject();
echo $calendar->getType(), "
";
Ожидаемый результат
gregorian
Сначала проверяйте объект в прикладном коде, если создание форматтера не гарантировано.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$calendar = datefmt_get_calendar_object($formatter);
$calendar->setTimeZone("GMT+03:00");
echo $formatter->getTimeZoneId(), "
";
Ожидаемый результат
UTC
Это самостоятельная копия, а не ссылка на скрытое изменяемое состояние форматтера.
Тот же механизм в процедурной форме: datefmt_get_calendar_object. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::setCalendar.
IntlDateFormatter::setCalendarПереключить календарную систему или передать заранее настроенный календарь.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::setCalendar(IntlCalendar|int|null $calendar): bool| Аргумент или результат | Что означает на практике |
|---|---|
| calendar | IntlCalendar, GREGORIAN/TRADITIONAL, либо null (GREGORIAN). Объект клонируется. |
| Часовой пояс | Если передаёте объект, форматтер получает и его пояс. Если передаёте константу/null, прежний пояс форматтера сохраняется. |
| Возврат | bool. После смены календаря тот же timestamp может показывать другой год/месяц; не принимайте это за изменение самого момента. |
Начинаем с задачи и одного вызова
Календарь определяет, как одному моменту соответствуют год, месяц и день. Это понадобится международному приложению: буддийский календарь показывает другой номер года, хотя событие остаётся тем же.
| Запись в примере | Что именно происходит |
|---|---|
| GREGORIAN / TRADITIONAL | Общий режим: григорианская система либо традиционная для locale. |
| getCalendarObject() | Даёт копию внутреннего календаря, у которой можно прочитать конкретный тип. Случайное время этой копии не равно последнему format. |
| setCalendar($calendar) | Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Система: ", $formatter->getCalendarObject()->getType(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Система: gregorian
Дата заказа: 29.02.2024 12:30
getType называет календарную систему. Это не язык текста и не часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US@calendar=buddhist", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::TRADITIONAL, "yyyy-MM-dd");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Традиционная запись: ", $formatter->format($createdAt), "
";
$formatter->setCalendar(IntlDateFormatter::GREGORIAN);
echo "Григорианская запись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Традиционная запись: 2567-02-29
Григорианская запись: 2024-02-29
Смена системы не добавила 543 года жизни заказу: по-разному названы поля одного момента. В контракте интеграции календарь должен быть однозначным.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump($formatter->setCalendar(IntlDateFormatter::GREGORIAN));
Ожидаемый результат
bool(true)
Система календаря выбирается отдельной операцией.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$calendar = IntlCalendar::createInstance("GMT+03:00", "en_US");
datefmt_set_calendar($formatter, $calendar);
echo $formatter->format(0), "
";
Ожидаемый результат
1970-01-01 03:00
Этот побочный эффект настройки документирован: передача объекта меняет и пояс.
Тот же механизм в процедурной форме: datefmt_set_calendar. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getCalendarObject, IntlDateFormatter::setTimeZone.
datefmt_set_calendarПереключить календарную систему или передать заранее настроенный календарь.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_set_calendar(IntlDateFormatter $formatter, IntlCalendar|int|null $calendar): boolПроцедурная форма IntlDateFormatter::setCalendar. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| calendar | IntlCalendar, GREGORIAN/TRADITIONAL, либо null (GREGORIAN). Объект клонируется. |
| Часовой пояс | Если передаёте объект, форматтер получает и его пояс. Если передаёте константу/null, прежний пояс форматтера сохраняется. |
| Возврат | bool. После смены календаря тот же timestamp может показывать другой год/месяц; не принимайте это за изменение самого момента. |
Начинаем с задачи и одного вызова
Календарь определяет, как одному моменту соответствуют год, месяц и день. Это понадобится международному приложению: буддийский календарь показывает другой номер года, хотя событие остаётся тем же.
| Запись в примере | Что именно происходит |
|---|---|
| GREGORIAN / TRADITIONAL | Общий режим: григорианская система либо традиционная для locale. |
| getCalendarObject() | Даёт копию внутреннего календаря, у которой можно прочитать конкретный тип. Случайное время этой копии не равно последнему format. |
| setCalendar($calendar) | Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Система: ", $formatter->getCalendarObject()->getType(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Система: gregorian
Дата заказа: 29.02.2024 12:30
getType называет календарную систему. Это не язык текста и не часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US@calendar=buddhist", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::TRADITIONAL, "yyyy-MM-dd");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Традиционная запись: ", $formatter->format($createdAt), "
";
$formatter->setCalendar(IntlDateFormatter::GREGORIAN);
echo "Григорианская запись: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Традиционная запись: 2567-02-29
Григорианская запись: 2024-02-29
Смена системы не добавила 543 года жизни заказу: по-разному названы поля одного момента. В контракте интеграции календарь должен быть однозначным.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump($formatter->setCalendar(IntlDateFormatter::GREGORIAN));
Ожидаемый результат
bool(true)
Система календаря выбирается отдельной операцией.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$calendar = IntlCalendar::createInstance("GMT+03:00", "en_US");
datefmt_set_calendar($formatter, $calendar);
echo $formatter->format(0), "
";
Ожидаемый результат
1970-01-01 03:00
Этот побочный эффект настройки документирован: передача объекта меняет и пояс.
Тот же механизм в процедурной форме: datefmt_set_calendar. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getCalendarObject, IntlDateFormatter::setTimeZone.
IntlDateFormatter::getTimeZoneУзнать пояс, в котором форматтер показывает переданные моменты.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getTimeZone(): IntlTimeZone|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | IntlTimeZone|false. |
| Почему это нужно | Если посетитель видит часы со сдвигом, сравните пояс форматтера с ожидаемым. Пояс DateTime, переданного в format, не переопределяет эту настройку. |
Начинаем с задачи и одного вызова
Заказ создан в 12:30 UTC, покупатель в Москве ожидает 15:30. Getter помогает диагностике, setter меняет только представление момента в нужной зоне.
| Запись в примере | Что именно происходит |
|---|---|
| "Europe/Moscow" | Полный идентификатор зоны, включающий исторические правила. Сокращения вроде CST неоднозначны. |
| getTimeZoneId() | Возвращает строку ID. getTimeZone() возвращает объект, у которого есть getID и операции смещений. |
| setTimeZone(...) | Меняет настройку форматтера. Хранимый Unix timestamp не меняется. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeZone()->getID(), ": ", $formatter->format($createdAt), "
";
Ожидаемый результат
UTC: 29.02.2024 12:30
Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo $formatter->getTimeZone()->getID(), ": ", $formatter->format($createdAt), "
";
echo "Момент хранения: ", $createdAt, "
";
Ожидаемый результат
Europe/Moscow: 29.02.2024 15:30
Момент хранения: 1709209800
Один момент остаётся числом 1709209800. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC
Locale en_US не означает американский часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setTimeZone("GMT+03:00");
echo $formatter->getTimeZone()->getID(), "
";
Ожидаемый результат
GMT+03:00
Фиксированное смещение не содержит сезонных правил; для города нужен региональный IANA ID.
Тот же механизм в процедурной форме: datefmt_get_timezone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::setTimeZone, IntlTimeZone::getOffset.
datefmt_get_timezoneУзнать пояс, в котором форматтер показывает переданные моменты.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_timezone(IntlDateFormatter $formatter): IntlTimeZone|falseПроцедурная форма IntlDateFormatter::getTimeZone. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | IntlTimeZone|false. |
| Почему это нужно | Если посетитель видит часы со сдвигом, сравните пояс форматтера с ожидаемым. Пояс DateTime, переданного в format, не переопределяет эту настройку. |
Начинаем с задачи и одного вызова
Заказ создан в 12:30 UTC, покупатель в Москве ожидает 15:30. Getter помогает диагностике, setter меняет только представление момента в нужной зоне.
| Запись в примере | Что именно происходит |
|---|---|
| "Europe/Moscow" | Полный идентификатор зоны, включающий исторические правила. Сокращения вроде CST неоднозначны. |
| getTimeZoneId() | Возвращает строку ID. getTimeZone() возвращает объект, у которого есть getID и операции смещений. |
| setTimeZone(...) | Меняет настройку форматтера. Хранимый Unix timestamp не меняется. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeZone()->getID(), ": ", $formatter->format($createdAt), "
";
Ожидаемый результат
UTC: 29.02.2024 12:30
Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo $formatter->getTimeZone()->getID(), ": ", $formatter->format($createdAt), "
";
echo "Момент хранения: ", $createdAt, "
";
Ожидаемый результат
Europe/Moscow: 29.02.2024 15:30
Момент хранения: 1709209800
Один момент остаётся числом 1709209800. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC
Locale en_US не означает американский часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setTimeZone("GMT+03:00");
echo $formatter->getTimeZone()->getID(), "
";
Ожидаемый результат
GMT+03:00
Фиксированное смещение не содержит сезонных правил; для города нужен региональный IANA ID.
Тот же механизм в процедурной форме: datefmt_get_timezone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::setTimeZone, IntlTimeZone::getOffset.
IntlDateFormatter::getTimeZoneIdУзнать пояс, в котором форматтер показывает переданные моменты.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getTimeZoneId(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string|false: идентификатор пояса. |
| Почему это нужно | Если посетитель видит часы со сдвигом, сравните пояс форматтера с ожидаемым. Пояс DateTime, переданного в format, не переопределяет эту настройку. |
Начинаем с задачи и одного вызова
Заказ создан в 12:30 UTC, покупатель в Москве ожидает 15:30. Getter помогает диагностике, setter меняет только представление момента в нужной зоне.
| Запись в примере | Что именно происходит |
|---|---|
| "Europe/Moscow" | Полный идентификатор зоны, включающий исторические правила. Сокращения вроде CST неоднозначны. |
| getTimeZoneId() | Возвращает строку ID. getTimeZone() возвращает объект, у которого есть getID и операции смещений. |
| setTimeZone(...) | Меняет настройку форматтера. Хранимый Unix timestamp не меняется. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeZoneId(), ": ", $formatter->format($createdAt), "
";
Ожидаемый результат
UTC: 29.02.2024 12:30
Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo $formatter->getTimeZoneId(), ": ", $formatter->format($createdAt), "
";
echo "Момент хранения: ", $createdAt, "
";
Ожидаемый результат
Europe/Moscow: 29.02.2024 15:30
Момент хранения: 1709209800
Один момент остаётся числом 1709209800. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->getTimeZoneId(), "
";
Ожидаемый результат
UTC
Locale en_US не означает американский часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setTimeZone("GMT+03:00");
echo $formatter->getTimeZoneId(), "
";
Ожидаемый результат
GMT+03:00
Фиксированное смещение не содержит сезонных правил; для города нужен региональный IANA ID.
Тот же механизм в процедурной форме: datefmt_get_timezone_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::setTimeZone, IntlTimeZone::getOffset.
datefmt_get_timezone_idУзнать пояс, в котором форматтер показывает переданные моменты.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_timezone_id(IntlDateFormatter $formatter): string|falseПроцедурная форма IntlDateFormatter::getTimeZoneId. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string|false: идентификатор пояса. |
| Почему это нужно | Если посетитель видит часы со сдвигом, сравните пояс форматтера с ожидаемым. Пояс DateTime, переданного в format, не переопределяет эту настройку. |
Начинаем с задачи и одного вызова
Заказ создан в 12:30 UTC, покупатель в Москве ожидает 15:30. Getter помогает диагностике, setter меняет только представление момента в нужной зоне.
| Запись в примере | Что именно происходит |
|---|---|
| "Europe/Moscow" | Полный идентификатор зоны, включающий исторические правила. Сокращения вроде CST неоднозначны. |
| getTimeZoneId() | Возвращает строку ID. getTimeZone() возвращает объект, у которого есть getID и операции смещений. |
| setTimeZone(...) | Меняет настройку форматтера. Хранимый Unix timestamp не меняется. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeZoneId(), ": ", $formatter->format($createdAt), "
";
Ожидаемый результат
UTC: 29.02.2024 12:30
Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo $formatter->getTimeZoneId(), ": ", $formatter->format($createdAt), "
";
echo "Момент хранения: ", $createdAt, "
";
Ожидаемый результат
Europe/Moscow: 29.02.2024 15:30
Момент хранения: 1709209800
Один момент остаётся числом 1709209800. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->getTimeZoneId(), "
";
Ожидаемый результат
UTC
Locale en_US не означает американский часовой пояс.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setTimeZone("GMT+03:00");
echo $formatter->getTimeZoneId(), "
";
Ожидаемый результат
GMT+03:00
Фиксированное смещение не содержит сезонных правил; для города нужен региональный IANA ID.
Тот же механизм в процедурной форме: datefmt_get_timezone_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::setTimeZone, IntlTimeZone::getOffset.
IntlDateFormatter::setTimeZoneПоказать тот же момент в часовом поясе получателя отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): bool| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | IntlTimeZone, DateTimeZone, строковый ICU ID или GMT-смещение. null использует date_default_timezone_get, не locale. |
| Базы данных | DateTimeZone преобразуется по его ID в объект ICU. Расхождения версий баз PHP/ICU могут влиять на исторические и будущие переходы. |
| Возврат | bool: с PHP 8.3 успех true; ранее успешный вызов возвращал null. |
Начинаем с задачи и одного вызова
Заказ создан в 12:30 UTC, покупатель в Москве ожидает 15:30. Getter помогает диагностике, setter меняет только представление момента в нужной зоне.
| Запись в примере | Что именно происходит |
|---|---|
| "Europe/Moscow" | Полный идентификатор зоны, включающий исторические правила. Сокращения вроде CST неоднозначны. |
| getTimeZoneId() | Возвращает строку ID. getTimeZone() возвращает объект, у которого есть getID и операции смещений. |
| setTimeZone(...) | Меняет настройку форматтера. Хранимый Unix timestamp не меняется. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeZoneId(), ": ", $formatter->format($createdAt), "
";
Ожидаемый результат
UTC: 29.02.2024 12:30
Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo $formatter->getTimeZoneId(), ": ", $formatter->format($createdAt), "
";
echo "Момент хранения: ", $createdAt, "
";
Ожидаемый результат
Europe/Moscow: 29.02.2024 15:30
Момент хранения: 1709209800
Один момент остаётся числом 1709209800. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setTimeZone("GMT+03:00");
echo $formatter->format(0), "
";
Ожидаемый результат
1970-01-01 03:00
Момент 0 не изменился; изменилось его местное представление.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump(datefmt_set_timezone($formatter, new DateTimeZone("UTC")));
echo $formatter->format(0), "
";
Ожидаемый результат
bool(true)
1970-01-01 00:00
Сохраняйте timezone отдельной настройкой пользователя, не выводите её из языка.
Тот же механизм в процедурной форме: datefmt_set_timezone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getTimeZone.
datefmt_set_timezoneПоказать тот же момент в часовом поясе получателя отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_set_timezone(IntlDateFormatter $formatter, IntlTimeZone|DateTimeZone|string|null $timezone): boolПроцедурная форма IntlDateFormatter::setTimeZone. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | IntlTimeZone, DateTimeZone, строковый ICU ID или GMT-смещение. null использует date_default_timezone_get, не locale. |
| Базы данных | DateTimeZone преобразуется по его ID в объект ICU. Расхождения версий баз PHP/ICU могут влиять на исторические и будущие переходы. |
| Возврат | bool: с PHP 8.3 успех true; ранее успешный вызов возвращал null. |
Начинаем с задачи и одного вызова
Заказ создан в 12:30 UTC, покупатель в Москве ожидает 15:30. Getter помогает диагностике, setter меняет только представление момента в нужной зоне.
| Запись в примере | Что именно происходит |
|---|---|
| "Europe/Moscow" | Полный идентификатор зоны, включающий исторические правила. Сокращения вроде CST неоднозначны. |
| getTimeZoneId() | Возвращает строку ID. getTimeZone() возвращает объект, у которого есть getID и операции смещений. |
| setTimeZone(...) | Меняет настройку форматтера. Хранимый Unix timestamp не меняется. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $formatter->getTimeZoneId(), ": ", $formatter->format($createdAt), "
";
Ожидаемый результат
UTC: 29.02.2024 12:30
Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setTimeZone("Europe/Moscow");
echo $formatter->getTimeZoneId(), ": ", $formatter->format($createdAt), "
";
echo "Момент хранения: ", $createdAt, "
";
Ожидаемый результат
Europe/Moscow: 29.02.2024 15:30
Момент хранения: 1709209800
Один момент остаётся числом 1709209800. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setTimeZone("GMT+03:00");
echo $formatter->format(0), "
";
Ожидаемый результат
1970-01-01 03:00
Момент 0 не изменился; изменилось его местное представление.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump(datefmt_set_timezone($formatter, new DateTimeZone("UTC")));
echo $formatter->format(0), "
";
Ожидаемый результат
bool(true)
1970-01-01 00:00
Сохраняйте timezone отдельной настройкой пользователя, не выводите её из языка.
Тот же механизм в процедурной форме: datefmt_set_timezone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::getTimeZone.
IntlDateFormatter::setPatternВыбрать или проверить состав полей даты в отчёте.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::setPattern(string $pattern): bool| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | Шаблон ICU: yyyy — календарный год, MM — месяц, dd — день, HH — 24-часовые часы, mm — минуты. YYYY относится к недельному году; около Нового года это может дать иной год. Литералы заключаются в одиночные кавычки. |
| Возврат | setPattern bool, getPattern string|false. Шаблон PHP date() несовместим. Для языково естественного порядка полей используйте стили или IntlDatePatternGenerator. |
Начинаем с задачи и одного вызова
В короткой карточке нужна дата 29.02.2024, а в журнале — ещё часы. Шаблон задаёт конкретные поля; ошибка в одной букве может показать минуты вместо месяца или следующий год в декабре.
| Запись в примере | Что именно происходит |
|---|---|
| dd.MM.yyyy | День, месяц и календарный год. Заглавное M — месяц, маленькое m — минуты. |
| HH:mm | Часы в 24-часовом виде и минуты. |
| yyyy и YYYY | yyyy — календарный год; YYYY — недельный год, который на границе декабря/января бывает другим. |
| getPattern() | Читает действующее правило, setPattern меняет его для последующих вызовов. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setPattern("dd.MM.yyyy");
echo "Правило: ", $formatter->getPattern(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Правило: dd.MM.yyyy
Дата заказа: 29.02.2024
Секунды/часы не исчезли из хранимого момента. Мы выбрали меньший объём подписи.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$december = 1767009600; // 29 декабря 2025, 12:00 UTC
$formatter->setPattern("dd.MM.YYYY");
echo "Недельный год: ", $formatter->format($december), "
";
$formatter->setPattern("dd.MM.yyyy");
echo "Дата заказа: ", $formatter->format($december), "
";
Ожидаемый результат
Недельный год: 29.12.2026
Дата заказа: 29.12.2025
Именно такой скачок года обсуждают разработчики в реальных отчётах. Для даты заказа нужен yyyy; YYYY уместен в отчёте по неделям, если весь формат следует этому договору.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->getPattern(), "
";
Ожидаемый результат
yyyy-MM-dd HH:mm
Возвращается описание, а не результат форматирования.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
datefmt_set_pattern($formatter, "dd/MM");
echo $formatter->format(0), "
";
Ожидаемый результат
01/01
Такой сокращённый формат имеет смысл в конкретном отчёте; он не подходит для хранения полной даты.
Тот же механизм в процедурной форме: datefmt_set_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDatePatternGenerator::getBestPattern.
datefmt_set_patternВыбрать или проверить состав полей даты в отчёте.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_set_pattern(IntlDateFormatter $formatter, string $pattern): boolПроцедурная форма IntlDateFormatter::setPattern. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | Шаблон ICU: yyyy — календарный год, MM — месяц, dd — день, HH — 24-часовые часы, mm — минуты. YYYY относится к недельному году; около Нового года это может дать иной год. Литералы заключаются в одиночные кавычки. |
| Возврат | setPattern bool, getPattern string|false. Шаблон PHP date() несовместим. Для языково естественного порядка полей используйте стили или IntlDatePatternGenerator. |
Начинаем с задачи и одного вызова
В короткой карточке нужна дата 29.02.2024, а в журнале — ещё часы. Шаблон задаёт конкретные поля; ошибка в одной букве может показать минуты вместо месяца или следующий год в декабре.
| Запись в примере | Что именно происходит |
|---|---|
| dd.MM.yyyy | День, месяц и календарный год. Заглавное M — месяц, маленькое m — минуты. |
| HH:mm | Часы в 24-часовом виде и минуты. |
| yyyy и YYYY | yyyy — календарный год; YYYY — недельный год, который на границе декабря/января бывает другим. |
| getPattern() | Читает действующее правило, setPattern меняет его для последующих вызовов. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setPattern("dd.MM.yyyy");
echo "Правило: ", $formatter->getPattern(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Правило: dd.MM.yyyy
Дата заказа: 29.02.2024
Секунды/часы не исчезли из хранимого момента. Мы выбрали меньший объём подписи.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$december = 1767009600; // 29 декабря 2025, 12:00 UTC
$formatter->setPattern("dd.MM.YYYY");
echo "Недельный год: ", $formatter->format($december), "
";
$formatter->setPattern("dd.MM.yyyy");
echo "Дата заказа: ", $formatter->format($december), "
";
Ожидаемый результат
Недельный год: 29.12.2026
Дата заказа: 29.12.2025
Именно такой скачок года обсуждают разработчики в реальных отчётах. Для даты заказа нужен yyyy; YYYY уместен в отчёте по неделям, если весь формат следует этому договору.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->getPattern(), "
";
Ожидаемый результат
yyyy-MM-dd HH:mm
Возвращается описание, а не результат форматирования.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
datefmt_set_pattern($formatter, "dd/MM");
echo $formatter->format(0), "
";
Ожидаемый результат
01/01
Такой сокращённый формат имеет смысл в конкретном отчёте; он не подходит для хранения полной даты.
Тот же механизм в процедурной форме: datefmt_set_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDatePatternGenerator::getBestPattern.
IntlDateFormatter::getPatternВыбрать или проверить состав полей даты в отчёте.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getPattern(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | Шаблон ICU: yyyy — календарный год, MM — месяц, dd — день, HH — 24-часовые часы, mm — минуты. YYYY относится к недельному году; около Нового года это может дать иной год. Литералы заключаются в одиночные кавычки. |
| Возврат | setPattern bool, getPattern string|false. Шаблон PHP date() несовместим. Для языково естественного порядка полей используйте стили или IntlDatePatternGenerator. |
Начинаем с задачи и одного вызова
В короткой карточке нужна дата 29.02.2024, а в журнале — ещё часы. Шаблон задаёт конкретные поля; ошибка в одной букве может показать минуты вместо месяца или следующий год в декабре.
| Запись в примере | Что именно происходит |
|---|---|
| dd.MM.yyyy | День, месяц и календарный год. Заглавное M — месяц, маленькое m — минуты. |
| HH:mm | Часы в 24-часовом виде и минуты. |
| yyyy и YYYY | yyyy — календарный год; YYYY — недельный год, который на границе декабря/января бывает другим. |
| getPattern() | Читает действующее правило, setPattern меняет его для последующих вызовов. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setPattern("dd.MM.yyyy");
echo "Правило: ", $formatter->getPattern(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Правило: dd.MM.yyyy
Дата заказа: 29.02.2024
Секунды/часы не исчезли из хранимого момента. Мы выбрали меньший объём подписи.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$december = 1767009600; // 29 декабря 2025, 12:00 UTC
$formatter->setPattern("dd.MM.YYYY");
echo "Недельный год: ", $formatter->format($december), "
";
$formatter->setPattern("dd.MM.yyyy");
echo "Дата заказа: ", $formatter->format($december), "
";
Ожидаемый результат
Недельный год: 29.12.2026
Дата заказа: 29.12.2025
Именно такой скачок года обсуждают разработчики в реальных отчётах. Для даты заказа нужен yyyy; YYYY уместен в отчёте по неделям, если весь формат следует этому договору.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->getPattern(), "
";
Ожидаемый результат
yyyy-MM-dd HH:mm
Возвращается описание, а не результат форматирования.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
datefmt_set_pattern($formatter, "dd/MM");
echo $formatter->format(0), "
";
Ожидаемый результат
01/01
Такой сокращённый формат имеет смысл в конкретном отчёте; он не подходит для хранения полной даты.
Тот же механизм в процедурной форме: datefmt_get_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDatePatternGenerator::getBestPattern.
datefmt_get_patternВыбрать или проверить состав полей даты в отчёте.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_pattern(IntlDateFormatter $formatter): string|falseПроцедурная форма IntlDateFormatter::getPattern. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | Шаблон ICU: yyyy — календарный год, MM — месяц, dd — день, HH — 24-часовые часы, mm — минуты. YYYY относится к недельному году; около Нового года это может дать иной год. Литералы заключаются в одиночные кавычки. |
| Возврат | setPattern bool, getPattern string|false. Шаблон PHP date() несовместим. Для языково естественного порядка полей используйте стили или IntlDatePatternGenerator. |
Начинаем с задачи и одного вызова
В короткой карточке нужна дата 29.02.2024, а в журнале — ещё часы. Шаблон задаёт конкретные поля; ошибка в одной букве может показать минуты вместо месяца или следующий год в декабре.
| Запись в примере | Что именно происходит |
|---|---|
| dd.MM.yyyy | День, месяц и календарный год. Заглавное M — месяц, маленькое m — минуты. |
| HH:mm | Часы в 24-часовом виде и минуты. |
| yyyy и YYYY | yyyy — календарный год; YYYY — недельный год, который на границе декабря/января бывает другим. |
| getPattern() | Читает действующее правило, setPattern меняет его для последующих вызовов. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
$formatter->setPattern("dd.MM.yyyy");
echo "Правило: ", $formatter->getPattern(), "
";
echo "Дата заказа: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Правило: dd.MM.yyyy
Дата заказа: 29.02.2024
Секунды/часы не исчезли из хранимого момента. Мы выбрали меньший объём подписи.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "dd.MM.yyyy HH:mm");
$december = 1767009600; // 29 декабря 2025, 12:00 UTC
$formatter->setPattern("dd.MM.YYYY");
echo "Недельный год: ", $formatter->format($december), "
";
$formatter->setPattern("dd.MM.yyyy");
echo "Дата заказа: ", $formatter->format($december), "
";
Ожидаемый результат
Недельный год: 29.12.2026
Дата заказа: 29.12.2025
Именно такой скачок года обсуждают разработчики в реальных отчётах. Для даты заказа нужен yyyy; YYYY уместен в отчёте по неделям, если весь формат следует этому договору.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
echo $formatter->getPattern(), "
";
Ожидаемый результат
yyyy-MM-dd HH:mm
Возвращается описание, а не результат форматирования.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
datefmt_set_pattern($formatter, "dd/MM");
echo $formatter->format(0), "
";
Ожидаемый результат
01/01
Такой сокращённый формат имеет смысл в конкретном отчёте; он не подходит для хранения полной даты.
Тот же механизм в процедурной форме: datefmt_get_pattern. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDatePatternGenerator::getBestPattern.
IntlDateFormatter::getLocaleПроверить, какая ICU-локаль реально предоставляет правила форматирования.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getLocale(int $type = ULOC_ACTUAL_LOCALE): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| type | ACTUAL_LOCALE по умолчанию либо VALID_LOCALE. ICU может наследовать данные родительской локали. |
| Возврат | string|false. Фактическая locale данных не обязана буквально совпадать с запрошенным ID и не сообщает часовой пояс. |
Начинаем с задачи и одного вызова
Дата форматируется, но название месяца не соответствует языку письма. Проверим locale объекта и рядом покажем его фактический вывод.
| Запись в примере | Что именно происходит |
|---|---|
| getLocale(VALID_LOCALE) | Возвращает разрешённую ICU локаль после fallback. |
| ACTUAL_LOCALE | Источник реально используемых данных может быть родительским. |
| Locale и timezone | Первая выбирает слова/порядок полей, второй — местные часы. Они задаются независимо. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Профиль: ", $formatter->getLocale(Locale::VALID_LOCALE), "
";
echo "Date: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Профиль: en_US
Date: February 29, 2024
В support-диагностике теперь видно, почему месяц английский.
<?php
declare(strict_types=1);
$english = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$german = new IntlDateFormatter("de_DE", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $english->getLocale(Locale::VALID_LOCALE), ": ", $english->format($createdAt), "
";
echo $german->getLocale(Locale::VALID_LOCALE), ": ", $german->format($createdAt), "
";
Ожидаемый результат
en_US: February 29, 2024
de_DE: 29. Februar 2024
Дата не менялась; изменились слова и порядок. Для машинного API не выбирайте один из этих локализованных текстов вместо согласованного формата обмена.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump(is_string($formatter->getLocale()));
Ожидаемый результат
bool(true)
Для диагностики полезен фактический ID; пример не закрепляет меняющийся fallback ICU.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump(is_string(datefmt_get_locale($formatter, Locale::VALID_LOCALE)));
Ожидаемый результат
bool(true)
Не используйте различие actual/valid как признак ошибки без проверки результата форматирования.
Тот же механизм в процедурной форме: datefmt_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDefault.
datefmt_get_localeПроверить, какая ICU-локаль реально предоставляет правила форматирования.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_locale(IntlDateFormatter $formatter, int $type = ULOC_ACTUAL_LOCALE): string|falseПроцедурная форма IntlDateFormatter::getLocale. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| type | ACTUAL_LOCALE по умолчанию либо VALID_LOCALE. ICU может наследовать данные родительской локали. |
| Возврат | string|false. Фактическая locale данных не обязана буквально совпадать с запрошенным ID и не сообщает часовой пояс. |
Начинаем с задачи и одного вызова
Дата форматируется, но название месяца не соответствует языку письма. Проверим locale объекта и рядом покажем его фактический вывод.
| Запись в примере | Что именно происходит |
|---|---|
| getLocale(VALID_LOCALE) | Возвращает разрешённую ICU локаль после fallback. |
| ACTUAL_LOCALE | Источник реально используемых данных может быть родительским. |
| Locale и timezone | Первая выбирает слова/порядок полей, второй — местные часы. Они задаются независимо. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo "Профиль: ", $formatter->getLocale(Locale::VALID_LOCALE), "
";
echo "Date: ", $formatter->format($createdAt), "
";
Ожидаемый результат
Профиль: en_US
Date: February 29, 2024
В support-диагностике теперь видно, почему месяц английский.
<?php
declare(strict_types=1);
$english = new IntlDateFormatter("en_US", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$german = new IntlDateFormatter("de_DE", IntlDateFormatter::LONG, IntlDateFormatter::NONE, "UTC");
$createdAt = 1709209800; // 29 февраля 2024, 12:30 UTC
echo $english->getLocale(Locale::VALID_LOCALE), ": ", $english->format($createdAt), "
";
echo $german->getLocale(Locale::VALID_LOCALE), ": ", $german->format($createdAt), "
";
Ожидаемый результат
en_US: February 29, 2024
de_DE: 29. Februar 2024
Дата не менялась; изменились слова и порядок. Для машинного API не выбирайте один из этих локализованных текстов вместо согласованного формата обмена.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump(is_string($formatter->getLocale()));
Ожидаемый результат
bool(true)
Для диагностики полезен фактический ID; пример не закрепляет меняющийся fallback ICU.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
var_dump(is_string(datefmt_get_locale($formatter, Locale::VALID_LOCALE)));
Ожидаемый результат
bool(true)
Не используйте различие actual/valid как признак ошибки без проверки результата форматирования.
Тот же механизм в процедурной форме: datefmt_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::getDefault.
IntlDateFormatter::setLenientНастроить строгость разбора даты, чтобы ввод не исправлялся незаметно для пользователя.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::setLenient(bool $lenient): void| Аргумент или результат | Что означает на практике |
|---|---|
| lenient | bool у setter; default true. Для формы с точной календарной датой обычно устанавливают false. |
| Возврат | setLenient имеет актуальную сигнатуру void; не проверяйте его return как bool вопреки старому тексту документации. isLenient возвращает bool. |
| Границы проверки | Строгий режим ограничивает календарные значения, но не заменяет проверку полного потребления строки, бизнес-диапазона и часового пояса. |
Начинаем с задачи и одного вызова
В форме записи введено 30 февраля. Если библиотека сама превратит его в март, человек может записаться на неверный день. Для такой формы нужен строгий разбор.
| Запись в примере | Что именно происходит |
|---|---|
| setLenient(false) | Запрещает мягкую нормализацию невозможных календарных полей. |
| isLenient() | Позволяет проверить режим парсера. Возвращаемое false здесь полезная настройка, не ошибка. |
| parse(...) === false | Отдельный отказ разобрать введённую дату. Нужно показать ошибку поля, а не считать это timestamp 0. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$value = $formatter->parse("2024-02-30 12:00:00");
if ($value === false) { echo "Такой даты нет: проверьте день и месяц.
"; }
Ожидаемый результат
Такой даты нет: проверьте день и месяц.
Человек получает возможность исправить поле вместо автоматической записи на март.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
echo $formatter->isLenient() ? "Мягкий режим.
" : "Строгий режим.
";
$value = $formatter->parse("2024-02-29 12:00:00");
if ($value !== false) { echo "Дата встречи: ", $formatter->format($value), "
"; }
Ожидаемый результат
Строгий режим.
Дата встречи: 2024-02-29 12:00:00
Строгость не запрещает 29 февраля в високосный год. В настоящей форме далее проверяют полный ввод и допустимый интервал записи.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setLenient(false);
var_dump($formatter->isLenient());
Ожидаемый результат
bool(false)
Настройка изменяет парсер объекта, а не исходную строку.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
datefmt_set_lenient($formatter, false);
var_dump($formatter->parse("2024-02-30 12:00"));
Ожидаемый результат
bool(false)
30 февраля не нужно молча превращать в март, если пользователь выбирает точную дату.
Тот же механизм в процедурной форме: datefmt_set_lenient. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::parse.
datefmt_set_lenientНастроить строгость разбора даты, чтобы ввод не исправлялся незаметно для пользователя.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_set_lenient(IntlDateFormatter $formatter, bool $lenient): voidПроцедурная форма IntlDateFormatter::setLenient. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| lenient | bool у setter; default true. Для формы с точной календарной датой обычно устанавливают false. |
| Возврат | setLenient имеет актуальную сигнатуру void; не проверяйте его return как bool вопреки старому тексту документации. isLenient возвращает bool. |
| Границы проверки | Строгий режим ограничивает календарные значения, но не заменяет проверку полного потребления строки, бизнес-диапазона и часового пояса. |
Начинаем с задачи и одного вызова
В форме записи введено 30 февраля. Если библиотека сама превратит его в март, человек может записаться на неверный день. Для такой формы нужен строгий разбор.
| Запись в примере | Что именно происходит |
|---|---|
| setLenient(false) | Запрещает мягкую нормализацию невозможных календарных полей. |
| isLenient() | Позволяет проверить режим парсера. Возвращаемое false здесь полезная настройка, не ошибка. |
| parse(...) === false | Отдельный отказ разобрать введённую дату. Нужно показать ошибку поля, а не считать это timestamp 0. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$value = $formatter->parse("2024-02-30 12:00:00");
if ($value === false) { echo "Такой даты нет: проверьте день и месяц.
"; }
Ожидаемый результат
Такой даты нет: проверьте день и месяц.
Человек получает возможность исправить поле вместо автоматической записи на март.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
echo $formatter->isLenient() ? "Мягкий режим.
" : "Строгий режим.
";
$value = $formatter->parse("2024-02-29 12:00:00");
if ($value !== false) { echo "Дата встречи: ", $formatter->format($value), "
"; }
Ожидаемый результат
Строгий режим.
Дата встречи: 2024-02-29 12:00:00
Строгость не запрещает 29 февраля в високосный год. В настоящей форме далее проверяют полный ввод и допустимый интервал записи.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setLenient(false);
var_dump($formatter->isLenient());
Ожидаемый результат
bool(false)
Настройка изменяет парсер объекта, а не исходную строку.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
datefmt_set_lenient($formatter, false);
var_dump($formatter->parse("2024-02-30 12:00"));
Ожидаемый результат
bool(false)
30 февраля не нужно молча превращать в март, если пользователь выбирает точную дату.
Тот же механизм в процедурной форме: datefmt_set_lenient. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::parse.
IntlDateFormatter::isLenientНастроить строгость разбора даты, чтобы ввод не исправлялся незаметно для пользователя.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::isLenient(): bool| Аргумент или результат | Что означает на практике |
|---|---|
| lenient | bool у setter; default true. Для формы с точной календарной датой обычно устанавливают false. |
| Возврат | setLenient имеет актуальную сигнатуру void; не проверяйте его return как bool вопреки старому тексту документации. isLenient возвращает bool. |
| Границы проверки | Строгий режим ограничивает календарные значения, но не заменяет проверку полного потребления строки, бизнес-диапазона и часового пояса. |
Начинаем с задачи и одного вызова
В форме записи введено 30 февраля. Если библиотека сама превратит его в март, человек может записаться на неверный день. Для такой формы нужен строгий разбор.
| Запись в примере | Что именно происходит |
|---|---|
| setLenient(false) | Запрещает мягкую нормализацию невозможных календарных полей. |
| isLenient() | Позволяет проверить режим парсера. Возвращаемое false здесь полезная настройка, не ошибка. |
| parse(...) === false | Отдельный отказ разобрать введённую дату. Нужно показать ошибку поля, а не считать это timestamp 0. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$value = $formatter->parse("2024-02-30 12:00:00");
if ($value === false) { echo "Такой даты нет: проверьте день и месяц.
"; }
Ожидаемый результат
Такой даты нет: проверьте день и месяц.
Человек получает возможность исправить поле вместо автоматической записи на март.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
echo $formatter->isLenient() ? "Мягкий режим.
" : "Строгий режим.
";
$value = $formatter->parse("2024-02-29 12:00:00");
if ($value !== false) { echo "Дата встречи: ", $formatter->format($value), "
"; }
Ожидаемый результат
Строгий режим.
Дата встречи: 2024-02-29 12:00:00
Строгость не запрещает 29 февраля в високосный год. В настоящей форме далее проверяют полный ввод и допустимый интервал записи.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setLenient(false);
var_dump($formatter->isLenient());
Ожидаемый результат
bool(false)
Настройка изменяет парсер объекта, а не исходную строку.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
datefmt_set_lenient($formatter, false);
var_dump($formatter->parse("2024-02-30 12:00"));
Ожидаемый результат
bool(false)
30 февраля не нужно молча превращать в март, если пользователь выбирает точную дату.
Тот же механизм в процедурной форме: datefmt_is_lenient. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::parse.
datefmt_is_lenientНастроить строгость разбора даты, чтобы ввод не исправлялся незаметно для пользователя.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_is_lenient(IntlDateFormatter $formatter): boolПроцедурная форма IntlDateFormatter::isLenient. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| lenient | bool у setter; default true. Для формы с точной календарной датой обычно устанавливают false. |
| Возврат | setLenient имеет актуальную сигнатуру void; не проверяйте его return как bool вопреки старому тексту документации. isLenient возвращает bool. |
| Границы проверки | Строгий режим ограничивает календарные значения, но не заменяет проверку полного потребления строки, бизнес-диапазона и часового пояса. |
Начинаем с задачи и одного вызова
В форме записи введено 30 февраля. Если библиотека сама превратит его в март, человек может записаться на неверный день. Для такой формы нужен строгий разбор.
| Запись в примере | Что именно происходит |
|---|---|
| setLenient(false) | Запрещает мягкую нормализацию невозможных календарных полей. |
| isLenient() | Позволяет проверить режим парсера. Возвращаемое false здесь полезная настройка, не ошибка. |
| parse(...) === false | Отдельный отказ разобрать введённую дату. Нужно показать ошибку поля, а не считать это timestamp 0. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$value = $formatter->parse("2024-02-30 12:00:00");
if ($value === false) { echo "Такой даты нет: проверьте день и месяц.
"; }
Ожидаемый результат
Такой даты нет: проверьте день и месяц.
Человек получает возможность исправить поле вместо автоматической записи на март.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
echo $formatter->isLenient() ? "Мягкий режим.
" : "Строгий режим.
";
$value = $formatter->parse("2024-02-29 12:00:00");
if ($value !== false) { echo "Дата встречи: ", $formatter->format($value), "
"; }
Ожидаемый результат
Строгий режим.
Дата встречи: 2024-02-29 12:00:00
Строгость не запрещает 29 февраля в високосный год. В настоящей форме далее проверяют полный ввод и допустимый интервал записи.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setLenient(false);
var_dump($formatter->isLenient());
Ожидаемый результат
bool(false)
Настройка изменяет парсер объекта, а не исходную строку.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
datefmt_set_lenient($formatter, false);
var_dump($formatter->parse("2024-02-30 12:00"));
Ожидаемый результат
bool(false)
30 февраля не нужно молча превращать в март, если пользователь выбирает точную дату.
Тот же механизм в процедурной форме: datefmt_is_lenient. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::parse.
IntlDateFormatter::parseПревратить дату из согласованного текстового формата в момент времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::parse(string $string, &$offset = null): int|float|false| Аргумент или результат | Что означает на практике |
|---|---|
| string,offset | Строка и переменная начальной/конечной позиции по ссылке. Разбор может потребить только префикс; offset нужен для обнаружения хвоста. В ICU позиции привязаны к UTF-16; в примерах ASCII единицы совпадают. |
| Возврат | int|float|false: секунды Unix timestamp, не миллисекунды и не объект. Значение 0 — корректная эпоха, проверяйте ===false. |
| Состояние | parse не предназначен для изменения пояса форматтера; для этого поведения есть parseToCalendar. |
| Валидация | setLenient(false) плюс проверка хвоста и нужного диапазона. Поля, которых нет в шаблоне, могут опираться на календарное состояние: для точного момента задавайте все нужные поля. |
Начинаем с задачи и одного вызова
Форма бронирования прислала текст "2024-02-29 12:30:00". Его нужно превратить в момент для хранения и сравнения. Указанный timezone объясняет, чьи часы ввёл пользователь.
| Запись в примере | Что именно происходит |
|---|---|
| yyyy-MM-dd HH:mm:ss | Шаблон договора поля, включая секунды. Все существенные части указаны, поэтому не зависят от скрытого состояния календаря. |
| parse / parseToCalendar | Возвращают секунды timestamp, а не объект IntlCalendar. parseToCalendar также обновляет календарное состояние/пояс из разбора. |
| $offset | Переменная по ссылке получает конец разбора; хвост после даты нельзя молча игнорировать. |
| === false | Отделяет ошибку от корректного нулевого timestamp. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$timestamp = $formatter->parse("2024-02-29 12:30:00");
echo "Момент для хранения: ", $timestamp, "
";
echo "Подтверждение: ", $formatter->format($timestamp), " UTC
";
Ожидаемый результат
Момент для хранения: 1709209800
Подтверждение: 2024-02-29 12:30:00 UTC
Число можно сохранить и сравнивать с другими моментами. Обратный вывод делает смысл числа понятным человеку.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$input = "2024-02-29 12:30:00 extra";
$offset = 0;
$timestamp = $formatter->parse($input, $offset);
if ($timestamp === false || $offset !== strlen($input)) {
echo "Введите дату и время без дополнительного текста.
";
}
Ожидаемый результат
Введите дату и время без дополнительного текста.
Договор этого поля ASCII, поэтому strlen подходит для сравнения offset. Для Unicode offset измеряется в UTF-16. Даже строгий календарь не заменяет эту проверку хвоста.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setPattern("yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$offset = 0;
$value = $formatter->parse("1970-01-01 00:00:00", $offset);
echo $value, " / ", $offset, "
";
Ожидаемый результат
0 / 19
Нулевой timestamp — успех; offset указывает, что весь ASCII-ввод потреблён.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setLenient(false);
$text = "1970-01-01 00:00 extra";
$offset = 0;
$value = $formatter->parse($text, $offset);
echo $value !== false && $offset === strlen($text) ? "accepted
" : "trailing input
";
Ожидаемый результат
trailing input
Проверка strlen уместна здесь только для ASCII. Для произвольного Unicode нельзя смешивать байты и UTF-16-позиции.
Тот же механизм в процедурной форме: datefmt_parse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::setLenient, IntlDateFormatter::localtime.
datefmt_parseПревратить дату из согласованного текстового формата в момент времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_parse(IntlDateFormatter $formatter, string $string, &$offset = null): int|float|falseПроцедурная форма IntlDateFormatter::parse. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string,offset | Строка и переменная начальной/конечной позиции по ссылке. Разбор может потребить только префикс; offset нужен для обнаружения хвоста. В ICU позиции привязаны к UTF-16; в примерах ASCII единицы совпадают. |
| Возврат | int|float|false: секунды Unix timestamp, не миллисекунды и не объект. Значение 0 — корректная эпоха, проверяйте ===false. |
| Состояние | parse не предназначен для изменения пояса форматтера; для этого поведения есть parseToCalendar. |
| Валидация | setLenient(false) плюс проверка хвоста и нужного диапазона. Поля, которых нет в шаблоне, могут опираться на календарное состояние: для точного момента задавайте все нужные поля. |
Начинаем с задачи и одного вызова
Форма бронирования прислала текст "2024-02-29 12:30:00". Его нужно превратить в момент для хранения и сравнения. Указанный timezone объясняет, чьи часы ввёл пользователь.
| Запись в примере | Что именно происходит |
|---|---|
| yyyy-MM-dd HH:mm:ss | Шаблон договора поля, включая секунды. Все существенные части указаны, поэтому не зависят от скрытого состояния календаря. |
| parse / parseToCalendar | Возвращают секунды timestamp, а не объект IntlCalendar. parseToCalendar также обновляет календарное состояние/пояс из разбора. |
| $offset | Переменная по ссылке получает конец разбора; хвост после даты нельзя молча игнорировать. |
| === false | Отделяет ошибку от корректного нулевого timestamp. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$timestamp = $formatter->parse("2024-02-29 12:30:00");
echo "Момент для хранения: ", $timestamp, "
";
echo "Подтверждение: ", $formatter->format($timestamp), " UTC
";
Ожидаемый результат
Момент для хранения: 1709209800
Подтверждение: 2024-02-29 12:30:00 UTC
Число можно сохранить и сравнивать с другими моментами. Обратный вывод делает смысл числа понятным человеку.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$input = "2024-02-29 12:30:00 extra";
$offset = 0;
$timestamp = $formatter->parse($input, $offset);
if ($timestamp === false || $offset !== strlen($input)) {
echo "Введите дату и время без дополнительного текста.
";
}
Ожидаемый результат
Введите дату и время без дополнительного текста.
Договор этого поля ASCII, поэтому strlen подходит для сравнения offset. Для Unicode offset измеряется в UTF-16. Даже строгий календарь не заменяет эту проверку хвоста.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setPattern("yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$offset = 0;
$value = $formatter->parse("1970-01-01 00:00:00", $offset);
echo $value, " / ", $offset, "
";
Ожидаемый результат
0 / 19
Нулевой timestamp — успех; offset указывает, что весь ASCII-ввод потреблён.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setLenient(false);
$text = "1970-01-01 00:00 extra";
$offset = 0;
$value = $formatter->parse($text, $offset);
echo $value !== false && $offset === strlen($text) ? "accepted
" : "trailing input
";
Ожидаемый результат
trailing input
Проверка strlen уместна здесь только для ASCII. Для произвольного Unicode нельзя смешивать байты и UTF-16-позиции.
Тот же механизм в процедурной форме: datefmt_parse. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::setLenient, IntlDateFormatter::localtime.
IntlDateFormatter::parseToCalendarПревратить дату из согласованного текстового формата в момент времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::parseToCalendar(string $string, &$offset = null): int|float|false| Аргумент или результат | Что означает на практике |
|---|---|
| string,offset | Строка и переменная начальной/конечной позиции по ссылке. Разбор может потребить только префикс; offset нужен для обнаружения хвоста. В ICU позиции привязаны к UTF-16; в примерах ASCII единицы совпадают. |
| Возврат | int|float|false: секунды Unix timestamp, не миллисекунды и не объект. Значение 0 — корректная эпоха, проверяйте ===false. |
| Состояние | parseToCalendar дополнительно обновляет пояс форматтера из информации разобранного текста; название не означает, что возвращается объект календаря. |
| Валидация | setLenient(false) плюс проверка хвоста и нужного диапазона. Поля, которых нет в шаблоне, могут опираться на календарное состояние: для точного момента задавайте все нужные поля. |
Начинаем с задачи и одного вызова
Форма бронирования прислала текст "2024-02-29 12:30:00". Его нужно превратить в момент для хранения и сравнения. Указанный timezone объясняет, чьи часы ввёл пользователь.
| Запись в примере | Что именно происходит |
|---|---|
| yyyy-MM-dd HH:mm:ss | Шаблон договора поля, включая секунды. Все существенные части указаны, поэтому не зависят от скрытого состояния календаря. |
| parse / parseToCalendar | Возвращают секунды timestamp, а не объект IntlCalendar. parseToCalendar также обновляет календарное состояние/пояс из разбора. |
| $offset | Переменная по ссылке получает конец разбора; хвост после даты нельзя молча игнорировать. |
| === false | Отделяет ошибку от корректного нулевого timestamp. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$timestamp = $formatter->parseToCalendar("2024-02-29 12:30:00");
echo "Момент для хранения: ", $timestamp, "
";
echo "Подтверждение: ", $formatter->format($timestamp), " UTC
";
Ожидаемый результат
Момент для хранения: 1709209800
Подтверждение: 2024-02-29 12:30:00 UTC
Число можно сохранить и сравнивать с другими моментами. Обратный вывод делает смысл числа понятным человеку.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$input = "2024-02-29 12:30:00 extra";
$offset = 0;
$timestamp = $formatter->parseToCalendar($input, $offset);
if ($timestamp === false || $offset !== strlen($input)) {
echo "Введите дату и время без дополнительного текста.
";
}
Ожидаемый результат
Введите дату и время без дополнительного текста.
Договор этого поля ASCII, поэтому strlen подходит для сравнения offset. Для Unicode offset измеряется в UTF-16. Даже строгий календарь не заменяет эту проверку хвоста.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setPattern("yyyy-MM-dd HH:mm:ss");
$formatter->setLenient(false);
$offset = 0;
$value = $formatter->parseToCalendar("1970-01-01 00:00:00", $offset);
echo $value, " / ", $offset, "
";
Ожидаемый результат
0 / 19
Нулевой timestamp — успех; offset указывает, что весь ASCII-ввод потреблён.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->setLenient(false);
$text = "1970-01-01 00:00 extra";
$offset = 0;
$value = $formatter->parseToCalendar($text, $offset);
echo $value !== false && $offset === strlen($text) ? "accepted
" : "trailing input
";
Ожидаемый результат
trailing input
Проверка strlen уместна здесь только для ASCII. Для произвольного Unicode нельзя смешивать байты и UTF-16-позиции.
Рядом по задаче: IntlDateFormatter::setLenient, IntlDateFormatter::localtime.
IntlDateFormatter::localtimeРазобрать дату в отдельные календарные поля, когда нужны год, месяц и часы, а не timestamp.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::localtime(string $string, &$offset = null): array|false| Аргумент или результат | Что означает на практике |
|---|---|
| string,offset | Текст и позиция по ссылке; извлекается максимально доступный префикс. Неверная начальная позиция даёт false. |
| Возврат | array|false с ключами структуры localtime. tm_year — год минус 1900; tm_mon — месяц от 0; tm_hour — часы 0…23. Особенность intl: tm_yday здесь от 1, в обычном localtime от 0. |
| Применение | Явно преобразуйте необычные основания полей. Этот массив не совпадает с полями HTML date-input и не должен передаваться туда без адаптации. |
Начинаем с задачи и одного вызова
Для формы редактирования иногда нужны отдельные день, месяц и год, а не готовая подпись или timestamp. localtime возвращает массив полей, но их основания не совпадают с привычными числами формы.
| Запись в примере | Что именно происходит |
|---|---|
| tm_year | Количество лет после 1900, поэтому для полного года прибавляем 1900. |
| tm_mon | Месяц от 0, поэтому для обычного поля 1…12 прибавляем 1. |
| tm_mday / tm_hour / tm_min | День месяца, часы и минуты. Они читаются из массива по ключам. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$parts = $formatter->localtime("2024-02-29 12:30:00");
echo "Год: ", $parts["tm_year"] + 1900, "
";
echo "Месяц: ", $parts["tm_mon"] + 1, "
";
echo "День: ", $parts["tm_mday"], "
";
Ожидаемый результат
Год: 2024
Месяц: 2
День: 29
Теперь значения соответствуют обычным полям формы; прямой вывод tm_year дал бы 124.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$parts = $formatter->localtime("2024-02-29 12:30:00");
echo "Час слота: ", $parts["tm_hour"], "
";
echo "Минута слота: ", $parts["tm_min"], "
";
Ожидаемый результат
Час слота: 12
Минута слота: 30
С этими полями можно выбрать соответствующие пункты HTML-select. Для внешнего ввода сначала проверяйте false, полный разбор и допустимость слота расписанием.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$parts = $formatter->localtime("2024-02-29 12:30");
echo $parts["tm_year"] + 1900, " / ", $parts["tm_mon"] + 1, " / ", $parts["tm_mday"], "
";
Ожидаемый результат
2024 / 2 / 29
Прибавления нужны из-за формата структуры, а не из-за изменения даты.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$parts = datefmt_localtime($formatter, "2024-01-01 00:00");
echo $parts["tm_yday"], "
";
Ожидаемый результат
1
Это документированное отличие от обычного localtime: тест предотвращает сдвиг календарной шкалы на день.
Тот же механизм в процедурной форме: datefmt_localtime. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::parse.
datefmt_localtimeРазобрать дату в отдельные календарные поля, когда нужны год, месяц и часы, а не timestamp.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_localtime(IntlDateFormatter $formatter, string $string, &$offset = null): array|falseПроцедурная форма IntlDateFormatter::localtime. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| string,offset | Текст и позиция по ссылке; извлекается максимально доступный префикс. Неверная начальная позиция даёт false. |
| Возврат | array|false с ключами структуры localtime. tm_year — год минус 1900; tm_mon — месяц от 0; tm_hour — часы 0…23. Особенность intl: tm_yday здесь от 1, в обычном localtime от 0. |
| Применение | Явно преобразуйте необычные основания полей. Этот массив не совпадает с полями HTML date-input и не должен передаваться туда без адаптации. |
Начинаем с задачи и одного вызова
Для формы редактирования иногда нужны отдельные день, месяц и год, а не готовая подпись или timestamp. localtime возвращает массив полей, но их основания не совпадают с привычными числами формы.
| Запись в примере | Что именно происходит |
|---|---|
| tm_year | Количество лет после 1900, поэтому для полного года прибавляем 1900. |
| tm_mon | Месяц от 0, поэтому для обычного поля 1…12 прибавляем 1. |
| tm_mday / tm_hour / tm_min | День месяца, часы и минуты. Они читаются из массива по ключам. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$parts = $formatter->localtime("2024-02-29 12:30:00");
echo "Год: ", $parts["tm_year"] + 1900, "
";
echo "Месяц: ", $parts["tm_mon"] + 1, "
";
echo "День: ", $parts["tm_mday"], "
";
Ожидаемый результат
Год: 2024
Месяц: 2
День: 29
Теперь значения соответствуют обычным полям формы; прямой вывод tm_year дал бы 124.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$parts = $formatter->localtime("2024-02-29 12:30:00");
echo "Час слота: ", $parts["tm_hour"], "
";
echo "Минута слота: ", $parts["tm_min"], "
";
Ожидаемый результат
Час слота: 12
Минута слота: 30
С этими полями можно выбрать соответствующие пункты HTML-select. Для внешнего ввода сначала проверяйте false, полный разбор и допустимость слота расписанием.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$parts = $formatter->localtime("2024-02-29 12:30");
echo $parts["tm_year"] + 1900, " / ", $parts["tm_mon"] + 1, " / ", $parts["tm_mday"], "
";
Ожидаемый результат
2024 / 2 / 29
Прибавления нужны из-за формата структуры, а не из-за изменения даты.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$parts = datefmt_localtime($formatter, "2024-01-01 00:00");
echo $parts["tm_yday"], "
";
Ожидаемый результат
1
Это документированное отличие от обычного localtime: тест предотвращает сдвиг календарной шкалы на день.
Тот же механизм в процедурной форме: datefmt_localtime. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlDateFormatter::parse.
IntlDateFormatter::getErrorCodeПрочитать причину отказа разбора/форматирования у текущего объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getErrorCode(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int ICU-код либо string сообщения; начальное состояние U_ZERO_ERROR. |
| Когда читать | Сразу после операции. Для failed parse проверяйте ===false: эпоха 0 не ошибка. ICU предупреждение отличается от ошибки через intl_is_failure. |
Начинаем с задачи и одного вызова
Вместо даты посетитель написал "завтра" в поле, которое принимает только точную запись. Нужно объяснить формат и сохранить причину, не выводя страницу с техническим dump.
| Запись в примере | Что именно происходит |
|---|---|
| parse("завтра") | По текущему точному шаблону это ошибка; метод не обязан угадывать естественный язык. |
| getErrorCode()/getErrorMessage() | Читаем статус этого форматтера до следующей операции. |
| format($sample) | Отдельным успешным вызовом готовим понятный пример формата для пользователя. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$value = $formatter->parse("завтра");
if ($value === false) {
echo "Укажите точную дату, например 2024-02-29 12:30:00.
";
}
Ожидаемый результат
Укажите точную дату, например 2024-02-29 12:30:00.
Отказ не превращается в дату 1970 года. Пользователь понимает, как исправить поле.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$value = $formatter->parse("завтра");
$diagnostic = intl_error_name($formatter->getErrorCode());
echo "Формат: ", $formatter->format(1709209800), "
";
echo str_contains($diagnostic, "U_PARSE_ERROR") ? "Для поддержки: текст не соответствует шаблону.
" : "Иная причина.
";
Ожидаемый результат
Формат: 2024-02-29 12:30:00
Для поддержки: текст не соответствует шаблону.
Сохранённая diagnostic не потерялась после успешного format. В обычном интерфейсе техническая часть идёт в журнал, а подсказка остаётся рядом с полем.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->format(0);
var_dump(intl_is_failure($formatter->getErrorCode()));
Ожидаемый результат
bool(false)
Диагностика относится к этому форматтеру, не ко всем ранее созданным объектам.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->parse("not a date");
var_dump(intl_is_failure($formatter->getErrorCode()));
Ожидаемый результат
bool(true)
Сообщение для человека должно объяснить ожидаемый формат; технический код нужен разработчику.
Тот же механизм в процедурной форме: datefmt_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure.
datefmt_get_error_codeПрочитать причину отказа разбора/форматирования у текущего объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_error_code(IntlDateFormatter $formatter): intПроцедурная форма IntlDateFormatter::getErrorCode. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int ICU-код либо string сообщения; начальное состояние U_ZERO_ERROR. |
| Когда читать | Сразу после операции. Для failed parse проверяйте ===false: эпоха 0 не ошибка. ICU предупреждение отличается от ошибки через intl_is_failure. |
Начинаем с задачи и одного вызова
Вместо даты посетитель написал "завтра" в поле, которое принимает только точную запись. Нужно объяснить формат и сохранить причину, не выводя страницу с техническим dump.
| Запись в примере | Что именно происходит |
|---|---|
| parse("завтра") | По текущему точному шаблону это ошибка; метод не обязан угадывать естественный язык. |
| getErrorCode()/getErrorMessage() | Читаем статус этого форматтера до следующей операции. |
| format($sample) | Отдельным успешным вызовом готовим понятный пример формата для пользователя. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$value = $formatter->parse("завтра");
if ($value === false) {
echo "Укажите точную дату, например 2024-02-29 12:30:00.
";
}
Ожидаемый результат
Укажите точную дату, например 2024-02-29 12:30:00.
Отказ не превращается в дату 1970 года. Пользователь понимает, как исправить поле.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$value = $formatter->parse("завтра");
$diagnostic = intl_error_name($formatter->getErrorCode());
echo "Формат: ", $formatter->format(1709209800), "
";
echo str_contains($diagnostic, "U_PARSE_ERROR") ? "Для поддержки: текст не соответствует шаблону.
" : "Иная причина.
";
Ожидаемый результат
Формат: 2024-02-29 12:30:00
Для поддержки: текст не соответствует шаблону.
Сохранённая diagnostic не потерялась после успешного format. В обычном интерфейсе техническая часть идёт в журнал, а подсказка остаётся рядом с полем.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->format(0);
var_dump(intl_is_failure($formatter->getErrorCode()));
Ожидаемый результат
bool(false)
Диагностика относится к этому форматтеру, не ко всем ранее созданным объектам.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->parse("not a date");
var_dump(intl_is_failure($formatter->getErrorCode()));
Ожидаемый результат
bool(true)
Сообщение для человека должно объяснить ожидаемый формат; технический код нужен разработчику.
Тот же механизм в процедурной форме: datefmt_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure.
IntlDateFormatter::getErrorMessageПрочитать причину отказа разбора/форматирования у текущего объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlDateFormatter::getErrorMessage(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int ICU-код либо string сообщения; начальное состояние U_ZERO_ERROR. |
| Когда читать | Сразу после операции. Для failed parse проверяйте ===false: эпоха 0 не ошибка. ICU предупреждение отличается от ошибки через intl_is_failure. |
Начинаем с задачи и одного вызова
Вместо даты посетитель написал "завтра" в поле, которое принимает только точную запись. Нужно объяснить формат и сохранить причину, не выводя страницу с техническим dump.
| Запись в примере | Что именно происходит |
|---|---|
| parse("завтра") | По текущему точному шаблону это ошибка; метод не обязан угадывать естественный язык. |
| getErrorCode()/getErrorMessage() | Читаем статус этого форматтера до следующей операции. |
| format($sample) | Отдельным успешным вызовом готовим понятный пример формата для пользователя. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$value = $formatter->parse("завтра");
if ($value === false) {
echo "Укажите точную дату, например 2024-02-29 12:30:00.
";
}
Ожидаемый результат
Укажите точную дату, например 2024-02-29 12:30:00.
Отказ не превращается в дату 1970 года. Пользователь понимает, как исправить поле.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$value = $formatter->parse("завтра");
$diagnostic = $formatter->getErrorMessage();
echo "Формат: ", $formatter->format(1709209800), "
";
echo str_contains($diagnostic, "U_PARSE_ERROR") ? "Для поддержки: текст не соответствует шаблону.
" : "Иная причина.
";
Ожидаемый результат
Формат: 2024-02-29 12:30:00
Для поддержки: текст не соответствует шаблону.
Сохранённая diagnostic не потерялась после успешного format. В обычном интерфейсе техническая часть идёт в журнал, а подсказка остаётся рядом с полем.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->format(0);
echo $formatter->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Диагностика относится к этому форматтеру, не ко всем ранее созданным объектам.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->parse("not a date");
echo str_contains($formatter->getErrorMessage(), "U_PARSE_ERROR") ? "parse failed
" : "other
";
Ожидаемый результат
parse failed
Сообщение для человека должно объяснить ожидаемый формат; технический код нужен разработчику.
Тот же механизм в процедурной форме: datefmt_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure.
datefmt_get_error_messageПрочитать причину отказа разбора/форматирования у текущего объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
datefmt_get_error_message(IntlDateFormatter $formatter): stringПроцедурная форма IntlDateFormatter::getErrorMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int ICU-код либо string сообщения; начальное состояние U_ZERO_ERROR. |
| Когда читать | Сразу после операции. Для failed parse проверяйте ===false: эпоха 0 не ошибка. ICU предупреждение отличается от ошибки через intl_is_failure. |
Начинаем с задачи и одного вызова
Вместо даты посетитель написал "завтра" в поле, которое принимает только точную запись. Нужно объяснить формат и сохранить причину, не выводя страницу с техническим dump.
| Запись в примере | Что именно происходит |
|---|---|
| parse("завтра") | По текущему точному шаблону это ошибка; метод не обязан угадывать естественный язык. |
| getErrorCode()/getErrorMessage() | Читаем статус этого форматтера до следующей операции. |
| format($sample) | Отдельным успешным вызовом готовим понятный пример формата для пользователя. |
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$value = $formatter->parse("завтра");
if ($value === false) {
echo "Укажите точную дату, например 2024-02-29 12:30:00.
";
}
Ожидаемый результат
Укажите точную дату, например 2024-02-29 12:30:00.
Отказ не превращается в дату 1970 года. Пользователь понимает, как исправить поле.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_GB", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm:ss");
$value = $formatter->parse("завтра");
$diagnostic = $formatter->getErrorMessage();
echo "Формат: ", $formatter->format(1709209800), "
";
echo str_contains($diagnostic, "U_PARSE_ERROR") ? "Для поддержки: текст не соответствует шаблону.
" : "Иная причина.
";
Ожидаемый результат
Формат: 2024-02-29 12:30:00
Для поддержки: текст не соответствует шаблону.
Сохранённая diagnostic не потерялась после успешного format. В обычном интерфейсе техническая часть идёт в журнал, а подсказка остаётся рядом с полем.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->format(0);
echo $formatter->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Диагностика относится к этому форматтеру, не ко всем ранее созданным объектам.
<?php
declare(strict_types=1);
$formatter = new IntlDateFormatter("en_US", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, "yyyy-MM-dd HH:mm");
$formatter->parse("not a date");
echo str_contains($formatter->getErrorMessage(), "U_PARSE_ERROR") ? "parse failed
" : "other
";
Ожидаемый результат
parse failed
Сообщение для человека должно объяснить ожидаемый формат; технический код нужен разработчику.
Тот же механизм в процедурной форме: datefmt_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure.
IntlDatePatternGenerator::__constructПопросить дату с нужными полями, сохранив естественный для языка порядок.
PHP 8.1+ · intl
IntlDatePatternGenerator::__construct(?string $locale = null)| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string: язык/регион; null использует intl.default_locale. Конструктор/фабрика появились в PHP 8.1. |
| skeleton | У getBestPattern строка желаемых полей, например yMd: год, месяц, день. Их порядок и разделители выбирает locale. Это не готовый шаблон. |
| Возврат | Фабрика — объект|null; getBestPattern — string|false, пригодная для IntlDateFormatter. Для этой группы процедурных алиасов нет. |
Начинаем с задачи и одного вызова
В интерфейсе нужны год, месяц и день, но их порядок зависит от языка. Skeleton перечисляет нужные поля, а ICU сам подбирает естественную последовательность и разделители.
| Запись в примере | Что именно происходит |
|---|---|
| "yMd" | Состав полей: год, месяц, день. Это skeleton, а не готовый шаблон с порядком вывода. |
| new/create IntlDatePatternGenerator | Готовит генератор для выбранной locale. |
| getBestPattern(...) | Возвращает ICU-шаблон для передачи IntlDateFormatter, не саму дату. |
<?php
declare(strict_types=1);
$generator = new IntlDatePatternGenerator("en_US");
$pattern = $generator->getBestPattern("yMd");
echo "Правило для США: ", $pattern, "
";
Ожидаемый результат
Правило для США: M/d/y
Запрос перечислял y, M, d, но естественный американский порядок начинается с месяца.
<?php
declare(strict_types=1);
$generator = IntlDatePatternGenerator::create("de_DE");
$pattern = $generator->getBestPattern("yMd");
$formatter = new IntlDateFormatter("de_DE", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, $pattern);
echo "Дата заказа: ", $formatter->format(1709209800), "
";
Ожидаемый результат
Дата заказа: 29.2.2024
Генератор выбрал немецкий порядок; форматтер заполнил его полями конкретного заказа. Так не нужна ручная таблица шаблонов для каждой страны.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$generator = new IntlDatePatternGenerator("en_US");
echo $generator->getBestPattern("yMd"), "
";
Ожидаемый результат
M/d/y
Skeleton yMd описывает состав; ICU выбрал месяц/день/год и разделители.
<?php
declare(strict_types=1);
$generator = IntlDatePatternGenerator::create("de_DE");
$pattern = $generator->getBestPattern("yMd");
$formatter = new IntlDateFormatter("de_DE", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, $pattern);
echo $formatter->format(0), "
";
Ожидаемый результат
1.1.1970
Одинаковый skeleton приводит к другому порядку и пунктуации; не нужно вручную поддерживать таблицу форматов стран.
Рядом по задаче: IntlDateFormatter::setPattern.
IntlDatePatternGenerator::createПопросить дату с нужными полями, сохранив естественный для языка порядок.
PHP 8.1+ · intl
static IntlDatePatternGenerator::create(?string $locale = null): ?IntlDatePatternGenerator| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string: язык/регион; null использует intl.default_locale. Конструктор/фабрика появились в PHP 8.1. |
| skeleton | У getBestPattern строка желаемых полей, например yMd: год, месяц, день. Их порядок и разделители выбирает locale. Это не готовый шаблон. |
| Возврат | Фабрика — объект|null; getBestPattern — string|false, пригодная для IntlDateFormatter. Для этой группы процедурных алиасов нет. |
Начинаем с задачи и одного вызова
В интерфейсе нужны год, месяц и день, но их порядок зависит от языка. Skeleton перечисляет нужные поля, а ICU сам подбирает естественную последовательность и разделители.
| Запись в примере | Что именно происходит |
|---|---|
| "yMd" | Состав полей: год, месяц, день. Это skeleton, а не готовый шаблон с порядком вывода. |
| new/create IntlDatePatternGenerator | Готовит генератор для выбранной locale. |
| getBestPattern(...) | Возвращает ICU-шаблон для передачи IntlDateFormatter, не саму дату. |
<?php
declare(strict_types=1);
$generator = new IntlDatePatternGenerator("en_US");
$pattern = $generator->getBestPattern("yMd");
echo "Правило для США: ", $pattern, "
";
Ожидаемый результат
Правило для США: M/d/y
Запрос перечислял y, M, d, но естественный американский порядок начинается с месяца.
<?php
declare(strict_types=1);
$generator = IntlDatePatternGenerator::create("de_DE");
$pattern = $generator->getBestPattern("yMd");
$formatter = new IntlDateFormatter("de_DE", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, $pattern);
echo "Дата заказа: ", $formatter->format(1709209800), "
";
Ожидаемый результат
Дата заказа: 29.2.2024
Генератор выбрал немецкий порядок; форматтер заполнил его полями конкретного заказа. Так не нужна ручная таблица шаблонов для каждой страны.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$generator = new IntlDatePatternGenerator("en_US");
echo $generator->getBestPattern("yMd"), "
";
Ожидаемый результат
M/d/y
Skeleton yMd описывает состав; ICU выбрал месяц/день/год и разделители.
<?php
declare(strict_types=1);
$generator = IntlDatePatternGenerator::create("de_DE");
$pattern = $generator->getBestPattern("yMd");
$formatter = new IntlDateFormatter("de_DE", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, $pattern);
echo $formatter->format(0), "
";
Ожидаемый результат
1.1.1970
Одинаковый skeleton приводит к другому порядку и пунктуации; не нужно вручную поддерживать таблицу форматов стран.
Рядом по задаче: IntlDateFormatter::setPattern.
IntlDatePatternGenerator::getBestPatternПопросить дату с нужными полями, сохранив естественный для языка порядок.
PHP 8.1+ · intl
IntlDatePatternGenerator::getBestPattern(string $skeleton): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| locale | ?string: язык/регион; null использует intl.default_locale. Конструктор/фабрика появились в PHP 8.1. |
| skeleton | У getBestPattern строка желаемых полей, например yMd: год, месяц, день. Их порядок и разделители выбирает locale. Это не готовый шаблон. |
| Возврат | Фабрика — объект|null; getBestPattern — string|false, пригодная для IntlDateFormatter. Для этой группы процедурных алиасов нет. |
Начинаем с задачи и одного вызова
В интерфейсе нужны год, месяц и день, но их порядок зависит от языка. Skeleton перечисляет нужные поля, а ICU сам подбирает естественную последовательность и разделители.
| Запись в примере | Что именно происходит |
|---|---|
| "yMd" | Состав полей: год, месяц, день. Это skeleton, а не готовый шаблон с порядком вывода. |
| new/create IntlDatePatternGenerator | Готовит генератор для выбранной locale. |
| getBestPattern(...) | Возвращает ICU-шаблон для передачи IntlDateFormatter, не саму дату. |
<?php
declare(strict_types=1);
$generator = new IntlDatePatternGenerator("en_US");
$pattern = $generator->getBestPattern("yMd");
echo "Правило для США: ", $pattern, "
";
Ожидаемый результат
Правило для США: M/d/y
Запрос перечислял y, M, d, но естественный американский порядок начинается с месяца.
<?php
declare(strict_types=1);
$generator = IntlDatePatternGenerator::create("de_DE");
$pattern = $generator->getBestPattern("yMd");
$formatter = new IntlDateFormatter("de_DE", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, $pattern);
echo "Дата заказа: ", $formatter->format(1709209800), "
";
Ожидаемый результат
Дата заказа: 29.2.2024
Генератор выбрал немецкий порядок; форматтер заполнил его полями конкретного заказа. Так не нужна ручная таблица шаблонов для каждой страны.
Дополнительные варианты и диагностика
<?php
declare(strict_types=1);
$generator = new IntlDatePatternGenerator("en_US");
echo $generator->getBestPattern("yMd"), "
";
Ожидаемый результат
M/d/y
Skeleton yMd описывает состав; ICU выбрал месяц/день/год и разделители.
<?php
declare(strict_types=1);
$generator = IntlDatePatternGenerator::create("de_DE");
$pattern = $generator->getBestPattern("yMd");
$formatter = new IntlDateFormatter("de_DE", IntlDateFormatter::NONE, IntlDateFormatter::NONE, "UTC", IntlDateFormatter::GREGORIAN, $pattern);
echo $formatter->format(0), "
";
Ожидаемый результат
1.1.1970
Одинаковый skeleton приводит к другому порядку и пунктуации; не нужно вручную поддерживать таблицу форматов стран.
Рядом по задаче: IntlDateFormatter::setPattern.
IntlTimeZone::__constructСоздать часовой пояс через доступную фабрику, а не закрытый конструктор.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::__construct()| Аргумент или результат | Что означает на практике |
|---|---|
| Доступ | private, без аргументов. Для обычного кода используйте createTimeZone, fromDateTimeZone, getGMT или createDefault. |
| Назначение | Объект связывает ID с правилами смещения и переходов ICU; это не дата и не локаль. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getID(), "
";
Ожидаемый результат
UTC
Создание объекта ещё не вычисляет местное время конкретного события.
<?php
declare(strict_types=1);
try { new IntlTimeZone(); } catch (Error $error) { echo "use factory
"; }
Ожидаемый результат
use factory
Ошибка доступа не означает отсутствующее расширение.
Рядом по задаче: IntlTimeZone::createTimeZone.
IntlTimeZone::createTimeZoneВыбрать правила города или фиксированное смещение для календаря/отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::createTimeZone(string $timezoneId): ?IntlTimeZone| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Известный ICU ID, например Europe/Berlin, либо GMT+03:00. Короткие сокращения неоднозначны; предпочитайте региональный ID. |
| Возврат | IntlTimeZone|null. Неизвестный ID может создать специальный Etc/Unknown, а не null: валидируйте ID через getCanonicalID/разрешённый список. null возможен, например, при ошибке преобразования UTF-8. |
| Практическая разница | Europe/Berlin содержит историю и сезонные правила; GMT+01:00 — постоянное смещение и не подменяет город круглый год. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("Europe/Berlin");
echo $zone->getID(), "
";
Ожидаемый результат
Europe/Berlin
Сохраняйте ID как настройку пользователя, а не только текущую разницу часов.
<?php
declare(strict_types=1);
$instant = new DateTimeImmutable('2024-07-01 12:00:00', new DateTimeZone('UTC'));
foreach (['Europe/Moscow', 'Europe/Berlin'] as $zoneId) {
$intlZone = IntlTimeZone::createTimeZone($zoneId);
$phpZone = $intlZone->toDateTimeZone();
if ($phpZone === false) {
echo $zoneId, ": пояс недоступен\n";
continue;
}
echo $zoneId, ': ', $instant->setTimezone($phpZone)->format('H:i'), "\n";
}
Ожидаемый результат
Europe/Moscow: 15:00
Europe/Berlin: 14:00
В базе события достаточно хранить единый UTC-момент и выбранный пользователем ID пояса. Летний Берлин в эту дату имеет UTC+2, Москва — UTC+3. Жёстко прибавлять два или три часа нельзя: правила города и историческая дата влияют на результат. В этом примере IntlTimeZone используется как проверяемая граница с обычным DateTime API.
<?php
declare(strict_types=1);
$zone = intltz_create_time_zone("No/Such_Zone");
var_dump($zone->getID() === IntlTimeZone::getUnknown()->getID());
Ожидаемый результат
bool(true)
Сам факт получения объекта не доказывает, что ID был распознан.
Тот же механизм в процедурной форме: intltz_create_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID, IntlTimeZone::getOffset.
intltz_create_time_zoneВыбрать правила города или фиксированное смещение для календаря/отчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_create_time_zone(string $timezoneId): ?IntlTimeZoneПроцедурная форма IntlTimeZone::createTimeZone. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Известный ICU ID, например Europe/Berlin, либо GMT+03:00. Короткие сокращения неоднозначны; предпочитайте региональный ID. |
| Возврат | IntlTimeZone|null. Неизвестный ID может создать специальный Etc/Unknown, а не null: валидируйте ID через getCanonicalID/разрешённый список. null возможен, например, при ошибке преобразования UTF-8. |
| Практическая разница | Europe/Berlin содержит историю и сезонные правила; GMT+01:00 — постоянное смещение и не подменяет город круглый год. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("Europe/Berlin");
echo $zone->getID(), "
";
Ожидаемый результат
Europe/Berlin
Сохраняйте ID как настройку пользователя, а не только текущую разницу часов.
<?php
declare(strict_types=1);
$instant = new DateTimeImmutable('2024-07-01 12:00:00', new DateTimeZone('UTC'));
foreach (['Europe/Moscow', 'Europe/Berlin'] as $zoneId) {
$intlZone = IntlTimeZone::createTimeZone($zoneId);
$phpZone = $intlZone->toDateTimeZone();
if ($phpZone === false) {
echo $zoneId, ": пояс недоступен\n";
continue;
}
echo $zoneId, ': ', $instant->setTimezone($phpZone)->format('H:i'), "\n";
}
Ожидаемый результат
Europe/Moscow: 15:00
Europe/Berlin: 14:00
В базе события достаточно хранить единый UTC-момент и выбранный пользователем ID пояса. Летний Берлин в эту дату имеет UTC+2, Москва — UTC+3. Жёстко прибавлять два или три часа нельзя: правила города и историческая дата влияют на результат. В этом примере IntlTimeZone используется как проверяемая граница с обычным DateTime API.
<?php
declare(strict_types=1);
$zone = intltz_create_time_zone("No/Such_Zone");
var_dump($zone->getID() === IntlTimeZone::getUnknown()->getID());
Ожидаемый результат
bool(true)
Сам факт получения объекта не доказывает, что ID был распознан.
Тот же механизм в процедурной форме: intltz_create_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID, IntlTimeZone::getOffset.
IntlTimeZone::createDefaultПолучить отдельный объект системного пояса по умолчанию ICU.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::createDefault(): IntlTimeZone| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | IntlTimeZone. Это default среды ICU/хоста: не считайте его автоматически выбранным пользователем или синхронным с date_default_timezone_set PHP. |
| Применение | Диагностика среды и настольные инструменты. В веб-сервисе для воспроизводимости явно выбирайте UTC или сохранённый пояс получателя. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createDefault();
var_dump($zone instanceof IntlTimeZone, is_string($zone->getID()));
Ожидаемый результат
bool(true)
bool(true)
Точный ID намеренно не закреплён: он зависит от компьютера, где запущен пример.
<?php
declare(strict_types=1);
$host = intltz_create_default();
$report = IntlTimeZone::createTimeZone("UTC");
echo $report->getID(), "
";
Ожидаемый результат
UTC
Пояс сервера и пояс отчёта — разные решения.
Тот же механизм в процедурной форме: intltz_create_default. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createTimeZone.
intltz_create_defaultПолучить отдельный объект системного пояса по умолчанию ICU.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_create_default(): IntlTimeZoneПроцедурная форма IntlTimeZone::createDefault. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | IntlTimeZone. Это default среды ICU/хоста: не считайте его автоматически выбранным пользователем или синхронным с date_default_timezone_set PHP. |
| Применение | Диагностика среды и настольные инструменты. В веб-сервисе для воспроизводимости явно выбирайте UTC или сохранённый пояс получателя. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createDefault();
var_dump($zone instanceof IntlTimeZone, is_string($zone->getID()));
Ожидаемый результат
bool(true)
bool(true)
Точный ID намеренно не закреплён: он зависит от компьютера, где запущен пример.
<?php
declare(strict_types=1);
$host = intltz_create_default();
$report = IntlTimeZone::createTimeZone("UTC");
echo $report->getID(), "
";
Ожидаемый результат
UTC
Пояс сервера и пояс отчёта — разные решения.
Тот же механизм в процедурной форме: intltz_create_default. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createTimeZone.
IntlTimeZone::getGMTПолучить эталонный пояс с нулевым смещением.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::getGMT(): IntlTimeZone| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | IntlTimeZone. GMT не использует сезонное время. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::getGMT();
echo $zone->getID(), "
";
Ожидаемый результат
GMT
ID сохраняет смысл объекта лучше, чем один числовой offset.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::getGMT();
echo $zone->getRawOffset(), "
";
var_dump($zone->useDaylightTime());
Ожидаемый результат
0
bool(false)
Одинаковое числовое смещение не делает неизвестную настройку подтверждённым выбором пользователя.
Тот же механизм в процедурной форме: intltz_get_gmt. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createTimeZone.
intltz_get_gmtПолучить эталонный пояс с нулевым смещением.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_gmt(): IntlTimeZoneПроцедурная форма IntlTimeZone::getGMT. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | IntlTimeZone. GMT не использует сезонное время. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::getGMT();
echo $zone->getID(), "
";
Ожидаемый результат
GMT
ID сохраняет смысл объекта лучше, чем один числовой offset.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::getGMT();
echo $zone->getRawOffset(), "
";
var_dump($zone->useDaylightTime());
Ожидаемый результат
0
bool(false)
Одинаковое числовое смещение не делает неизвестную настройку подтверждённым выбором пользователя.
Тот же механизм в процедурной форме: intltz_get_gmt. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createTimeZone.
IntlTimeZone::getUnknownПолучить специальное значение неизвестного пояса для диагностики.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::getUnknown(): IntlTimeZone| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | IntlTimeZone. Etc/Unknown не должен молча означать, что пользователь выбрал UTC, даже если числовое смещение равно нулю. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::getUnknown();
echo $zone->getID(), "
";
Ожидаемый результат
Etc/Unknown
ID сохраняет смысл объекта лучше, чем один числовой offset.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::getUnknown();
echo $zone->getRawOffset(), "
";
var_dump($zone->useDaylightTime());
Ожидаемый результат
0
bool(false)
Одинаковое числовое смещение не делает неизвестную настройку подтверждённым выбором пользователя.
Тот же механизм в процедурной форме: intltz_get_unknown. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createTimeZone.
intltz_get_unknownПолучить специальное значение неизвестного пояса для диагностики.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_unknown(): IntlTimeZoneПроцедурная форма IntlTimeZone::getUnknown. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | IntlTimeZone. Etc/Unknown не должен молча означать, что пользователь выбрал UTC, даже если числовое смещение равно нулю. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::getUnknown();
echo $zone->getID(), "
";
Ожидаемый результат
Etc/Unknown
ID сохраняет смысл объекта лучше, чем один числовой offset.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::getUnknown();
echo $zone->getRawOffset(), "
";
var_dump($zone->useDaylightTime());
Ожидаемый результат
0
bool(false)
Одинаковое числовое смещение не делает неизвестную настройку подтверждённым выбором пользователя.
Тот же механизм в процедурной форме: intltz_get_unknown. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createTimeZone.
IntlTimeZone::createEnumerationПолучить список поясов для выбора или найти пояса указанного региона/базового смещения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::createEnumeration(string|int|null $countryOrRawOffset = null): IntlIterator|false| Аргумент или результат | Что означает на практике |
|---|---|
| countryOrRawOffset | null — все ID; string — двухбуквенный код региона; int — базовое смещение в миллисекундах без DST. Не передавайте смещение как строку: это другая ветка API. |
| Возврат | IntlIterator|false; обходите foreach. Несколько поясов с одинаковым raw offset могут иметь разные переходы, поэтому offset не выбирает один уникальный город. |
<?php
declare(strict_types=1);
$ids = iterator_to_array(IntlTimeZone::createEnumeration("DE"), false);
var_dump(in_array("Europe/Berlin", $ids, true));
Ожидаемый результат
bool(true)
Для небольшого списка формы массив удобен; для большого обхода можно оставить итератор.
<?php
declare(strict_types=1);
$ids = iterator_to_array(intltz_create_enumeration(3600000), false);
var_dump(in_array("Europe/Berlin", $ids, true));
Ожидаемый результат
bool(true)
3600000 — миллисекунды, а не секунды. Летнее фактическое смещение может отличаться.
Тот же механизм в процедурной форме: intltz_create_enumeration. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createTimeZoneIDEnumeration.
intltz_create_enumerationПолучить список поясов для выбора или найти пояса указанного региона/базового смещения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_create_enumeration(string|int|null $countryOrRawOffset = null): IntlIterator|falseПроцедурная форма IntlTimeZone::createEnumeration. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| countryOrRawOffset | null — все ID; string — двухбуквенный код региона; int — базовое смещение в миллисекундах без DST. Не передавайте смещение как строку: это другая ветка API. |
| Возврат | IntlIterator|false; обходите foreach. Несколько поясов с одинаковым raw offset могут иметь разные переходы, поэтому offset не выбирает один уникальный город. |
<?php
declare(strict_types=1);
$ids = iterator_to_array(IntlTimeZone::createEnumeration("DE"), false);
var_dump(in_array("Europe/Berlin", $ids, true));
Ожидаемый результат
bool(true)
Для небольшого списка формы массив удобен; для большого обхода можно оставить итератор.
<?php
declare(strict_types=1);
$ids = iterator_to_array(intltz_create_enumeration(3600000), false);
var_dump(in_array("Europe/Berlin", $ids, true));
Ожидаемый результат
bool(true)
3600000 — миллисекунды, а не секунды. Летнее фактическое смещение может отличаться.
Тот же механизм в процедурной форме: intltz_create_enumeration. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createTimeZoneIDEnumeration.
IntlTimeZone::createTimeZoneIDEnumerationСобрать список канонических поясов без лишних исторических алиасов и ограничить его регионом/смещением.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::createTimeZoneIDEnumeration(int $type, ?string $region = null, ?int $rawOffset = null): IntlIterator|false| Аргумент или результат | Что означает на практике |
|---|---|
| type | TYPE_ANY, TYPE_CANONICAL или TYPE_CANONICAL_LOCATION. Неверное значение вызывает ValueError. |
| region,rawOffset | Необязательные фильтры: код региона и базовое смещение int32 в миллисекундах. null отключает соответствующий фильтр. Выход rawOffset за int32 вызывает ValueError. |
| Возврат | IntlIterator|false. Каноническая локация удобна для выбора города; набор зависит от ICU TZDB. |
<?php
declare(strict_types=1);
$ids = iterator_to_array(IntlTimeZone::createTimeZoneIDEnumeration(IntlTimeZone::TYPE_CANONICAL_LOCATION, "DE"), false);
var_dump(in_array("Europe/Berlin", $ids, true));
Ожидаемый результат
bool(true)
Убираются алиасы, но не следует фиксировать число всех поясов на будущие версии.
<?php
declare(strict_types=1);
$ids = iterator_to_array(intltz_create_time_zone_id_enumeration(IntlTimeZone::TYPE_CANONICAL, "DE", 3600000), false);
var_dump(in_array("Europe/Berlin", $ids, true));
Ожидаемый результат
bool(true)
Фильтры работают совместно; raw offset ещё не сообщает сезонный сдвиг в конкретную дату.
Тот же механизм в процедурной форме: intltz_create_time_zone_id_enumeration. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
intltz_create_time_zone_id_enumerationСобрать список канонических поясов без лишних исторических алиасов и ограничить его регионом/смещением.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_create_time_zone_id_enumeration(int $type, ?string $region = null, ?int $rawOffset = null): IntlIterator|falseПроцедурная форма IntlTimeZone::createTimeZoneIDEnumeration. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| type | TYPE_ANY, TYPE_CANONICAL или TYPE_CANONICAL_LOCATION. Неверное значение вызывает ValueError. |
| region,rawOffset | Необязательные фильтры: код региона и базовое смещение int32 в миллисекундах. null отключает соответствующий фильтр. Выход rawOffset за int32 вызывает ValueError. |
| Возврат | IntlIterator|false. Каноническая локация удобна для выбора города; набор зависит от ICU TZDB. |
<?php
declare(strict_types=1);
$ids = iterator_to_array(IntlTimeZone::createTimeZoneIDEnumeration(IntlTimeZone::TYPE_CANONICAL_LOCATION, "DE"), false);
var_dump(in_array("Europe/Berlin", $ids, true));
Ожидаемый результат
bool(true)
Убираются алиасы, но не следует фиксировать число всех поясов на будущие версии.
<?php
declare(strict_types=1);
$ids = iterator_to_array(intltz_create_time_zone_id_enumeration(IntlTimeZone::TYPE_CANONICAL, "DE", 3600000), false);
var_dump(in_array("Europe/Berlin", $ids, true));
Ожидаемый результат
bool(true)
Фильтры работают совместно; raw offset ещё не сообщает сезонный сдвиг в конкретную дату.
Тот же механизм в процедурной форме: intltz_create_time_zone_id_enumeration. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
IntlTimeZone::fromDateTimeZoneПередать выбранный PHP-пояс в календарную инфраструктуру ICU.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::fromDateTimeZone(DateTimeZone $timezone): ?IntlTimeZone| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | Инициализированный DateTimeZone. |
| Возврат | IntlTimeZone|null. Конверсия использует ID/смещение и данные ICU; она не переносит внутрь ICU всю таблицу переходов из PHP. Неизвестный ICU ID может не преобразоваться. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::fromDateTimeZone(new DateTimeZone("UTC"));
echo $zone->getID(), "
";
Ожидаемый результат
UTC
Два класса обслуживают разные библиотеки, хотя описывают похожую сущность.
<?php
declare(strict_types=1);
$zone = intltz_from_date_time_zone(new DateTimeZone("+03:00"));
echo $zone->getRawOffset(), "
";
Ожидаемый результат
10800000
Сдвиг три часа выражен в миллисекундах ICU.
Тот же механизм в процедурной форме: intltz_from_date_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::toDateTimeZone.
intltz_from_date_time_zoneПередать выбранный PHP-пояс в календарную инфраструктуру ICU.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_from_date_time_zone(DateTimeZone $timezone): ?IntlTimeZoneПроцедурная форма IntlTimeZone::fromDateTimeZone. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | Инициализированный DateTimeZone. |
| Возврат | IntlTimeZone|null. Конверсия использует ID/смещение и данные ICU; она не переносит внутрь ICU всю таблицу переходов из PHP. Неизвестный ICU ID может не преобразоваться. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::fromDateTimeZone(new DateTimeZone("UTC"));
echo $zone->getID(), "
";
Ожидаемый результат
UTC
Два класса обслуживают разные библиотеки, хотя описывают похожую сущность.
<?php
declare(strict_types=1);
$zone = intltz_from_date_time_zone(new DateTimeZone("+03:00"));
echo $zone->getRawOffset(), "
";
Ожидаемый результат
10800000
Сдвиг три часа выражен в миллисекундах ICU.
Тот же механизм в процедурной форме: intltz_from_date_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::toDateTimeZone.
IntlTimeZone::toDateTimeZoneПередать пояс из ICU в обычные DateTime/DateTimeImmutable PHP.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::toDateTimeZone(): DateTimeZone|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | DateTimeZone|false; несовместимое имя/конверсия могут завершиться ошибкой. После перехода действуют данные и API PHP. |
| Граница | Исторические правила могут отличаться при разных версиях баз. Проверяйте значимые даты после обновления, а не только одинаковость строк ID. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$phpZone = $zone->toDateTimeZone();
echo $phpZone->getName(), "
";
Ожидаемый результат
UTC
Теперь объект можно передать конструктору DateTimeImmutable.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$phpZone = intltz_to_date_time_zone($zone);
$date = new DateTimeImmutable("1970-01-01 00:00:00", $phpZone);
echo $date->getTimestamp(), "
";
Ожидаемый результат
0
Timestamp PHP измеряется секундами, несмотря на миллисекунды в IntlTimeZone API.
Тот же механизм в процедурной форме: intltz_to_date_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::fromDateTimeZone.
intltz_to_date_time_zoneПередать пояс из ICU в обычные DateTime/DateTimeImmutable PHP.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_to_date_time_zone(IntlTimeZone $timezone): DateTimeZone|falseПроцедурная форма IntlTimeZone::toDateTimeZone. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | DateTimeZone|false; несовместимое имя/конверсия могут завершиться ошибкой. После перехода действуют данные и API PHP. |
| Граница | Исторические правила могут отличаться при разных версиях баз. Проверяйте значимые даты после обновления, а не только одинаковость строк ID. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$phpZone = $zone->toDateTimeZone();
echo $phpZone->getName(), "
";
Ожидаемый результат
UTC
Теперь объект можно передать конструктору DateTimeImmutable.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$phpZone = intltz_to_date_time_zone($zone);
$date = new DateTimeImmutable("1970-01-01 00:00:00", $phpZone);
echo $date->getTimestamp(), "
";
Ожидаемый результат
0
Timestamp PHP измеряется секундами, несмотря на миллисекунды в IntlTimeZone API.
Тот же механизм в процедурной форме: intltz_to_date_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::fromDateTimeZone.
IntlTimeZone::getCanonicalIDНормализовать алиас пояса и проверить, относится ли он к системной базе или задан вручную.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::getCanonicalID(string $timezoneId, &$isSystemId = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Исходный ICU ID либо custom GMT-смещение. |
| isSystemId | Необязательная переменная bool по ссылке: true для системного ID, false для корректного custom offset. |
| Возврат | string|false: каноническое системное имя или нормализованное custom имя. false означает, что ID нельзя разрешить. Канонизация ICU и предпочтительное IANA имя не всегда одна операция. |
<?php
declare(strict_types=1);
$system = false;
echo IntlTimeZone::getCanonicalID("US/Eastern", $system), "
";
var_dump($system);
Ожидаемый результат
America/New_York
bool(true)
Для хранения нового выбора удобнее каноническое имя.
<?php
declare(strict_types=1);
foreach (['US/Eastern', 'GMT+3', 'No/Such_Zone'] as $submitted) {
$isSystem = false;
$canonical = IntlTimeZone::getCanonicalID($submitted, $isSystem);
if ($canonical === false || !$isSystem) {
echo $submitted, ": выберите город из списка\n";
continue;
}
echo $submitted, ' -> ', $canonical, "\n";
}
Ожидаемый результат
US/Eastern -> America/New_York
GMT+3: выберите город из списка
No/Such_Zone: выберите город из списка
Исторический алиас превращён в канонический системный ID. Фиксированное GMT+3 технически допустимо, но эта форма намеренно требует город с историческими правилами; это бизнес-решение, а не универсальный запрет offset. Неизвестное имя не подменяется UTC, иначе пользователь не заметит ошибку.
<?php
declare(strict_types=1);
$system = true;
echo intltz_get_canonical_id("GMT+3", $system), "
";
var_dump($system);
Ожидаемый результат
GMT+03:00
bool(false)
Корректное фиксированное смещение не является локацией со своей историей переходов.
Тот же механизм в процедурной форме: intltz_get_canonical_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getIanaID, IntlTimeZone::createTimeZone.
intltz_get_canonical_idНормализовать алиас пояса и проверить, относится ли он к системной базе или задан вручную.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_canonical_id(string $timezoneId, &$isSystemId = null): string|falseПроцедурная форма IntlTimeZone::getCanonicalID. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Исходный ICU ID либо custom GMT-смещение. |
| isSystemId | Необязательная переменная bool по ссылке: true для системного ID, false для корректного custom offset. |
| Возврат | string|false: каноническое системное имя или нормализованное custom имя. false означает, что ID нельзя разрешить. Канонизация ICU и предпочтительное IANA имя не всегда одна операция. |
<?php
declare(strict_types=1);
$system = false;
echo IntlTimeZone::getCanonicalID("US/Eastern", $system), "
";
var_dump($system);
Ожидаемый результат
America/New_York
bool(true)
Для хранения нового выбора удобнее каноническое имя.
<?php
declare(strict_types=1);
foreach (['US/Eastern', 'GMT+3', 'No/Such_Zone'] as $submitted) {
$isSystem = false;
$canonical = IntlTimeZone::getCanonicalID($submitted, $isSystem);
if ($canonical === false || !$isSystem) {
echo $submitted, ": выберите город из списка\n";
continue;
}
echo $submitted, ' -> ', $canonical, "\n";
}
Ожидаемый результат
US/Eastern -> America/New_York
GMT+3: выберите город из списка
No/Such_Zone: выберите город из списка
Исторический алиас превращён в канонический системный ID. Фиксированное GMT+3 технически допустимо, но эта форма намеренно требует город с историческими правилами; это бизнес-решение, а не универсальный запрет offset. Неизвестное имя не подменяется UTC, иначе пользователь не заметит ошибку.
<?php
declare(strict_types=1);
$system = true;
echo intltz_get_canonical_id("GMT+3", $system), "
";
var_dump($system);
Ожидаемый результат
GMT+03:00
bool(false)
Корректное фиксированное смещение не является локацией со своей историей переходов.
Тот же механизм в процедурной форме: intltz_get_canonical_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getIanaID, IntlTimeZone::createTimeZone.
IntlTimeZone::getIanaIDПолучить предпочтительное имя IANA для совместимого обмена настройками часового пояса.
PHP 8.4; ICU 74+ · intl
static IntlTimeZone::getIanaID(string $timezoneId): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | ID или алиас, например US/Eastern. |
| Возврат | string|false. Требует ICU 74+. Для старых окружений проверяйте наличие метода/версии; не подменяйте молча произвольной строковой заменой. |
<?php
declare(strict_types=1);
echo IntlTimeZone::getIanaID("US/Eastern"), "
";
Ожидаемый результат
America/New_York
Используется при переносе настроек между сервисами с IANA-идентификаторами.
<?php
declare(strict_types=1);
echo intltz_get_iana_id("GMT"), "
";
Ожидаемый результат
Etc/GMT
Имена сохраняют соглашения конкретной базы; это не вычисление offset.
Тот же механизм в процедурной форме: intltz_get_iana_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
intltz_get_iana_idПолучить предпочтительное имя IANA для совместимого обмена настройками часового пояса.
PHP 8.4; ICU 74+ · intl
intltz_get_iana_id(string $timezoneId): string|falseПроцедурная форма IntlTimeZone::getIanaID. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | ID или алиас, например US/Eastern. |
| Возврат | string|false. Требует ICU 74+. Для старых окружений проверяйте наличие метода/версии; не подменяйте молча произвольной строковой заменой. |
<?php
declare(strict_types=1);
echo IntlTimeZone::getIanaID("US/Eastern"), "
";
Ожидаемый результат
America/New_York
Используется при переносе настроек между сервисами с IANA-идентификаторами.
<?php
declare(strict_types=1);
echo intltz_get_iana_id("GMT"), "
";
Ожидаемый результат
Etc/GMT
Имена сохраняют соглашения конкретной базы; это не вычисление offset.
Тот же механизм в процедурной форме: intltz_get_iana_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
IntlTimeZone::countEquivalentIDsНайти группу эквивалентных ID, чтобы понять исторические алиасы одного набора правил.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::countEquivalentIDs(string $timezoneId): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID. count включает сам ID и даёт 0 для неизвестного/несистемного значения. |
| offset | У getEquivalentID это индекс 0…count−1, не часовой сдвиг. За пределами группы ICU возвращает пустую строку. |
| Возврат | count: int|false; get: string|false. Не выводите из совпадения алиасов геолокацию пользователя; набор и канонические имена могут меняться. |
<?php
declare(strict_types=1);
var_dump(IntlTimeZone::countEquivalentIDs("America/New_York") > 0);
Ожидаемый результат
bool(true)
Не закрепляем порядок всех алиасов: он определяется данными ICU.
<?php
declare(strict_types=1);
echo intltz_count_equivalent_ids("No/Such_Zone"), "
";
Ожидаемый результат
0
Пустой результат не является пригодным поясом для отчёта.
Тот же механизм в процедурной форме: intltz_count_equivalent_ids. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
intltz_count_equivalent_idsНайти группу эквивалентных ID, чтобы понять исторические алиасы одного набора правил.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_count_equivalent_ids(string $timezoneId): int|falseПроцедурная форма IntlTimeZone::countEquivalentIDs. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID. count включает сам ID и даёт 0 для неизвестного/несистемного значения. |
| offset | У getEquivalentID это индекс 0…count−1, не часовой сдвиг. За пределами группы ICU возвращает пустую строку. |
| Возврат | count: int|false; get: string|false. Не выводите из совпадения алиасов геолокацию пользователя; набор и канонические имена могут меняться. |
<?php
declare(strict_types=1);
var_dump(IntlTimeZone::countEquivalentIDs("America/New_York") > 0);
Ожидаемый результат
bool(true)
Не закрепляем порядок всех алиасов: он определяется данными ICU.
<?php
declare(strict_types=1);
echo intltz_count_equivalent_ids("No/Such_Zone"), "
";
Ожидаемый результат
0
Пустой результат не является пригодным поясом для отчёта.
Тот же механизм в процедурной форме: intltz_count_equivalent_ids. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
IntlTimeZone::getEquivalentIDНайти группу эквивалентных ID, чтобы понять исторические алиасы одного набора правил.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::getEquivalentID(string $timezoneId, int $offset): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID. count включает сам ID и даёт 0 для неизвестного/несистемного значения. |
| offset | У getEquivalentID это индекс 0…count−1, не часовой сдвиг. За пределами группы ICU возвращает пустую строку. |
| Возврат | count: int|false; get: string|false. Не выводите из совпадения алиасов геолокацию пользователя; набор и канонические имена могут меняться. |
<?php
declare(strict_types=1);
$id = IntlTimeZone::getEquivalentID("America/New_York", 0);
var_dump(is_string($id) && $id !== "");
Ожидаемый результат
bool(true)
Не закрепляем порядок всех алиасов: он определяется данными ICU.
<?php
declare(strict_types=1);
var_dump(intltz_get_equivalent_id("No/Such_Zone", 0));
Ожидаемый результат
string(0) ""
Пустой результат не является пригодным поясом для отчёта.
Тот же механизм в процедурной форме: intltz_get_equivalent_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
intltz_get_equivalent_idНайти группу эквивалентных ID, чтобы понять исторические алиасы одного набора правил.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_equivalent_id(string $timezoneId, int $offset): string|falseПроцедурная форма IntlTimeZone::getEquivalentID. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID. count включает сам ID и даёт 0 для неизвестного/несистемного значения. |
| offset | У getEquivalentID это индекс 0…count−1, не часовой сдвиг. За пределами группы ICU возвращает пустую строку. |
| Возврат | count: int|false; get: string|false. Не выводите из совпадения алиасов геолокацию пользователя; набор и канонические имена могут меняться. |
<?php
declare(strict_types=1);
$id = IntlTimeZone::getEquivalentID("America/New_York", 0);
var_dump(is_string($id) && $id !== "");
Ожидаемый результат
bool(true)
Не закрепляем порядок всех алиасов: он определяется данными ICU.
<?php
declare(strict_types=1);
var_dump(intltz_get_equivalent_id("No/Such_Zone", 0));
Ожидаемый результат
string(0) ""
Пустой результат не является пригодным поясом для отчёта.
Тот же механизм в процедурной форме: intltz_get_equivalent_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
IntlTimeZone::getIDПрочитать идентификатор пояса, который хранится в объекте.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::getID(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string|false. Может сохраняться алиас или custom ID; для нормализации нужен getCanonicalID. |
| Применение | Хранение/диагностика настройки. Для подписи человеку используйте getDisplayName, но сохраняйте ID отдельно от локализованного названия. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getID(), "
";
Ожидаемый результат
UTC
ID не зависит от языка интерфейса.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo intltz_get_id($zone), "
";
Ожидаемый результат
GMT+03:00
Фиксированный offset остаётся отдельным типом выбора, а не автоматически превращается в название города.
Тот же механизм в процедурной форме: intltz_get_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getDisplayName, IntlTimeZone::getCanonicalID.
intltz_get_idПрочитать идентификатор пояса, который хранится в объекте.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_id(IntlTimeZone $timezone): string|falseПроцедурная форма IntlTimeZone::getID. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string|false. Может сохраняться алиас или custom ID; для нормализации нужен getCanonicalID. |
| Применение | Хранение/диагностика настройки. Для подписи человеку используйте getDisplayName, но сохраняйте ID отдельно от локализованного названия. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getID(), "
";
Ожидаемый результат
UTC
ID не зависит от языка интерфейса.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo intltz_get_id($zone), "
";
Ожидаемый результат
GMT+03:00
Фиксированный offset остаётся отдельным типом выбора, а не автоматически превращается в название города.
Тот же механизм в процедурной форме: intltz_get_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getDisplayName, IntlTimeZone::getCanonicalID.
IntlTimeZone::getDisplayNameПодписать часовой пояс в настройках интерфейса понятным локализованным названием.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::getDisplayName(bool $dst = false, int $style = IntlTimeZone::DISPLAY_LONG, ?string $locale = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| dst | Попросить название стандартного или сезонного времени; это не проверка, действует ли DST сейчас. |
| style,locale | Один из DISPLAY_* и язык подписи; null берёт default locale. Неверный стиль даёт false и ошибку ICU. |
| Возврат | string|false. Название зависит от ICU/CLDR и не подходит как ключ БД. Для точного смещения конкретного события вызывайте getOffset. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo $zone->getDisplayName(false, IntlTimeZone::DISPLAY_LONG_GMT, "en"), "
";
Ожидаемый результат
GMT+03:00
Явный стиль показывает смещение, а не неопределённое сокращение.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$label = intltz_get_display_name($zone, false, IntlTimeZone::DISPLAY_LONG, "en");
var_dump(is_string($label) && $label !== "");
Ожидаемый результат
bool(true)
Точную формулировку подписи предоставляет ICU; её обновление не должно ломать сохранённую настройку.
Тот же механизм в процедурной форме: intltz_get_display_name. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getID, IntlTimeZone::getOffset.
intltz_get_display_nameПодписать часовой пояс в настройках интерфейса понятным локализованным названием.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_display_name(IntlTimeZone $timezone, bool $dst = false, int $style = IntlTimeZone::DISPLAY_LONG, ?string $locale = null): string|falseПроцедурная форма IntlTimeZone::getDisplayName. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| dst | Попросить название стандартного или сезонного времени; это не проверка, действует ли DST сейчас. |
| style,locale | Один из DISPLAY_* и язык подписи; null берёт default locale. Неверный стиль даёт false и ошибку ICU. |
| Возврат | string|false. Название зависит от ICU/CLDR и не подходит как ключ БД. Для точного смещения конкретного события вызывайте getOffset. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo $zone->getDisplayName(false, IntlTimeZone::DISPLAY_LONG_GMT, "en"), "
";
Ожидаемый результат
GMT+03:00
Явный стиль показывает смещение, а не неопределённое сокращение.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$label = intltz_get_display_name($zone, false, IntlTimeZone::DISPLAY_LONG, "en");
var_dump(is_string($label) && $label !== "");
Ожидаемый результат
bool(true)
Точную формулировку подписи предоставляет ICU; её обновление не должно ломать сохранённую настройку.
Тот же механизм в процедурной форме: intltz_get_display_name. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getID, IntlTimeZone::getOffset.
IntlTimeZone::getOffsetВычислить базовый и сезонный сдвиг для конкретного момента, например при показе событий разных городов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::getOffset(float $timestamp, bool $local, &$rawOffset, &$dstOffset): bool| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | float: миллисекунды с Unix-эпохи! Для time()/DateTime timestamp умножайте секунды на 1000. |
| local | false: вход обозначает UTC-момент; true: локальные настенные поля, закодированные числом. Для событий с известным моментом обычно нужен false; местное время на переходе DST бывает неоднозначным. |
| rawOffset,dstOffset | Две переменные по ссылке получают миллисекунды. Полный сдвиг = raw + dst; base без DST недостаточен. |
| Возврат | bool. Значения выходных переменных используйте только при успехе. Функция не создаёт DateTime и не меняет сам момент. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
$raw = $dst = 0;
$zone->getOffset(0.0, false, $raw, $dst);
echo $raw, " / ", $dst, "
";
Ожидаемый результат
10800000 / 0
Три часа — 10800000 миллисекунд; сезонного дополнения нет.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("Europe/Berlin");
$instant = new DateTimeImmutable("2024-07-01 00:00:00", new DateTimeZone("UTC"));
$raw = $dst = 0;
intltz_get_offset($zone, $instant->getTimestamp() * 1000.0, false, $raw, $dst);
echo $raw / 3600000, " + ", $dst / 3600000, " hours
";
Ожидаемый результат
1 + 1 hours
Итог +2 часа складывается из стандартного +1 и сезонного +1 в эту историческую дату.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone('Europe/Berlin');
$instant = new DateTimeImmutable('2024-07-01 12:00:00', new DateTimeZone('UTC'));
$raw = $dst = 0;
if (!$zone->getOffset($instant->getTimestamp() * 1000.0, false, $raw, $dst)) {
throw new RuntimeException($zone->getErrorMessage());
}
printf(
"Базовое: %+d ч; сезонное: %+d ч; итог: %+d ч\n",
$raw / 3600000,
$dst / 3600000,
($raw + $dst) / 3600000,
);
Ожидаемый результат
Базовое: +1 ч; сезонное: +1 ч; итог: +2 ч
В журнале видны обе составляющие, поэтому разработчик не путает raw offset с действующим смещением. Входной timestamp умножен на 1000: DateTime возвращает секунды, IntlTimeZone ожидает миллисекунды. Такой лог полезен при расхождении расписаний между серверами; рядом стоит сохранять версии ICU и TZDB.
Тот же механизм в процедурной форме: intltz_get_offset. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getRawOffset, IntlCalendar::setTime.
intltz_get_offsetВычислить базовый и сезонный сдвиг для конкретного момента, например при показе событий разных городов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_offset(IntlTimeZone $timezone, float $timestamp, bool $local, &$rawOffset, &$dstOffset): boolПроцедурная форма IntlTimeZone::getOffset. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | float: миллисекунды с Unix-эпохи! Для time()/DateTime timestamp умножайте секунды на 1000. |
| local | false: вход обозначает UTC-момент; true: локальные настенные поля, закодированные числом. Для событий с известным моментом обычно нужен false; местное время на переходе DST бывает неоднозначным. |
| rawOffset,dstOffset | Две переменные по ссылке получают миллисекунды. Полный сдвиг = raw + dst; base без DST недостаточен. |
| Возврат | bool. Значения выходных переменных используйте только при успехе. Функция не создаёт DateTime и не меняет сам момент. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
$raw = $dst = 0;
$zone->getOffset(0.0, false, $raw, $dst);
echo $raw, " / ", $dst, "
";
Ожидаемый результат
10800000 / 0
Три часа — 10800000 миллисекунд; сезонного дополнения нет.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("Europe/Berlin");
$instant = new DateTimeImmutable("2024-07-01 00:00:00", new DateTimeZone("UTC"));
$raw = $dst = 0;
intltz_get_offset($zone, $instant->getTimestamp() * 1000.0, false, $raw, $dst);
echo $raw / 3600000, " + ", $dst / 3600000, " hours
";
Ожидаемый результат
1 + 1 hours
Итог +2 часа складывается из стандартного +1 и сезонного +1 в эту историческую дату.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone('Europe/Berlin');
$instant = new DateTimeImmutable('2024-07-01 12:00:00', new DateTimeZone('UTC'));
$raw = $dst = 0;
if (!$zone->getOffset($instant->getTimestamp() * 1000.0, false, $raw, $dst)) {
throw new RuntimeException($zone->getErrorMessage());
}
printf(
"Базовое: %+d ч; сезонное: %+d ч; итог: %+d ч\n",
$raw / 3600000,
$dst / 3600000,
($raw + $dst) / 3600000,
);
Ожидаемый результат
Базовое: +1 ч; сезонное: +1 ч; итог: +2 ч
В журнале видны обе составляющие, поэтому разработчик не путает raw offset с действующим смещением. Входной timestamp умножен на 1000: DateTime возвращает секунды, IntlTimeZone ожидает миллисекунды. Такой лог полезен при расхождении расписаний между серверами; рядом стоит сохранять версии ICU и TZDB.
Тот же механизм в процедурной форме: intltz_get_offset. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getRawOffset, IntlCalendar::setTime.
IntlTimeZone::getRawOffsetПрочитать стандартное смещение без сезонной поправки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::getRawOffset(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; процедурный алиас принимает timezone. |
| Возврат | int миллисекунд; это не обязательно полный сдвиг на дату события. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getRawOffset(), "
";
Ожидаемый результат
0
UTC не нуждается в сезонном переводе часов.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo $zone->getRawOffset(), "
";
Ожидаемый результат
10800000
Для getDSTSavings здесь ICU SimpleTimeZone возвращает внутреннее значение 3600000 даже при useDaylightTime=false. Оно не является активным сдвигом: используйте getOffset для даты. Если нужен город с переходами, фиксированного смещения недостаточно.
Тот же механизм в процедурной форме: intltz_get_raw_offset. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
intltz_get_raw_offsetПрочитать стандартное смещение без сезонной поправки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_raw_offset(IntlTimeZone $timezone): intПроцедурная форма IntlTimeZone::getRawOffset. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; процедурный алиас принимает timezone. |
| Возврат | int миллисекунд; это не обязательно полный сдвиг на дату события. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getRawOffset(), "
";
Ожидаемый результат
0
UTC не нуждается в сезонном переводе часов.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo $zone->getRawOffset(), "
";
Ожидаемый результат
10800000
Для getDSTSavings здесь ICU SimpleTimeZone возвращает внутреннее значение 3600000 даже при useDaylightTime=false. Оно не является активным сдвигом: используйте getOffset для даты. Если нужен город с переходами, фиксированного смещения недостаточно.
Тот же механизм в процедурной форме: intltz_get_raw_offset. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
IntlTimeZone::getDSTSavingsУзнать величину сезонного дополнения, предусмотренную правилами пояса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::getDSTSavings(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; процедурный алиас принимает timezone. |
| Возврат | int миллисекунд. Не обещает, что поправка активна сейчас. В SimpleTimeZone внутреннее значение может быть ненулевым даже без использования DST. Для действующего сдвига нужен getOffset конкретной даты. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getDSTSavings(), "
";
Ожидаемый результат
0
UTC не нуждается в сезонном переводе часов.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo $zone->getDSTSavings(), "
";
Ожидаемый результат
3600000
Для getDSTSavings здесь ICU SimpleTimeZone возвращает внутреннее значение 3600000 даже при useDaylightTime=false. Оно не является активным сдвигом: используйте getOffset для даты. Если нужен город с переходами, фиксированного смещения недостаточно.
Тот же механизм в процедурной форме: intltz_get_dst_savings. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
intltz_get_dst_savingsУзнать величину сезонного дополнения, предусмотренную правилами пояса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_dst_savings(IntlTimeZone $timezone): intПроцедурная форма IntlTimeZone::getDSTSavings. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; процедурный алиас принимает timezone. |
| Возврат | int миллисекунд. Не обещает, что поправка активна сейчас. В SimpleTimeZone внутреннее значение может быть ненулевым даже без использования DST. Для действующего сдвига нужен getOffset конкретной даты. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getDSTSavings(), "
";
Ожидаемый результат
0
UTC не нуждается в сезонном переводе часов.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo $zone->getDSTSavings(), "
";
Ожидаемый результат
3600000
Для getDSTSavings здесь ICU SimpleTimeZone возвращает внутреннее значение 3600000 даже при useDaylightTime=false. Оно не является активным сдвигом: используйте getOffset для даты. Если нужен город с переходами, фиксированного смещения недостаточно.
Тот же механизм в процедурной форме: intltz_get_dst_savings. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
IntlTimeZone::useDaylightTimeПроверить, использует ли пояс сезонное время по своим правилам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::useDaylightTime(): bool| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; процедурный алиас принимает timezone. |
| Возврат | bool. Это не inDaylightTime для конкретного момента; историю проверяйте через календарь/getOffset. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
var_dump($zone->useDaylightTime());
Ожидаемый результат
bool(false)
UTC не нуждается в сезонном переводе часов.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
var_dump($zone->useDaylightTime());
Ожидаемый результат
bool(false)
Для getDSTSavings здесь ICU SimpleTimeZone возвращает внутреннее значение 3600000 даже при useDaylightTime=false. Оно не является активным сдвигом: используйте getOffset для даты. Если нужен город с переходами, фиксированного смещения недостаточно.
Тот же механизм в процедурной форме: intltz_use_daylight_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
intltz_use_daylight_timeПроверить, использует ли пояс сезонное время по своим правилам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_use_daylight_time(IntlTimeZone $timezone): boolПроцедурная форма IntlTimeZone::useDaylightTime. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет у метода; процедурный алиас принимает timezone. |
| Возврат | bool. Это не inDaylightTime для конкретного момента; историю проверяйте через календарь/getOffset. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
var_dump($zone->useDaylightTime());
Ожидаемый результат
bool(false)
UTC не нуждается в сезонном переводе часов.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("GMT+03:00");
var_dump($zone->useDaylightTime());
Ожидаемый результат
bool(false)
Для getDSTSavings здесь ICU SimpleTimeZone возвращает внутреннее значение 3600000 даже при useDaylightTime=false. Оно не является активным сдвигом: используйте getOffset для даты. Если нужен город с переходами, фиксированного смещения недостаточно.
Тот же механизм в процедурной форме: intltz_use_daylight_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
IntlTimeZone::hasSameRulesСравнить два пояса по смещению и правилам, не требуя одинаковых ID.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::hasSameRules(IntlTimeZone $other): bool| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlTimeZone. |
| Возврат | bool. Одинаковые правила не означают одинаковое географическое имя или одинаковый выбор пользователя. Это проверка правил ICU, а не строкового равенства. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
var_dump($zone->hasSameRules(IntlTimeZone::getGMT()));
Ожидаемый результат
bool(false)
Наблюдаемый результат ICU 77.1: системный UTC и getGMT представлены разными внутренними классами. hasSameRules учитывает совместимость представления правил, поэтому false не доказывает различие текущих часов.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
var_dump(intltz_has_same_rules($zone, IntlTimeZone::createTimeZone("GMT+03:00")));
Ожидаемый результат
bool(false)
Совпадение отсутствия DST недостаточно: базовый offset тоже различается.
Тот же механизм в процедурной форме: intltz_has_same_rules. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
intltz_has_same_rulesСравнить два пояса по смещению и правилам, не требуя одинаковых ID.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_has_same_rules(IntlTimeZone $timezone, IntlTimeZone $other): boolПроцедурная форма IntlTimeZone::hasSameRules. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlTimeZone. |
| Возврат | bool. Одинаковые правила не означают одинаковое географическое имя или одинаковый выбор пользователя. Это проверка правил ICU, а не строкового равенства. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
var_dump($zone->hasSameRules(IntlTimeZone::getGMT()));
Ожидаемый результат
bool(false)
Наблюдаемый результат ICU 77.1: системный UTC и getGMT представлены разными внутренними классами. hasSameRules учитывает совместимость представления правил, поэтому false не доказывает различие текущих часов.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
var_dump(intltz_has_same_rules($zone, IntlTimeZone::createTimeZone("GMT+03:00")));
Ожидаемый результат
bool(false)
Совпадение отсутствия DST недостаточно: базовый offset тоже различается.
Тот же механизм в процедурной форме: intltz_has_same_rules. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getCanonicalID.
IntlTimeZone::getRegionУзнать регион, с которым в ICU связан системный ID пояса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::getRegion(string $timezoneId): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID. |
| Возврат | string|false: двухбуквенный регион или 001 для глобальных/нерегиональных зон. Это не определение фактической страны человека по текущему времени. |
<?php
declare(strict_types=1);
echo IntlTimeZone::getRegion("Europe/Berlin"), "
";
Ожидаемый результат
DE
Регион помогает группировать настройки, но не заполнять адрес доставки без согласия.
<?php
declare(strict_types=1);
echo intltz_get_region("Etc/UTC"), "
";
Ожидаемый результат
001
Глобальное значение нужно обрабатывать отдельно от кодов стран.
Тот же механизм в процедурной форме: intltz_get_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createEnumeration.
intltz_get_regionУзнать регион, с которым в ICU связан системный ID пояса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_region(string $timezoneId): string|falseПроцедурная форма IntlTimeZone::getRegion. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID. |
| Возврат | string|false: двухбуквенный регион или 001 для глобальных/нерегиональных зон. Это не определение фактической страны человека по текущему времени. |
<?php
declare(strict_types=1);
echo IntlTimeZone::getRegion("Europe/Berlin"), "
";
Ожидаемый результат
DE
Регион помогает группировать настройки, но не заполнять адрес доставки без согласия.
<?php
declare(strict_types=1);
echo intltz_get_region("Etc/UTC"), "
";
Ожидаемый результат
001
Глобальное значение нужно обрабатывать отдельно от кодов стран.
Тот же механизм в процедурной форме: intltz_get_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::createEnumeration.
IntlTimeZone::getTZDataVersionЗаписать версию базы переходов ICU при расследовании расхождения времени между серверами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::getTZDataVersion(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | string|false, например идентификатор выпуска TZDB. Это не версия PHP и не Intl/ICU; обновляться они могут отдельно. |
<?php
declare(strict_types=1);
$version = IntlTimeZone::getTZDataVersion();
var_dump(is_string($version) && $version !== "");
Ожидаемый результат
bool(true)
Не фиксируем конкретный выпуск: он зависит от окружения.
<?php
declare(strict_types=1);
$metadata = ["icu" => INTL_ICU_VERSION, "tzdb" => intltz_get_tz_data_version()];
echo implode(",", array_keys($metadata)), "
";
Ожидаемый результат
icu,tzdb
В реальном журнале запишите обе версии; одна строка версии PHP не объясняет все различия календарных данных.
Тот же механизм в процедурной форме: intltz_get_tz_data_version. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
intltz_get_tz_data_versionЗаписать версию базы переходов ICU при расследовании расхождения времени между серверами.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_tz_data_version(): string|falseПроцедурная форма IntlTimeZone::getTZDataVersion. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | string|false, например идентификатор выпуска TZDB. Это не версия PHP и не Intl/ICU; обновляться они могут отдельно. |
<?php
declare(strict_types=1);
$version = IntlTimeZone::getTZDataVersion();
var_dump(is_string($version) && $version !== "");
Ожидаемый результат
bool(true)
Не фиксируем конкретный выпуск: он зависит от окружения.
<?php
declare(strict_types=1);
$metadata = ["icu" => INTL_ICU_VERSION, "tzdb" => intltz_get_tz_data_version()];
echo implode(",", array_keys($metadata)), "
";
Ожидаемый результат
icu,tzdb
В реальном журнале запишите обе версии; одна строка версии PHP не объясняет все различия календарных данных.
Тот же механизм в процедурной форме: intltz_get_tz_data_version. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
IntlTimeZone::getWindowsIDСопоставить настройки пояса Windows и системный ID ICU/IANA при интеграции сервисов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::getWindowsID(string $timezoneId): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID на входе getWindowsID; имя Windows вроде Pacific Standard Time на входе getIDForWindowsID. |
| region | У getIDForWindowsID необязательный регион уточняет соответствие; nullable с PHP 8.0. Одно имя Windows может соответствовать нескольким локациям. |
| Возврат | string|false. Требует ICU 52+. Соответствие зависит от данных CLDR; обратный проход не обязан вернуть тот же исходный алиас. |
<?php
declare(strict_types=1);
echo IntlTimeZone::getWindowsID("America/Los_Angeles"), "
";
Ожидаемый результат
Pacific Standard Time
Имя Windows содержит слово Standard, но обозначает зону с её правилами, а не запрет сезонного времени.
<?php
declare(strict_types=1);
var_dump(intltz_get_windows_id("No/Such_Zone"));
Ожидаемый результат
bool(false)
Сохраните ошибочную настройку для исправления, не подменяйте UTC без уведомления.
Тот же механизм в процедурной форме: intltz_get_windows_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getIanaID.
intltz_get_windows_idСопоставить настройки пояса Windows и системный ID ICU/IANA при интеграции сервисов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_windows_id(string $timezoneId): string|falseПроцедурная форма IntlTimeZone::getWindowsID. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID на входе getWindowsID; имя Windows вроде Pacific Standard Time на входе getIDForWindowsID. |
| region | У getIDForWindowsID необязательный регион уточняет соответствие; nullable с PHP 8.0. Одно имя Windows может соответствовать нескольким локациям. |
| Возврат | string|false. Требует ICU 52+. Соответствие зависит от данных CLDR; обратный проход не обязан вернуть тот же исходный алиас. |
<?php
declare(strict_types=1);
echo IntlTimeZone::getWindowsID("America/Los_Angeles"), "
";
Ожидаемый результат
Pacific Standard Time
Имя Windows содержит слово Standard, но обозначает зону с её правилами, а не запрет сезонного времени.
<?php
declare(strict_types=1);
var_dump(intltz_get_windows_id("No/Such_Zone"));
Ожидаемый результат
bool(false)
Сохраните ошибочную настройку для исправления, не подменяйте UTC без уведомления.
Тот же механизм в процедурной форме: intltz_get_windows_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getIanaID.
IntlTimeZone::getIDForWindowsIDСопоставить настройки пояса Windows и системный ID ICU/IANA при интеграции сервисов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlTimeZone::getIDForWindowsID(string $timezoneId, ?string $region = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID на входе getWindowsID; имя Windows вроде Pacific Standard Time на входе getIDForWindowsID. |
| region | У getIDForWindowsID необязательный регион уточняет соответствие; nullable с PHP 8.0. Одно имя Windows может соответствовать нескольким локациям. |
| Возврат | string|false. Требует ICU 52+. Соответствие зависит от данных CLDR; обратный проход не обязан вернуть тот же исходный алиас. |
<?php
declare(strict_types=1);
echo IntlTimeZone::getIDForWindowsID("Pacific Standard Time", "US"), "
";
Ожидаемый результат
America/Los_Angeles
Имя Windows содержит слово Standard, но обозначает зону с её правилами, а не запрет сезонного времени.
<?php
declare(strict_types=1);
$windowsZone = 'Pacific Standard Time';
$iana = IntlTimeZone::getIDForWindowsID($windowsZone, 'US');
if ($iana === false) {
echo "Пояс Windows не распознан\n";
} else {
echo $windowsZone, ' -> ', $iana, "\n";
}
Ожидаемый результат
Pacific Standard Time -> America/Los_Angeles
Такой переход встречается при импорте профиля из корпоративной системы Windows. Регион US устраняет часть неоднозначности. Слово Standard в имени Windows не запрещает сезонные переходы: сохраняется зона с правилами. Результат зависит от CLDR/ICU, поэтому неизвестное имя нужно вернуть оператору как ошибку настройки.
<?php
declare(strict_types=1);
var_dump(intltz_get_id_for_windows_id("Not A Windows Time Zone"));
Ожидаемый результат
bool(false)
Сохраните ошибочную настройку для исправления, не подменяйте UTC без уведомления.
Тот же механизм в процедурной форме: intltz_get_id_for_windows_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getIanaID.
intltz_get_id_for_windows_idСопоставить настройки пояса Windows и системный ID ICU/IANA при интеграции сервисов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_id_for_windows_id(string $timezoneId, ?string $region = null): string|falseПроцедурная форма IntlTimeZone::getIDForWindowsID. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezoneId | Системный ID на входе getWindowsID; имя Windows вроде Pacific Standard Time на входе getIDForWindowsID. |
| region | У getIDForWindowsID необязательный регион уточняет соответствие; nullable с PHP 8.0. Одно имя Windows может соответствовать нескольким локациям. |
| Возврат | string|false. Требует ICU 52+. Соответствие зависит от данных CLDR; обратный проход не обязан вернуть тот же исходный алиас. |
<?php
declare(strict_types=1);
echo IntlTimeZone::getIDForWindowsID("Pacific Standard Time", "US"), "
";
Ожидаемый результат
America/Los_Angeles
Имя Windows содержит слово Standard, но обозначает зону с её правилами, а не запрет сезонного времени.
<?php
declare(strict_types=1);
$windowsZone = 'Pacific Standard Time';
$iana = IntlTimeZone::getIDForWindowsID($windowsZone, 'US');
if ($iana === false) {
echo "Пояс Windows не распознан\n";
} else {
echo $windowsZone, ' -> ', $iana, "\n";
}
Ожидаемый результат
Pacific Standard Time -> America/Los_Angeles
Такой переход встречается при импорте профиля из корпоративной системы Windows. Регион US устраняет часть неоднозначности. Слово Standard в имени Windows не запрещает сезонные переходы: сохраняется зона с правилами. Результат зависит от CLDR/ICU, поэтому неизвестное имя нужно вернуть оператору как ошибку настройки.
<?php
declare(strict_types=1);
var_dump(intltz_get_id_for_windows_id("Not A Windows Time Zone"));
Ожидаемый результат
bool(false)
Сохраните ошибочную настройку для исправления, не подменяйте UTC без уведомления.
Тот же механизм в процедурной форме: intltz_get_id_for_windows_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getIanaID.
IntlTimeZone::getErrorCodeПолучить последнюю ошибку конкретного объекта пояса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::getErrorCode(): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false для кода, string|false для сообщения. Используйте intl_is_failure для ICU-кода. |
| Порядок | Читайте сразу после неудачного вызова. Глобальная фабрика без объекта использует intl_get_error_*; ошибка конкретного объекта хранится отдельно. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
var_dump(intl_is_failure($zone->getErrorCode()));
Ожидаемый результат
bool(false)
Правильное создание даёт объект без ошибки.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$zone->getDisplayName(false, 9999, "en");
var_dump(intl_is_failure($zone->getErrorCode()));
Ожидаемый результат
bool(true)
Ошибка относится к настройке вызова, а не к самому региону.
Тот же механизм в процедурной форме: intltz_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure.
intltz_get_error_codeПолучить последнюю ошибку конкретного объекта пояса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_error_code(IntlTimeZone $timezone): int|falseПроцедурная форма IntlTimeZone::getErrorCode. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false для кода, string|false для сообщения. Используйте intl_is_failure для ICU-кода. |
| Порядок | Читайте сразу после неудачного вызова. Глобальная фабрика без объекта использует intl_get_error_*; ошибка конкретного объекта хранится отдельно. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
var_dump(intl_is_failure($zone->getErrorCode()));
Ожидаемый результат
bool(false)
Правильное создание даёт объект без ошибки.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$zone->getDisplayName(false, 9999, "en");
var_dump(intl_is_failure($zone->getErrorCode()));
Ожидаемый результат
bool(true)
Ошибка относится к настройке вызова, а не к самому региону.
Тот же механизм в процедурной форме: intltz_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure.
IntlTimeZone::getErrorMessageПолучить последнюю ошибку конкретного объекта пояса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlTimeZone::getErrorMessage(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false для кода, string|false для сообщения. Используйте intl_is_failure для ICU-кода. |
| Порядок | Читайте сразу после неудачного вызова. Глобальная фабрика без объекта использует intl_get_error_*; ошибка конкретного объекта хранится отдельно. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Правильное создание даёт объект без ошибки.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$zone->getDisplayName(false, 9999, "en");
echo str_contains($zone->getErrorMessage(), "U_ILLEGAL_ARGUMENT_ERROR") ? "invalid style
" : "other
";
Ожидаемый результат
invalid style
Ошибка относится к настройке вызова, а не к самому региону.
Тот же механизм в процедурной форме: intltz_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure.
intltz_get_error_messageПолучить последнюю ошибку конкретного объекта пояса.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intltz_get_error_message(IntlTimeZone $timezone): string|falseПроцедурная форма IntlTimeZone::getErrorMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false для кода, string|false для сообщения. Используйте intl_is_failure для ICU-кода. |
| Порядок | Читайте сразу после неудачного вызова. Глобальная фабрика без объекта использует intl_get_error_*; ошибка конкретного объекта хранится отдельно. |
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Правильное создание даёт объект без ошибки.
<?php
declare(strict_types=1);
$zone = IntlTimeZone::createTimeZone("UTC");
$zone->getDisplayName(false, 9999, "en");
echo str_contains($zone->getErrorMessage(), "U_ILLEGAL_ARGUMENT_ERROR") ? "invalid style
" : "other
";
Ожидаемый результат
invalid style
Ошибка относится к настройке вызова, а не к самому региону.
Тот же механизм в процедурной форме: intltz_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_is_failure.
IntlCalendar::__constructВыбрать фабрику календаря, прежде чем обращаться к его полям.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::__construct()| Аргумент или результат | Что означает на практике |
|---|---|
| Доступ | private: new IntlCalendar запрещён. Используйте createInstance или конкретный IntlGregorianCalendar. |
| Назначение | Календарь хранит момент, пояс, календарную систему и правила интерпретации полей. Это не список событий приложения. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getType(), "
";
Ожидаемый результат
gregorian
Factory может вернуть подкласс подходящей календарной системы.
<?php
declare(strict_types=1);
try { new IntlCalendar(); } catch (Error $error) { echo "use createInstance
"; }
Ожидаемый результат
use createInstance
Закрытый конструктор защищает выбор конкретной реализации.
Рядом по задаче: IntlCalendar::createInstance.
IntlCalendar::createInstanceСоздать календарь с выбранными поясом и языковыми правилами для отчёта или расписания.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlCalendar::createInstance(IntlTimeZone|DateTimeZone|string|null $timezone = null, ?string $locale = null): ?IntlCalendar| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | IntlTimeZone, DateTimeZone, ICU ID/GMT-смещение или null. null берёт PHP default timezone; DateTimeZone преобразуется в ICU по ID. |
| locale | ?string; null берёт default intl. Keyword calendar может выбрать систему, например en_US@calendar=gregorian. |
| Возврат | IntlCalendar|null; фабрика может вернуть подкласс. Начальный момент — время создания! Для учебных/детерминированных расчётов задавайте момент или clear + все нужные поля. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTime(), "
";
Ожидаемый результат
0
Без setTime пример зависел бы от секунд запуска.
<?php
declare(strict_types=1);
$calendar = intlcal_create_instance("UTC", "th_TH@calendar=buddhist");
echo $calendar->getType(), "
";
Ожидаемый результат
buddhist
Один и тот же момент может представляться разными календарными годами.
Тот же механизм в процедурной форме: intlcal_create_instance. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setTime, IntlCalendar::clear.
intlcal_create_instanceСоздать календарь с выбранными поясом и языковыми правилами для отчёта или расписания.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_create_instance(IntlTimeZone|DateTimeZone|string|null $timezone = null, ?string $locale = null): ?IntlCalendarПроцедурная форма IntlCalendar::createInstance. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | IntlTimeZone, DateTimeZone, ICU ID/GMT-смещение или null. null берёт PHP default timezone; DateTimeZone преобразуется в ICU по ID. |
| locale | ?string; null берёт default intl. Keyword calendar может выбрать систему, например en_US@calendar=gregorian. |
| Возврат | IntlCalendar|null; фабрика может вернуть подкласс. Начальный момент — время создания! Для учебных/детерминированных расчётов задавайте момент или clear + все нужные поля. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTime(), "
";
Ожидаемый результат
0
Без setTime пример зависел бы от секунд запуска.
<?php
declare(strict_types=1);
$calendar = intlcal_create_instance("UTC", "th_TH@calendar=buddhist");
echo $calendar->getType(), "
";
Ожидаемый результат
buddhist
Один и тот же момент может представляться разными календарными годами.
Тот же механизм в процедурной форме: intlcal_create_instance. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setTime, IntlCalendar::clear.
IntlCalendar::getNowПолучить текущее системное время в единицах ICU.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlCalendar::getNow(): float| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | float миллисекунд с Unix-эпохи без високосных секунд. |
| Скорость и часы | Это настенные часы: они могут корректироваться системой. Для измерения длительности операции нужен монотонный hrtime, а не разница двух getNow. |
<?php
declare(strict_types=1);
$now = IntlCalendar::getNow();
var_dump(is_float($now), $now > 0);
Ожидаемый результат
bool(true)
bool(true)
Фиксированный timestamp здесь не нужен: проверяется контракт типа и единиц.
<?php
declare(strict_types=1);
$now = intlcal_get_now();
$calendar = IntlCalendar::createInstance("UTC", "en_US");
$calendar->setTime($now);
var_dump($calendar->getTime() === $now);
Ожидаемый результат
bool(true)
Обе операции используют миллисекунды, поэтому масштабировать значение не нужно.
Тот же механизм в процедурной форме: intlcal_get_now. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setTime, hrtime.
intlcal_get_nowПолучить текущее системное время в единицах ICU.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_now(): floatПроцедурная форма IntlCalendar::getNow. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | float миллисекунд с Unix-эпохи без високосных секунд. |
| Скорость и часы | Это настенные часы: они могут корректироваться системой. Для измерения длительности операции нужен монотонный hrtime, а не разница двух getNow. |
<?php
declare(strict_types=1);
$now = IntlCalendar::getNow();
var_dump(is_float($now), $now > 0);
Ожидаемый результат
bool(true)
bool(true)
Фиксированный timestamp здесь не нужен: проверяется контракт типа и единиц.
<?php
declare(strict_types=1);
$now = intlcal_get_now();
$calendar = IntlCalendar::createInstance("UTC", "en_US");
$calendar->setTime($now);
var_dump($calendar->getTime() === $now);
Ожидаемый результат
bool(true)
Обе операции используют миллисекунды, поэтому масштабировать значение не нужно.
Тот же механизм в процедурной форме: intlcal_get_now. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setTime, hrtime.
IntlCalendar::getTimeПрочитать или установить момент независимо от того, как он выглядит в местном календаре.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getTime(): float|false| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | У setTime float, представляющий целое число миллисекунд Unix-эпохи; високосные секунды не учитываются. |
| Возврат | getTime float|false; setTime bool. Ноль — корректный момент. Изменение момента пересчитывает поля. |
| Единицы | PHP time()/DateTime::getTimestamp — секунды. При передаче в ICU умножьте на 1000; при передаче в IntlDateFormatter::format числом — разделите обратно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTime(1000.0);
echo $calendar->getTime(), " / ", $calendar->get(IntlCalendar::FIELD_SECOND), "
";
Ожидаемый результат
1000 / 1
Поля — календарное представление момента; время ICU — единое число миллисекунд.
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("1970-01-02 00:00:00", new DateTimeZone("UTC"));
$calendar = IntlCalendar::createInstance("UTC", "en_US");
intlcal_set_time($calendar, $date->getTimestamp() * 1000.0);
echo intlcal_get_time($calendar) / 1000, "
";
Ожидаемый результат
86400
Ошибка масштаба в 1000 раз — типичная причина дат около 1970 года.
Тот же механизм в процедурной форме: intlcal_get_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::toDateTime, IntlDateFormatter::format.
intlcal_get_timeПрочитать или установить момент независимо от того, как он выглядит в местном календаре.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_time(IntlCalendar $calendar): float|falseПроцедурная форма IntlCalendar::getTime. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | У setTime float, представляющий целое число миллисекунд Unix-эпохи; високосные секунды не учитываются. |
| Возврат | getTime float|false; setTime bool. Ноль — корректный момент. Изменение момента пересчитывает поля. |
| Единицы | PHP time()/DateTime::getTimestamp — секунды. При передаче в ICU умножьте на 1000; при передаче в IntlDateFormatter::format числом — разделите обратно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTime(1000.0);
echo $calendar->getTime(), " / ", $calendar->get(IntlCalendar::FIELD_SECOND), "
";
Ожидаемый результат
1000 / 1
Поля — календарное представление момента; время ICU — единое число миллисекунд.
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("1970-01-02 00:00:00", new DateTimeZone("UTC"));
$calendar = IntlCalendar::createInstance("UTC", "en_US");
intlcal_set_time($calendar, $date->getTimestamp() * 1000.0);
echo intlcal_get_time($calendar) / 1000, "
";
Ожидаемый результат
86400
Ошибка масштаба в 1000 раз — типичная причина дат около 1970 года.
Тот же механизм в процедурной форме: intlcal_get_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::toDateTime, IntlDateFormatter::format.
IntlCalendar::setTimeПрочитать или установить момент независимо от того, как он выглядит в местном календаре.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::setTime(float $timestamp): bool| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | У setTime float, представляющий целое число миллисекунд Unix-эпохи; високосные секунды не учитываются. |
| Возврат | getTime float|false; setTime bool. Ноль — корректный момент. Изменение момента пересчитывает поля. |
| Единицы | PHP time()/DateTime::getTimestamp — секунды. При передаче в ICU умножьте на 1000; при передаче в IntlDateFormatter::format числом — разделите обратно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTime(1000.0);
echo $calendar->getTime(), " / ", $calendar->get(IntlCalendar::FIELD_SECOND), "
";
Ожидаемый результат
1000 / 1
Поля — календарное представление момента; время ICU — единое число миллисекунд.
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("1970-01-02 00:00:00", new DateTimeZone("UTC"));
$calendar = IntlCalendar::createInstance("UTC", "en_US");
intlcal_set_time($calendar, $date->getTimestamp() * 1000.0);
echo intlcal_get_time($calendar) / 1000, "
";
Ожидаемый результат
86400
Ошибка масштаба в 1000 раз — типичная причина дат около 1970 года.
Тот же механизм в процедурной форме: intlcal_set_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::toDateTime, IntlDateFormatter::format.
intlcal_set_timeПрочитать или установить момент независимо от того, как он выглядит в местном календаре.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_set_time(IntlCalendar $calendar, float $timestamp): boolПроцедурная форма IntlCalendar::setTime. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | У setTime float, представляющий целое число миллисекунд Unix-эпохи; високосные секунды не учитываются. |
| Возврат | getTime float|false; setTime bool. Ноль — корректный момент. Изменение момента пересчитывает поля. |
| Единицы | PHP time()/DateTime::getTimestamp — секунды. При передаче в ICU умножьте на 1000; при передаче в IntlDateFormatter::format числом — разделите обратно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTime(1000.0);
echo $calendar->getTime(), " / ", $calendar->get(IntlCalendar::FIELD_SECOND), "
";
Ожидаемый результат
1000 / 1
Поля — календарное представление момента; время ICU — единое число миллисекунд.
<?php
declare(strict_types=1);
$date = new DateTimeImmutable("1970-01-02 00:00:00", new DateTimeZone("UTC"));
$calendar = IntlCalendar::createInstance("UTC", "en_US");
intlcal_set_time($calendar, $date->getTimestamp() * 1000.0);
echo intlcal_get_time($calendar) / 1000, "
";
Ожидаемый результат
86400
Ошибка масштаба в 1000 раз — типичная причина дат около 1970 года.
Тот же механизм в процедурной форме: intlcal_set_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::toDateTime, IntlDateFormatter::format.
IntlCalendar::getПрочитать одну составляющую календарной даты: год, месяц, часы или смещение.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::get(int $field): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| field | Константа FIELD_* действительного поля; FIELD_FIELD_COUNT — счётчик, не поле для чтения. |
| Возврат | int|false; ноль может означать январь, полночь или нулевое смещение. FIELD_MONTH от 0, FIELD_HOUR от 0 до 11, FIELD_HOUR_OF_DAY от 0 до 23. |
| Ленивое вычисление | Чтение может завершить расчёт момента из установленных полей и обнаружить ранее заданную некорректную дату. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->get(IntlCalendar::FIELD_YEAR), " / ", $calendar->get(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
2024 / 0
Январь — 0 внутри ICU; для обычной подписи месяца нужно прибавление 1 или форматтер.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo intlcal_get($calendar, IntlCalendar::FIELD_HOUR), " / ", intlcal_get($calendar, IntlCalendar::FIELD_HOUR_OF_DAY), "
";
Ожидаемый результат
0 / 12
Полдень — 0 в 12-часовом поле плюс PM, но 12 в поле HOUR_OF_DAY.
Тот же механизм в процедурной форме: intlcal_get. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::set, IntlDateFormatter::formatObject.
intlcal_getПрочитать одну составляющую календарной даты: год, месяц, часы или смещение.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get(IntlCalendar $calendar, int $field): int|falseПроцедурная форма IntlCalendar::get. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | Константа FIELD_* действительного поля; FIELD_FIELD_COUNT — счётчик, не поле для чтения. |
| Возврат | int|false; ноль может означать январь, полночь или нулевое смещение. FIELD_MONTH от 0, FIELD_HOUR от 0 до 11, FIELD_HOUR_OF_DAY от 0 до 23. |
| Ленивое вычисление | Чтение может завершить расчёт момента из установленных полей и обнаружить ранее заданную некорректную дату. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->get(IntlCalendar::FIELD_YEAR), " / ", $calendar->get(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
2024 / 0
Январь — 0 внутри ICU; для обычной подписи месяца нужно прибавление 1 или форматтер.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo intlcal_get($calendar, IntlCalendar::FIELD_HOUR), " / ", intlcal_get($calendar, IntlCalendar::FIELD_HOUR_OF_DAY), "
";
Ожидаемый результат
0 / 12
Полдень — 0 в 12-часовом поле плюс PM, но 12 в поле HOUR_OF_DAY.
Тот же механизм в процедурной форме: intlcal_get. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::set, IntlDateFormatter::formatObject.
IntlCalendar::setУстановить одно поле календаря, сохраняя остальные поля до пересчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::set(int $year, int $month, int $dayOfMonth, int $hour, int $minute, int $second): true| Аргумент или результат | Что означает на практике |
|---|---|
| field,value | Современный рекомендуемый вызов для одного поля: set(FIELD_MINUTE, 30). Позднее заданные конфликтующие поля имеют приоритет. |
| Старая перегрузка | set(year,month,day[,hour,minute[,second]]) с более чем двумя аргументами метода deprecated с PHP 8.4; используйте setDate/setDateTime. Ровно четыре аргумента не поддерживались. Процедурный intlcal_set целиком deprecated с PHP 8.4; переходите на методы объекта. |
| Возврат | true с PHP 8.2; проверка реальности даты может происходить при последующем вычислении времени. Месяц от 0, lenient определяет обработку выхода полей за диапазон. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->set(IntlCalendar::FIELD_MINUTE, 30);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-01-31 12:30
Одно поле изменилось; год и день остались прежними.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
set_error_handler(static function (int $level, string $message): bool {
if ($level === E_DEPRECATED && str_contains($message, "intlcal_set")) {
echo "deprecated: use object method
";
return true;
}
return false;
});
try {
intlcal_set($calendar, IntlCalendar::FIELD_SECOND, 15);
} finally {
restore_error_handler();
}
echo $calendar->getTime(), "
";
Ожидаемый результат
deprecated: use object method
15000
Обработчик нужен только для демонстрации предупреждения старого кода. Новый код вызывает $calendar->set(IntlCalendar::FIELD_SECOND, 15).
Тот же механизм в процедурной форме: intlcal_set. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setDate, IntlCalendar::setDateTime.
intlcal_setУстановить одно поле календаря, сохраняя остальные поля до пересчёта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_set(IntlCalendar $calendar, int $year, int $month, int $dayOfMonth, int $hour, int $minute, int $second): trueУстаревший API в текущем PHP. Используйте современную замену, указанную в контракте ниже; сохранён для чтения и миграции существующего кода.
Процедурная форма IntlCalendar::set. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field,value | Современный рекомендуемый вызов для одного поля: set(FIELD_MINUTE, 30). Позднее заданные конфликтующие поля имеют приоритет. |
| Старая перегрузка | set(year,month,day[,hour,minute[,second]]) с более чем двумя аргументами метода deprecated с PHP 8.4; используйте setDate/setDateTime. Ровно четыре аргумента не поддерживались. Процедурный intlcal_set целиком deprecated с PHP 8.4; переходите на методы объекта. |
| Возврат | true с PHP 8.2; проверка реальности даты может происходить при последующем вычислении времени. Месяц от 0, lenient определяет обработку выхода полей за диапазон. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->set(IntlCalendar::FIELD_MINUTE, 30);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-01-31 12:30
Одно поле изменилось; год и день остались прежними.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
set_error_handler(static function (int $level, string $message): bool {
if ($level === E_DEPRECATED && str_contains($message, "intlcal_set")) {
echo "deprecated: use object method
";
return true;
}
return false;
});
try {
intlcal_set($calendar, IntlCalendar::FIELD_SECOND, 15);
} finally {
restore_error_handler();
}
echo $calendar->getTime(), "
";
Ожидаемый результат
deprecated: use object method
15000
Обработчик нужен только для демонстрации предупреждения старого кода. Новый код вызывает $calendar->set(IntlCalendar::FIELD_SECOND, 15).
Тот же механизм в процедурной форме: intlcal_set. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setDate, IntlCalendar::setDateTime.
IntlCalendar::setDateЗадать календарную дату явным современным методом без неоднозначной перегрузки.
PHP 8.3+ · intl
IntlCalendar::setDate(int $year, int $month, int $dayOfMonth): void| Аргумент или результат | Что означает на практике |
|---|---|
| year,month,dayOfMonth | Год, месяц от 0 (февраль 1), день месяца. Диапазоны зависят от календарной системы. |
| Время | setDateTime также получает hour, minute, optional second. Неуказанные поля не следует считать автоматически обнулёнными: clear перед сборкой новой даты делает намерение явным. |
| Возврат | void. При строгом режиме проверяйте последующий getTime: установка полей и вычисление момента — разные шаги. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setDate(2024, 1, 29);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-02-29 00:00
Число 1 означает февраль именно в нумерации ICU.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->setDate(2024, 1, 29);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-02-29 12:00
setDate меняет только дату; время существующего объекта сохраняется. Для новой сущности не наследуйте случайные поля.
Рядом по задаче: IntlCalendar::clear, IntlCalendar::setLenient.
IntlCalendar::setDateTimeЗадать дату и время явным современным методом без неоднозначной перегрузки.
PHP 8.3+ · intl
IntlCalendar::setDateTime(int $year, int $month, int $dayOfMonth, int $hour, int $minute, ?int $second = null): void| Аргумент или результат | Что означает на практике |
|---|---|
| year,month,dayOfMonth | Год, месяц от 0 (февраль 1), день месяца. Диапазоны зависят от календарной системы. |
| Время | setDateTime также получает hour, minute, optional second. Неуказанные поля не следует считать автоматически обнулёнными: clear перед сборкой новой даты делает намерение явным. |
| Возврат | void. При строгом режиме проверяйте последующий getTime: установка полей и вычисление момента — разные шаги. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setDateTime(2024, 1, 29, 8, 30, 0);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-02-29 08:30
Число 1 означает февраль именно в нумерации ICU.
<?php
declare(strict_types=1);
$submitted = ['year' => 2024, 'month' => 2, 'day' => 30];
$calendar = IntlCalendar::createInstance('Europe/Moscow', 'ru_RU@calendar=gregorian');
$calendar->clear();
$calendar->setLenient(false);
$calendar->setDateTime(
$submitted['year'],
$submitted['month'] - 1,
$submitted['day'],
12, 0, 0,
);
$milliseconds = $calendar->getTime();
echo $milliseconds === false
? "Такой даты не существует\n"
: "Дата принята\n";
Ожидаемый результат
Такой даты не существует
HTML-месяц 2 преобразован в внутренний индекс 1. Строгий режим не превращает 30 февраля в март. В реальном обработчике до календаря проверяют наличие полей, целые типы и разрешённый диапазон года; затем техническую ошибку журналируют, а человеку показывают понятное сообщение.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->setDateTime(2024, 1, 29, 8, 30, 0);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-02-29 08:30
setDate меняет только дату; время существующего объекта сохраняется. Для новой сущности не наследуйте случайные поля.
Рядом по задаче: IntlCalendar::clear, IntlCalendar::setLenient.
IntlCalendar::clearСнять установленные поля перед построением новой даты, чтобы не унаследовать случайное время создания.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::clear(?int $field = null): true| Аргумент или результат | Что означает на практике |
|---|---|
| field | null очищает все поля; FIELD_* очищает одно. |
| Возврат | true (с PHP 8.2). Поле помечается unset и получает низший приоритет; чтение затем может заполнить его значением по умолчанию при расчёте. Это не удаление объекта. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->clear(IntlCalendar::FIELD_MINUTE);
var_dump($calendar->isSet(IntlCalendar::FIELD_MINUTE));
Ожидаемый результат
bool(false)
Проверяем флаг до чтения других вычисляемых значений.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
intlcal_clear($calendar);
$calendar->setDateTime(2024, 0, 1, 0, 0, 0);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-01-01 00:00
Очищение делает последовательность установки явной и воспроизводимой.
Тот же механизм в процедурной форме: intlcal_clear. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::isSet, IntlCalendar::setDateTime.
intlcal_clearСнять установленные поля перед построением новой даты, чтобы не унаследовать случайное время создания.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_clear(IntlCalendar $calendar, ?int $field = null): trueПроцедурная форма IntlCalendar::clear. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | null очищает все поля; FIELD_* очищает одно. |
| Возврат | true (с PHP 8.2). Поле помечается unset и получает низший приоритет; чтение затем может заполнить его значением по умолчанию при расчёте. Это не удаление объекта. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->clear(IntlCalendar::FIELD_MINUTE);
var_dump($calendar->isSet(IntlCalendar::FIELD_MINUTE));
Ожидаемый результат
bool(false)
Проверяем флаг до чтения других вычисляемых значений.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
intlcal_clear($calendar);
$calendar->setDateTime(2024, 0, 1, 0, 0, 0);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-01-01 00:00
Очищение делает последовательность установки явной и воспроизводимой.
Тот же механизм в процедурной форме: intlcal_clear. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::isSet, IntlCalendar::setDateTime.
IntlCalendar::isSetУзнать, задано ли поле явно/при вычислении, прежде чем решать приоритет календарных полей.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::isSet(int $field): bool| Аргумент или результат | Что означает на практике |
|---|---|
| field | Константа поля. |
| Возврат | bool; unset не равно числовому нулю. Позднее заданные поля имеют преимущество над прежними, очищенные — низший приоритет. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->clear();
var_dump($calendar->isSet(IntlCalendar::FIELD_YEAR));
Ожидаемый результат
bool(false)
После get/getTime состояние может измениться вследствие вычисления; не проверяйте его после случайного чтения.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->clear();
$calendar->set(IntlCalendar::FIELD_YEAR, 2024);
var_dump(intlcal_is_set($calendar, IntlCalendar::FIELD_YEAR));
Ожидаемый результат
bool(true)
Флаг сообщает наличие установленного поля, а не доказанную корректность всей даты.
Тот же механизм в процедурной форме: intlcal_is_set. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::clear.
intlcal_is_setУзнать, задано ли поле явно/при вычислении, прежде чем решать приоритет календарных полей.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_is_set(IntlCalendar $calendar, int $field): boolПроцедурная форма IntlCalendar::isSet. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | Константа поля. |
| Возврат | bool; unset не равно числовому нулю. Позднее заданные поля имеют преимущество над прежними, очищенные — низший приоритет. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->clear();
var_dump($calendar->isSet(IntlCalendar::FIELD_YEAR));
Ожидаемый результат
bool(false)
После get/getTime состояние может измениться вследствие вычисления; не проверяйте его после случайного чтения.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->clear();
$calendar->set(IntlCalendar::FIELD_YEAR, 2024);
var_dump(intlcal_is_set($calendar, IntlCalendar::FIELD_YEAR));
Ожидаемый результат
bool(true)
Флаг сообщает наличие установленного поля, а не доказанную корректность всей даты.
Тот же механизм в процедурной форме: intlcal_is_set. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::clear.
IntlCalendar::addИзменить календарное поле с переносом в старшие поля.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::add(int $field, int $value): bool| Аргумент или результат | Что означает на практике |
|---|---|
| field,value | Поле и знаковое количество его единиц; минус двигает назад. add корректирует связанные поля, например 31 января + месяц становится последним допустимым днём февраля. |
| Возврат | bool. Метод изменяет объект. Календарный день около DST не обязан равняться ровно 86400 секундам; для календарного расписания это обычно важно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->add(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-02-01 12:00
add переходит в февраль; roll меняет только день в пределах января.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setDateTime(2024, 11, 15, 0, 0, 0);
$calendar->add(IntlCalendar::FIELD_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2025-01-15 00:00
Для продления подписки обычно нужен add; roll подходит для циклического выбора поля.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance('UTC', 'en_US@calendar=gregorian');
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 10, 0, 0);
$calendar->add(IntlCalendar::FIELD_MONTH, 1);
echo IntlDateFormatter::formatObject(
$calendar,
'yyyy-MM-dd HH:mm',
'en_US',
), "\n";
Ожидаемый результат
2024-02-29 10:00
Календарное прибавление месяца сохранило время и выбрало последний допустимый день февраля високосного года. Прибавление фиксированных 30 суток дало бы другую бизнес-семантику. Перед внедрением нужно отдельно решить договор продукта: «последний день следующего месяца», «то же число либо ошибка» или другое правило.
Тот же механизм в процедурной форме: intlcal_add. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::roll.
intlcal_addИзменить календарное поле с переносом в старшие поля.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_add(IntlCalendar $calendar, int $field, int $value): boolПроцедурная форма IntlCalendar::add. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field,value | Поле и знаковое количество его единиц; минус двигает назад. add корректирует связанные поля, например 31 января + месяц становится последним допустимым днём февраля. |
| Возврат | bool. Метод изменяет объект. Календарный день около DST не обязан равняться ровно 86400 секундам; для календарного расписания это обычно важно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->add(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-02-01 12:00
add переходит в февраль; roll меняет только день в пределах января.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setDateTime(2024, 11, 15, 0, 0, 0);
$calendar->add(IntlCalendar::FIELD_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2025-01-15 00:00
Для продления подписки обычно нужен add; roll подходит для циклического выбора поля.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance('UTC', 'en_US@calendar=gregorian');
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 10, 0, 0);
$calendar->add(IntlCalendar::FIELD_MONTH, 1);
echo IntlDateFormatter::formatObject(
$calendar,
'yyyy-MM-dd HH:mm',
'en_US',
), "\n";
Ожидаемый результат
2024-02-29 10:00
Календарное прибавление месяца сохранило время и выбрало последний допустимый день февраля високосного года. Прибавление фиксированных 30 суток дало бы другую бизнес-семантику. Перед внедрением нужно отдельно решить договор продукта: «последний день следующего месяца», «то же число либо ошибка» или другое правило.
Тот же механизм в процедурной форме: intlcal_add. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::roll.
IntlCalendar::rollИзменить календарное поле по кругу без переноса в старшие поля.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::roll(int $field, $value): bool| Аргумент или результат | Что означает на практике |
|---|---|
| field,value | Поле и знаковое количество его единиц; минус двигает назад. Исторические bool true/false означали +1/−1; передача bool deprecated в текущем PHP, используйте int. |
| Возврат | bool. Метод изменяет объект. Календарный день около DST не обязан равняться ровно 86400 секундам; для календарного расписания это обычно важно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->roll(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-01-01 12:00
add переходит в февраль; roll меняет только день в пределах января.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance('UTC', 'en_US@calendar=gregorian');
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->roll(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, 'yyyy-MM-dd', 'en_US'), "\n";
Ожидаемый результат
2024-01-01
roll обернул 31 января в 1 января того же месяца. Это может пригодиться элементу интерфейса, который крутит одно поле, но для срока подписки или даты доставки почти всегда нужен add. Пример делает различие наблюдаемым, а не оставляет его определением в одну строку.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setDateTime(2024, 11, 15, 0, 0, 0);
$calendar->roll(IntlCalendar::FIELD_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-01-15 00:00
Для продления подписки обычно нужен add; roll подходит для циклического выбора поля.
Тот же механизм в процедурной форме: intlcal_roll. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::add.
intlcal_rollИзменить календарное поле по кругу без переноса в старшие поля.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_roll(IntlCalendar $calendar, int $field, $value): boolПроцедурная форма IntlCalendar::roll. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field,value | Поле и знаковое количество его единиц; минус двигает назад. Исторические bool true/false означали +1/−1; передача bool deprecated в текущем PHP, используйте int. |
| Возврат | bool. Метод изменяет объект. Календарный день около DST не обязан равняться ровно 86400 секундам; для календарного расписания это обычно важно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->roll(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-01-01 12:00
add переходит в февраль; roll меняет только день в пределах января.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance('UTC', 'en_US@calendar=gregorian');
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
$calendar->roll(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, 'yyyy-MM-dd', 'en_US'), "\n";
Ожидаемый результат
2024-01-01
roll обернул 31 января в 1 января того же месяца. Это может пригодиться элементу интерфейса, который крутит одно поле, но для срока подписки или даты доставки почти всегда нужен add. Пример делает различие наблюдаемым, а не оставляет его определением в одну строку.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setDateTime(2024, 11, 15, 0, 0, 0);
$calendar->roll(IntlCalendar::FIELD_MONTH, 1);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd HH:mm", "en_US"), "
";
Ожидаемый результат
2024-01-15 00:00
Для продления подписки обычно нужен add; roll подходит для циклического выбора поля.
Тот же механизм в процедурной форме: intlcal_roll. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::add.
IntlCalendar::fieldDifferenceРазложить интервал на календарные единицы: сначала дни, затем оставшиеся часы.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::fieldDifference(float $timestamp, int $field): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | Целевой момент в миллисекундах. |
| field | Единица разницы, например FIELD_DAY_OF_MONTH или FIELD_HOUR_OF_DAY. |
| Возврат | int|false со знаком. Важный побочный эффект: объект продвигается на вычисленное число единиц! Поэтому вызывайте от старших единиц к младшим и при необходимости работайте с clone. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->fieldDifference(90000000.0, IntlCalendar::FIELD_DAY_OF_MONTH), "
";
echo $calendar->getTime(), "
";
Ожидаемый результат
1
86400000
25 часов в UTC содержат один полный день; календарь уже продвинулся на него.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$target = 90000000.0;
$days = intlcal_field_difference($calendar, $target, IntlCalendar::FIELD_DAY_OF_MONTH);
$hours = intlcal_field_difference($calendar, $target, IntlCalendar::FIELD_HOUR_OF_DAY);
echo $days, " day + ", $hours, " hour
";
Ожидаемый результат
1 day + 1 hour
Второй вызов считает остаток от изменённого состояния, а не весь интервал заново.
<?php
declare(strict_types=1);
$start = IntlCalendar::createInstance('UTC', 'en_US');
$start->clear();
$start->setDateTime(2024, 4, 20, 9, 0, 0);
$target = IntlCalendar::createInstance('UTC', 'en_US');
$target->clear();
$target->setDateTime(2024, 4, 22, 14, 0, 0);
$cursor = clone $start;
$days = $cursor->fieldDifference($target->getTime(), IntlCalendar::FIELD_DAY_OF_MONTH);
$hours = $cursor->fieldDifference($target->getTime(), IntlCalendar::FIELD_HOUR_OF_DAY);
echo $days, " дн. ", $hours, " ч.\n";
Ожидаемый результат
2 дн. 5 ч.
Первый вызов продвинул clone на два календарных дня, второй посчитал остаток в часах. Исходный календарь не изменился. Порядок важен: сначала крупные единицы, затем мелкие. Для SLA в точных секундах обычно вычитают timestamps; fieldDifference нужен именно для календарного разложения.
Тот же механизм в процедурной форме: intlcal_field_difference. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::add, IntlCalendar::getTime.
intlcal_field_differenceРазложить интервал на календарные единицы: сначала дни, затем оставшиеся часы.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_field_difference(IntlCalendar $calendar, float $timestamp, int $field): int|falseПроцедурная форма IntlCalendar::fieldDifference. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | Целевой момент в миллисекундах. |
| field | Единица разницы, например FIELD_DAY_OF_MONTH или FIELD_HOUR_OF_DAY. |
| Возврат | int|false со знаком. Важный побочный эффект: объект продвигается на вычисленное число единиц! Поэтому вызывайте от старших единиц к младшим и при необходимости работайте с clone. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->fieldDifference(90000000.0, IntlCalendar::FIELD_DAY_OF_MONTH), "
";
echo $calendar->getTime(), "
";
Ожидаемый результат
1
86400000
25 часов в UTC содержат один полный день; календарь уже продвинулся на него.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$target = 90000000.0;
$days = intlcal_field_difference($calendar, $target, IntlCalendar::FIELD_DAY_OF_MONTH);
$hours = intlcal_field_difference($calendar, $target, IntlCalendar::FIELD_HOUR_OF_DAY);
echo $days, " day + ", $hours, " hour
";
Ожидаемый результат
1 day + 1 hour
Второй вызов считает остаток от изменённого состояния, а не весь интервал заново.
<?php
declare(strict_types=1);
$start = IntlCalendar::createInstance('UTC', 'en_US');
$start->clear();
$start->setDateTime(2024, 4, 20, 9, 0, 0);
$target = IntlCalendar::createInstance('UTC', 'en_US');
$target->clear();
$target->setDateTime(2024, 4, 22, 14, 0, 0);
$cursor = clone $start;
$days = $cursor->fieldDifference($target->getTime(), IntlCalendar::FIELD_DAY_OF_MONTH);
$hours = $cursor->fieldDifference($target->getTime(), IntlCalendar::FIELD_HOUR_OF_DAY);
echo $days, " дн. ", $hours, " ч.\n";
Ожидаемый результат
2 дн. 5 ч.
Первый вызов продвинул clone на два календарных дня, второй посчитал остаток в часах. Исходный календарь не изменился. Порядок важен: сначала крупные единицы, затем мелкие. Для SLA в точных секундах обычно вычитают timestamps; fieldDifference нужен именно для календарного разложения.
Тот же механизм в процедурной форме: intlcal_field_difference. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::add, IntlCalendar::getTime.
IntlCalendar::equalsСравнить календари по их установленным моментам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::equals(IntlCalendar $other): bool| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlCalendar. |
| Смысл | Равны моменты; настройки/пояса/системы могут различаться. |
| Возврат | bool. Для временных сравнений false также возможен при ошибке вычисления полей; при сомнительном состоянии проверяйте диагностику. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
var_dump($calendar->equals($other));
Ожидаемый результат
bool(true)
clone создаёт отдельный календарь; изменения другого объекта не должны незаметно менять первый.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTime(1000.0);
var_dump($calendar->equals($other));
Ожидаемый результат
bool(false)
Не путайте равенство момента с равенством календарной политики.
Тот же механизм в процедурной форме: intlcal_equals. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getTime, IntlCalendar::getErrorCode.
intlcal_equalsСравнить календари по их установленным моментам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_equals(IntlCalendar $calendar, IntlCalendar $other): boolПроцедурная форма IntlCalendar::equals. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlCalendar. |
| Смысл | Равны моменты; настройки/пояса/системы могут различаться. |
| Возврат | bool. Для временных сравнений false также возможен при ошибке вычисления полей; при сомнительном состоянии проверяйте диагностику. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
var_dump($calendar->equals($other));
Ожидаемый результат
bool(true)
clone создаёт отдельный календарь; изменения другого объекта не должны незаметно менять первый.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTime(1000.0);
var_dump($calendar->equals($other));
Ожидаемый результат
bool(false)
Не путайте равенство момента с равенством календарной политики.
Тот же механизм в процедурной форме: intlcal_equals. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getTime, IntlCalendar::getErrorCode.
IntlCalendar::beforeСравнить календари по их установленным моментам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::before(IntlCalendar $other): bool| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlCalendar. |
| Смысл | Момент текущего объекта строго раньше other. |
| Возврат | bool. Для временных сравнений false также возможен при ошибке вычисления полей; при сомнительном состоянии проверяйте диагностику. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
var_dump($calendar->before($other));
Ожидаемый результат
bool(false)
clone создаёт отдельный календарь; изменения другого объекта не должны незаметно менять первый.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTime(1000.0);
var_dump($calendar->before($other));
Ожидаемый результат
bool(true)
Не путайте равенство момента с равенством календарной политики.
<?php
declare(strict_types=1);
function calendarAt(string $time): IntlCalendar {
$date = new DateTime($time, new DateTimeZone('UTC'));
$calendar = IntlCalendar::fromDateTime($date, 'en_US');
if ($calendar === null) {
throw new RuntimeException('Не удалось создать календарь');
}
return $calendar;
}
$submittedAt = calendarAt('2024-05-20 14:59:59');
$deadline = calendarAt('2024-05-20 15:00:00');
echo $submittedAt->before($deadline)
? "Заказ принят\n"
: "Срок истёк\n";
Ожидаемый результат
Заказ принят
before означает строго раньше; равенство ровно в 15:00 не прошло бы эту проверку. Оба момента созданы в UTC, поэтому скрытой зависимости от пояса сервера нет. Для правила «до 15:00 включительно» договор меняют явно на before || equals. В распределённой системе источник времени и задержка доставки запроса требуют отдельного решения.
Тот же механизм в процедурной форме: intlcal_before. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getTime, IntlCalendar::getErrorCode.
intlcal_beforeСравнить календари по их установленным моментам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_before(IntlCalendar $calendar, IntlCalendar $other): boolПроцедурная форма IntlCalendar::before. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlCalendar. |
| Смысл | Момент текущего объекта строго раньше other. |
| Возврат | bool. Для временных сравнений false также возможен при ошибке вычисления полей; при сомнительном состоянии проверяйте диагностику. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
var_dump($calendar->before($other));
Ожидаемый результат
bool(false)
clone создаёт отдельный календарь; изменения другого объекта не должны незаметно менять первый.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTime(1000.0);
var_dump($calendar->before($other));
Ожидаемый результат
bool(true)
Не путайте равенство момента с равенством календарной политики.
<?php
declare(strict_types=1);
function calendarAt(string $time): IntlCalendar {
$date = new DateTime($time, new DateTimeZone('UTC'));
$calendar = IntlCalendar::fromDateTime($date, 'en_US');
if ($calendar === null) {
throw new RuntimeException('Не удалось создать календарь');
}
return $calendar;
}
$submittedAt = calendarAt('2024-05-20 14:59:59');
$deadline = calendarAt('2024-05-20 15:00:00');
echo $submittedAt->before($deadline)
? "Заказ принят\n"
: "Срок истёк\n";
Ожидаемый результат
Заказ принят
before означает строго раньше; равенство ровно в 15:00 не прошло бы эту проверку. Оба момента созданы в UTC, поэтому скрытой зависимости от пояса сервера нет. Для правила «до 15:00 включительно» договор меняют явно на before || equals. В распределённой системе источник времени и задержка доставки запроса требуют отдельного решения.
Тот же механизм в процедурной форме: intlcal_before. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getTime, IntlCalendar::getErrorCode.
IntlCalendar::afterСравнить календари по их установленным моментам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::after(IntlCalendar $other): bool| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlCalendar. |
| Смысл | Момент текущего объекта строго позже other. |
| Возврат | bool. Для временных сравнений false также возможен при ошибке вычисления полей; при сомнительном состоянии проверяйте диагностику. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
var_dump($calendar->after($other));
Ожидаемый результат
bool(false)
clone создаёт отдельный календарь; изменения другого объекта не должны незаметно менять первый.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTime(1000.0);
var_dump($calendar->after($other));
Ожидаемый результат
bool(false)
Не путайте равенство момента с равенством календарной политики.
Тот же механизм в процедурной форме: intlcal_after. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getTime, IntlCalendar::getErrorCode.
intlcal_afterСравнить календари по их установленным моментам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_after(IntlCalendar $calendar, IntlCalendar $other): boolПроцедурная форма IntlCalendar::after. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlCalendar. |
| Смысл | Момент текущего объекта строго позже other. |
| Возврат | bool. Для временных сравнений false также возможен при ошибке вычисления полей; при сомнительном состоянии проверяйте диагностику. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
var_dump($calendar->after($other));
Ожидаемый результат
bool(false)
clone создаёт отдельный календарь; изменения другого объекта не должны незаметно менять первый.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTime(1000.0);
var_dump($calendar->after($other));
Ожидаемый результат
bool(false)
Не путайте равенство момента с равенством календарной политики.
Тот же механизм в процедурной форме: intlcal_after. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getTime, IntlCalendar::getErrorCode.
IntlCalendar::isEquivalentToСравнить календари по настройкам, исключая установленный момент.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::isEquivalentTo(IntlCalendar $other): bool| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlCalendar. |
| Смысл | Совпадает поведение: пояс, lenient, правила недели/DST и другие настройки; сами времена могут отличаться. |
| Возврат | bool. Для временных сравнений false также возможен при ошибке вычисления полей; при сомнительном состоянии проверяйте диагностику. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTime(1000.0);
var_dump($calendar->isEquivalentTo($other));
Ожидаемый результат
bool(true)
clone создаёт отдельный календарь; изменения другого объекта не должны незаметно менять первый.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTimeZone("GMT+03:00");
var_dump($calendar->isEquivalentTo($other));
Ожидаемый результат
bool(false)
Не путайте равенство момента с равенством календарной политики.
Тот же механизм в процедурной форме: intlcal_is_equivalent_to. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getTime, IntlCalendar::getErrorCode.
intlcal_is_equivalent_toСравнить календари по настройкам, исключая установленный момент.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_is_equivalent_to(IntlCalendar $calendar, IntlCalendar $other): boolПроцедурная форма IntlCalendar::isEquivalentTo. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| other | Второй IntlCalendar. |
| Смысл | Совпадает поведение: пояс, lenient, правила недели/DST и другие настройки; сами времена могут отличаться. |
| Возврат | bool. Для временных сравнений false также возможен при ошибке вычисления полей; при сомнительном состоянии проверяйте диагностику. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTime(1000.0);
var_dump($calendar->isEquivalentTo($other));
Ожидаемый результат
bool(true)
clone создаёт отдельный календарь; изменения другого объекта не должны незаметно менять первый.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$other = clone $calendar;
$other->setTimeZone("GMT+03:00");
var_dump($calendar->isEquivalentTo($other));
Ожидаемый результат
bool(false)
Не путайте равенство момента с равенством календарной политики.
Тот же механизм в процедурной форме: intlcal_is_equivalent_to. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getTime, IntlCalendar::getErrorCode.
IntlCalendar::fromDateTimeПеренести обычный объект PHP-даты в ICU-календарь.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlCalendar::fromDateTime(DateTime|string $datetime, ?string $locale = null): ?IntlCalendar| Аргумент или результат | Что означает на практике |
|---|---|
| datetime | DateTime либо строка для конструктора DateTime; в этой сигнатуре не произвольный DateTimeInterface. Строковый синтаксис может выбросить исключение DateTime. |
| locale | ?string выбирает календарные языковые правила. |
| Возврат | IntlCalendar|null. Сохраняются момент и аналогичный пояс, но его правила уже из ICU. Для очень далёких дат возможна потеря точности. |
<?php
declare(strict_types=1);
$date = new DateTime("1970-01-01 00:00:01", new DateTimeZone("UTC"));
$calendar = IntlCalendar::fromDateTime($date, "en_US");
echo $calendar->getTime(), "
";
Ожидаемый результат
1000
Одна секунда PHP стала 1000 миллисекунд ICU.
<?php
declare(strict_types=1);
$calendar = intlcal_from_date_time("1970-01-01 00:00:00 UTC", "en_US");
echo $calendar->getTime(), "
";
Ожидаемый результат
0
Явный пояс не оставляет результат зависимым от настроек сервера.
Тот же механизм в процедурной форме: intlcal_from_date_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::toDateTime.
intlcal_from_date_timeПеренести обычный объект PHP-даты в ICU-календарь.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_from_date_time(DateTime|string $datetime, ?string $locale = null): ?IntlCalendarПроцедурная форма IntlCalendar::fromDateTime. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| datetime | DateTime либо строка для конструктора DateTime; в этой сигнатуре не произвольный DateTimeInterface. Строковый синтаксис может выбросить исключение DateTime. |
| locale | ?string выбирает календарные языковые правила. |
| Возврат | IntlCalendar|null. Сохраняются момент и аналогичный пояс, но его правила уже из ICU. Для очень далёких дат возможна потеря точности. |
<?php
declare(strict_types=1);
$date = new DateTime("1970-01-01 00:00:01", new DateTimeZone("UTC"));
$calendar = IntlCalendar::fromDateTime($date, "en_US");
echo $calendar->getTime(), "
";
Ожидаемый результат
1000
Одна секунда PHP стала 1000 миллисекунд ICU.
<?php
declare(strict_types=1);
$calendar = intlcal_from_date_time("1970-01-01 00:00:00 UTC", "en_US");
echo $calendar->getTime(), "
";
Ожидаемый результат
0
Явный пояс не оставляет результат зависимым от настроек сервера.
Тот же механизм в процедурной форме: intlcal_from_date_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::toDateTime.
IntlCalendar::toDateTimeПолучить обычный DateTime для кода, который работает с PHP Date/Time.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::toDateTime(): DateTime|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | DateTime|false; аналогичный пояс с данными PHP и тот же момент с точностью до секунд. Миллисекундная часть теряется/округляется с ошибкой меньше секунды. |
| Применение | Граница между API ICU и библиотекой, принимающей DateTime. Если требуется точность миллисекунд, храните исходное число отдельно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$date = $calendar->toDateTime();
echo $date->getTimestamp(), "
";
Ожидаемый результат
0
Возвращён объект, из которого читается timestamp уже в секундах.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTimeZone("Europe/Berlin");
$date = intlcal_to_date_time($calendar);
echo $date->getTimezone()->getName(), "
";
Ожидаемый результат
Europe/Berlin
Имя то же, но конкретные исторические правила зависят от базы PHP.
Тот же механизм в процедурной форме: intlcal_to_date_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::fromDateTime.
intlcal_to_date_timeПолучить обычный DateTime для кода, который работает с PHP Date/Time.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_to_date_time(IntlCalendar $calendar): DateTime|falseПроцедурная форма IntlCalendar::toDateTime. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | DateTime|false; аналогичный пояс с данными PHP и тот же момент с точностью до секунд. Миллисекундная часть теряется/округляется с ошибкой меньше секунды. |
| Применение | Граница между API ICU и библиотекой, принимающей DateTime. Если требуется точность миллисекунд, храните исходное число отдельно. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$date = $calendar->toDateTime();
echo $date->getTimestamp(), "
";
Ожидаемый результат
0
Возвращён объект, из которого читается timestamp уже в секундах.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTimeZone("Europe/Berlin");
$date = intlcal_to_date_time($calendar);
echo $date->getTimezone()->getName(), "
";
Ожидаемый результат
Europe/Berlin
Имя то же, но конкретные исторические правила зависят от базы PHP.
Тот же механизм в процедурной форме: intlcal_to_date_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::fromDateTime.
IntlCalendar::getMinimumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getMinimum(int $field): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Глобальный минимум поля для этой календарной системы. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getMinimum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
1
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getMinimum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
0
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_minimum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
intlcal_get_minimumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_minimum(IntlCalendar $calendar, int $field): int|falseПроцедурная форма IntlCalendar::getMinimum. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Глобальный минимум поля для этой календарной системы. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getMinimum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
1
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getMinimum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
0
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_minimum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
IntlCalendar::getGreatestMinimumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getGreatestMinimum(int $field): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Самый большой из относительных минимумов; minimum ≤ actualMinimum ≤ greatestMinimum. У Gregorian все три совпадают. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getGreatestMinimum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
1
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getGreatestMinimum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
0
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_greatest_minimum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
intlcal_get_greatest_minimumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_greatest_minimum(IntlCalendar $calendar, int $field): int|falseПроцедурная форма IntlCalendar::getGreatestMinimum. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Самый большой из относительных минимумов; minimum ≤ actualMinimum ≤ greatestMinimum. У Gregorian все три совпадают. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getGreatestMinimum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
1
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getGreatestMinimum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
0
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_greatest_minimum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
IntlCalendar::getActualMinimumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getActualMinimum(int $field): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Минимум поля с учётом текущего календарного состояния. У Gregorian совпадает с глобальным минимумом. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getActualMinimum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
1
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getActualMinimum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
0
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_actual_minimum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
intlcal_get_actual_minimumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_actual_minimum(IntlCalendar $calendar, int $field): int|falseПроцедурная форма IntlCalendar::getActualMinimum. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Минимум поля с учётом текущего календарного состояния. У Gregorian совпадает с глобальным минимумом. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getActualMinimum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
1
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getActualMinimum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
0
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_actual_minimum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
IntlCalendar::getMaximumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getMaximum(int $field): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Глобальный максимум поля; не означает, что значение допустимо в каждом месяце. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
31
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getMaximum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
11
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_maximum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
intlcal_get_maximumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_maximum(IntlCalendar $calendar, int $field): int|falseПроцедурная форма IntlCalendar::getMaximum. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Глобальный максимум поля; не означает, что значение допустимо в каждом месяце. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
31
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getMaximum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
11
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_maximum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
IntlCalendar::getLeastMaximumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getLeastMaximum(int $field): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Наименьший из относительных максимумов. Для дня Gregorian это 28: есть месяцы, где больший день невозможен. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getLeastMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
28
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getLeastMaximum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
11
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_least_maximum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
intlcal_get_least_maximumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_least_maximum(IntlCalendar $calendar, int $field): int|falseПроцедурная форма IntlCalendar::getLeastMaximum. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Наименьший из относительных максимумов. Для дня Gregorian это 28: есть месяцы, где больший день невозможен. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getLeastMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
28
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getLeastMaximum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
11
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_least_maximum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum, IntlCalendar::setDate.
IntlCalendar::getActualMaximumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getActualMaximum(int $field): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Максимум в текущем состоянии: для дня зависит от конкретного месяца и високосности года. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
31
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
foreach ([[2024, 2], [2023, 2], [2024, 4]] as [$year, $humanMonth]) {
$calendar = IntlCalendar::createInstance('UTC', 'en_US@calendar=gregorian');
$calendar->clear();
$calendar->setDate($year, $humanMonth - 1, 1);
$days = $calendar->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH);
echo $year, '-', str_pad((string) $humanMonth, 2, '0', STR_PAD_LEFT),
': ', $days, " дней\n";
}
Ожидаемый результат
2024-02: 29 дней
2023-02: 28 дней
2024-04: 30 дней
Количество вариантов зависит от выбранных года и месяца. getMaximum вернул бы общий предел поля, а нужен именно actual maximum состояния календаря. На сервере это помогает повторно проверить значение из HTML-формы; интерфейсная блокировка невозможного дня не заменяет серверную валидацию.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getActualMaximum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
11
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_actual_maximum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getMaximum, IntlGregorianCalendar::isLeapYear.
intlcal_get_actual_maximumПолучить границу поля для календарной формы или алгоритма обхода.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_actual_maximum(IntlCalendar $calendar, int $field): int|falseПроцедурная форма IntlCalendar::getActualMaximum. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| field | Действительная константа FIELD_*. FIELD_FIELD_COUNT не является полем. |
| Возврат | int|false в единицах поля. Максимум в текущем состоянии: для дня зависит от конкретного месяца и високосности года. |
| Применение | Для числа дней выбранного месяца нужен getActualMaximum(FIELD_DAY_OF_MONTH), а не всегда 31 и не глобальный getMaximum. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
31
Состояние примера — январь 2024; это важно для actual-границы.
<?php
declare(strict_types=1);
foreach ([[2024, 2], [2023, 2], [2024, 4]] as [$year, $humanMonth]) {
$calendar = IntlCalendar::createInstance('UTC', 'en_US@calendar=gregorian');
$calendar->clear();
$calendar->setDate($year, $humanMonth - 1, 1);
$days = $calendar->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH);
echo $year, '-', str_pad((string) $humanMonth, 2, '0', STR_PAD_LEFT),
': ', $days, " дней\n";
}
Ожидаемый результат
2024-02: 29 дней
2023-02: 28 дней
2024-04: 30 дней
Количество вариантов зависит от выбранных года и месяца. getMaximum вернул бы общий предел поля, а нужен именно actual maximum состояния календаря. На сервере это помогает повторно проверить значение из HTML-формы; интерфейсная блокировка невозможного дня не заменяет серверную валидацию.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setDateTime(2024, 0, 31, 12, 0, 0);
echo $calendar->getActualMaximum(IntlCalendar::FIELD_MONTH), "
";
Ожидаемый результат
11
В Gregorian месяцы внутри ICU нумеруются от 0 до 11. Для других календарей не жёстко фиксируйте 12 месяцев.
Тот же механизм в процедурной форме: intlcal_get_actual_maximum. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getMaximum, IntlGregorianCalendar::isLeapYear.
IntlCalendar::getAvailableLocalesПолучить локали, для которых в ICU доступны календарные данные.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlCalendar::getAvailableLocales(): array| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | array строк. Набор зависит от ICU; с ICU 51 соответствует установленным локалям ICU. Это не перечень переведённых страниц приложения. |
<?php
declare(strict_types=1);
$locales = IntlCalendar::getAvailableLocales();
var_dump(in_array("en", $locales, true));
Ожидаемый результат
bool(true)
Наличие локали означает техническую поддержку календарных правил.
<?php
declare(strict_types=1);
$locales = intlcal_get_available_locales();
echo implode(",", array_intersect(["en", "de"], $locales)), "
";
Ожидаемый результат
en,de
Показывайте пользователю только те языки, для которых готов ваш собственный интерфейс.
Тот же механизм в процедурной форме: intlcal_get_available_locales. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup.
intlcal_get_available_localesПолучить локали, для которых в ICU доступны календарные данные.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_available_locales(): arrayПроцедурная форма IntlCalendar::getAvailableLocales. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | array строк. Набор зависит от ICU; с ICU 51 соответствует установленным локалям ICU. Это не перечень переведённых страниц приложения. |
<?php
declare(strict_types=1);
$locales = IntlCalendar::getAvailableLocales();
var_dump(in_array("en", $locales, true));
Ожидаемый результат
bool(true)
Наличие локали означает техническую поддержку календарных правил.
<?php
declare(strict_types=1);
$locales = intlcal_get_available_locales();
echo implode(",", array_intersect(["en", "de"], $locales)), "
";
Ожидаемый результат
en,de
Показывайте пользователю только те языки, для которых готов ваш собственный интерфейс.
Тот же механизм в процедурной форме: intlcal_get_available_locales. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: Locale::lookup.
IntlCalendar::getKeywordValuesForLocaleУзнать календарные системы, уместные для выбранной локали.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlCalendar::getKeywordValuesForLocale(string $keyword, string $locale, bool $onlyCommon): IntlIterator|false| Аргумент или результат | Что означает на практике |
|---|---|
| keyword | Поддержан calendar. |
| locale,onlyCommon | Локаль и флаг: показывать только обычно используемые варианты или все релевантные. |
| Возврат | IntlIterator|false со строками типов, например gregorian. Это значения locale keyword, а не перевод названий систем. |
<?php
declare(strict_types=1);
$types = iterator_to_array(IntlCalendar::getKeywordValuesForLocale("calendar", "en_US", true), false);
var_dump(in_array("gregorian", $types, true));
Ожидаемый результат
bool(true)
Полученный тип можно использовать в @calendar=... при создании.
<?php
declare(strict_types=1);
$types = iterator_to_array(intlcal_get_keyword_values_for_locale("calendar", "th_TH", true), false);
var_dump(in_array("buddhist", $types, true));
Ожидаемый результат
bool(true)
Язык/регион влияет на обычный выбор, но приложение может явно задать нужную систему.
Тот же механизм в процедурной форме: intlcal_get_keyword_values_for_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::createInstance, IntlCalendar::getType.
intlcal_get_keyword_values_for_localeУзнать календарные системы, уместные для выбранной локали.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_keyword_values_for_locale(string $keyword, string $locale, bool $onlyCommon): IntlIterator|falseПроцедурная форма IntlCalendar::getKeywordValuesForLocale. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| keyword | Поддержан calendar. |
| locale,onlyCommon | Локаль и флаг: показывать только обычно используемые варианты или все релевантные. |
| Возврат | IntlIterator|false со строками типов, например gregorian. Это значения locale keyword, а не перевод названий систем. |
<?php
declare(strict_types=1);
$types = iterator_to_array(IntlCalendar::getKeywordValuesForLocale("calendar", "en_US", true), false);
var_dump(in_array("gregorian", $types, true));
Ожидаемый результат
bool(true)
Полученный тип можно использовать в @calendar=... при создании.
<?php
declare(strict_types=1);
$types = iterator_to_array(intlcal_get_keyword_values_for_locale("calendar", "th_TH", true), false);
var_dump(in_array("buddhist", $types, true));
Ожидаемый результат
bool(true)
Язык/регион влияет на обычный выбор, но приложение может явно задать нужную систему.
Тот же механизм в процедурной форме: intlcal_get_keyword_values_for_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::createInstance, IntlCalendar::getType.
IntlCalendar::getTypeУзнать конкретную календарную систему объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getType(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string: gregorian, buddhist, islamic и другие значения keyword calendar. Нет аргументов у метода. |
| Применение | Если год неожиданно отличается от привычного, проверьте систему, прежде чем искать ошибку timestamp. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getType(), "
";
Ожидаемый результат
gregorian
Тип не сообщает язык подписи или часовой пояс.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "th_TH@calendar=buddhist");
echo intlcal_get_type($calendar), "
";
Ожидаемый результат
buddhist
Одинаковый UTC-момент может иметь разные поля года в разных системах.
Тот же механизм в процедурной форме: intlcal_get_type. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getKeywordValuesForLocale.
intlcal_get_typeУзнать конкретную календарную систему объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_type(IntlCalendar $calendar): stringПроцедурная форма IntlCalendar::getType. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string: gregorian, buddhist, islamic и другие значения keyword calendar. Нет аргументов у метода. |
| Применение | Если год неожиданно отличается от привычного, проверьте систему, прежде чем искать ошибку timestamp. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getType(), "
";
Ожидаемый результат
gregorian
Тип не сообщает язык подписи или часовой пояс.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "th_TH@calendar=buddhist");
echo intlcal_get_type($calendar), "
";
Ожидаемый результат
buddhist
Одинаковый UTC-момент может иметь разные поля года в разных системах.
Тот же механизм в процедурной форме: intlcal_get_type. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getKeywordValuesForLocale.
IntlCalendar::getLocaleПрочитать локаль, из которой ICU взял календарные правила.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getLocale(int $type): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| type | Обязательный ACTUAL_LOCALE или VALID_LOCALE. Actual может быть более общей родительской локалью, чем valid и исходно запрошенная. |
| Возврат | string|false. Locale влияет на начало недели/выходные и выбор данных; не заменяет timezone. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(is_string($calendar->getLocale(Locale::ACTUAL_LOCALE)));
Ожидаемый результат
bool(true)
Конкретный fallback может изменяться вместе с данными ICU.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(is_string(intlcal_get_locale($calendar, Locale::VALID_LOCALE)));
Ожидаемый результат
bool(true)
Чтение полезно для диагностики различий недельного отчёта.
Тот же механизм в процедурной форме: intlcal_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getFirstDayOfWeek.
intlcal_get_localeПрочитать локаль, из которой ICU взял календарные правила.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_locale(IntlCalendar $calendar, int $type): string|falseПроцедурная форма IntlCalendar::getLocale. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| type | Обязательный ACTUAL_LOCALE или VALID_LOCALE. Actual может быть более общей родительской локалью, чем valid и исходно запрошенная. |
| Возврат | string|false. Locale влияет на начало недели/выходные и выбор данных; не заменяет timezone. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(is_string($calendar->getLocale(Locale::ACTUAL_LOCALE)));
Ожидаемый результат
bool(true)
Конкретный fallback может изменяться вместе с данными ICU.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(is_string(intlcal_get_locale($calendar, Locale::VALID_LOCALE)));
Ожидаемый результат
bool(true)
Чтение полезно для диагностики различий недельного отчёта.
Тот же механизм в процедурной форме: intlcal_get_locale. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getFirstDayOfWeek.
IntlCalendar::setTimeZoneВыбрать или прочитать пояс календарного представления момента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): bool| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | У setter IntlTimeZone, DateTimeZone, ICU ID, GMT-смещение либо null (PHP default). Для DateTimeZone используется база ICU по ID. |
| Возврат | setTimeZone bool; getTimeZone IntlTimeZone|false. |
| Что меняется | setTimeZone сохраняет сам момент, но пересчитывает местные поля. Это не перенос события на новые настенные часы. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC
Пояс — отдельный объект с правилами переходов.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTimeZone("GMT+03:00");
echo $calendar->getTime(), " / ", $calendar->get(IntlCalendar::FIELD_HOUR_OF_DAY), "
";
Ожидаемый результат
0 / 3
Timestamp остаётся 0; местный час стал 3.
Тот же механизм в процедурной форме: intlcal_set_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
intlcal_set_time_zoneВыбрать или прочитать пояс календарного представления момента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_set_time_zone(IntlCalendar $calendar, IntlTimeZone|DateTimeZone|string|null $timezone): boolПроцедурная форма IntlCalendar::setTimeZone. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | У setter IntlTimeZone, DateTimeZone, ICU ID, GMT-смещение либо null (PHP default). Для DateTimeZone используется база ICU по ID. |
| Возврат | setTimeZone bool; getTimeZone IntlTimeZone|false. |
| Что меняется | setTimeZone сохраняет сам момент, но пересчитывает местные поля. Это не перенос события на новые настенные часы. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC
Пояс — отдельный объект с правилами переходов.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTimeZone("GMT+03:00");
echo $calendar->getTime(), " / ", $calendar->get(IntlCalendar::FIELD_HOUR_OF_DAY), "
";
Ожидаемый результат
0 / 3
Timestamp остаётся 0; местный час стал 3.
Тот же механизм в процедурной форме: intlcal_set_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
IntlCalendar::getTimeZoneВыбрать или прочитать пояс календарного представления момента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getTimeZone(): IntlTimeZone|false| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | У setter IntlTimeZone, DateTimeZone, ICU ID, GMT-смещение либо null (PHP default). Для DateTimeZone используется база ICU по ID. |
| Возврат | setTimeZone bool; getTimeZone IntlTimeZone|false. |
| Что меняется | setTimeZone сохраняет сам момент, но пересчитывает местные поля. Это не перенос события на новые настенные часы. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC
Пояс — отдельный объект с правилами переходов.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTimeZone("GMT+03:00");
echo $calendar->getTime(), " / ", $calendar->get(IntlCalendar::FIELD_HOUR_OF_DAY), "
";
Ожидаемый результат
0 / 3
Timestamp остаётся 0; местный час стал 3.
Тот же механизм в процедурной форме: intlcal_get_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
intlcal_get_time_zoneВыбрать или прочитать пояс календарного представления момента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_time_zone(IntlCalendar $calendar): IntlTimeZone|falseПроцедурная форма IntlCalendar::getTimeZone. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timezone | У setter IntlTimeZone, DateTimeZone, ICU ID, GMT-смещение либо null (PHP default). Для DateTimeZone используется база ICU по ID. |
| Возврат | setTimeZone bool; getTimeZone IntlTimeZone|false. |
| Что меняется | setTimeZone сохраняет сам момент, но пересчитывает местные поля. Это не перенос события на новые настенные часы. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC
Пояс — отдельный объект с правилами переходов.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setTimeZone("GMT+03:00");
echo $calendar->getTime(), " / ", $calendar->get(IntlCalendar::FIELD_HOUR_OF_DAY), "
";
Ожидаемый результат
0 / 3
Timestamp остаётся 0; местный час стал 3.
Тот же механизм в процедурной форме: intlcal_get_time_zone. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
IntlCalendar::getFirstDayOfWeekНастроить, с какого дня начинается неделя в календаре и недельных отчётах.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getFirstDayOfWeek(): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| dayOfWeek | У setter одна из DOW_SUNDAY…DOW_SATURDAY. Имена лучше чисел: ICU считает воскресенье 1, понедельник 2. |
| Возврат | getter int|false, setter true. Настройка влияет на FIELD_WEEK_OF_YEAR и FIELD_YEAR_WOY, не только на порядок заголовков в интерфейсе. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
var_dump($calendar->getFirstDayOfWeek() === IntlCalendar::DOW_MONDAY);
Ожидаемый результат
bool(true)
Начало недели должно совпадать с договором отчётности.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
intlcal_set_first_day_of_week($calendar, IntlCalendar::DOW_SUNDAY);
var_dump(intlcal_get_first_day_of_week($calendar) === IntlCalendar::DOW_SUNDAY);
Ожидаемый результат
bool(true)
Местные привычки различаются; не считайте понедельник универсальным default всех локалей.
Тот же механизм в процедурной форме: intlcal_get_first_day_of_week. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setMinimalDaysInFirstWeek.
intlcal_get_first_day_of_weekНастроить, с какого дня начинается неделя в календаре и недельных отчётах.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_first_day_of_week(IntlCalendar $calendar): int|falseПроцедурная форма IntlCalendar::getFirstDayOfWeek. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| dayOfWeek | У setter одна из DOW_SUNDAY…DOW_SATURDAY. Имена лучше чисел: ICU считает воскресенье 1, понедельник 2. |
| Возврат | getter int|false, setter true. Настройка влияет на FIELD_WEEK_OF_YEAR и FIELD_YEAR_WOY, не только на порядок заголовков в интерфейсе. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
var_dump($calendar->getFirstDayOfWeek() === IntlCalendar::DOW_MONDAY);
Ожидаемый результат
bool(true)
Начало недели должно совпадать с договором отчётности.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
intlcal_set_first_day_of_week($calendar, IntlCalendar::DOW_SUNDAY);
var_dump(intlcal_get_first_day_of_week($calendar) === IntlCalendar::DOW_SUNDAY);
Ожидаемый результат
bool(true)
Местные привычки различаются; не считайте понедельник универсальным default всех локалей.
Тот же механизм в процедурной форме: intlcal_get_first_day_of_week. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setMinimalDaysInFirstWeek.
IntlCalendar::setFirstDayOfWeekНастроить, с какого дня начинается неделя в календаре и недельных отчётах.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::setFirstDayOfWeek(int $dayOfWeek): true| Аргумент или результат | Что означает на практике |
|---|---|
| dayOfWeek | У setter одна из DOW_SUNDAY…DOW_SATURDAY. Имена лучше чисел: ICU считает воскресенье 1, понедельник 2. |
| Возврат | getter int|false, setter true. Настройка влияет на FIELD_WEEK_OF_YEAR и FIELD_YEAR_WOY, не только на порядок заголовков в интерфейсе. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
var_dump($calendar->getFirstDayOfWeek() === IntlCalendar::DOW_MONDAY);
Ожидаемый результат
bool(true)
Начало недели должно совпадать с договором отчётности.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
intlcal_set_first_day_of_week($calendar, IntlCalendar::DOW_SUNDAY);
var_dump(intlcal_get_first_day_of_week($calendar) === IntlCalendar::DOW_SUNDAY);
Ожидаемый результат
bool(true)
Местные привычки различаются; не считайте понедельник универсальным default всех локалей.
Тот же механизм в процедурной форме: intlcal_set_first_day_of_week. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setMinimalDaysInFirstWeek.
intlcal_set_first_day_of_weekНастроить, с какого дня начинается неделя в календаре и недельных отчётах.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_set_first_day_of_week(IntlCalendar $calendar, int $dayOfWeek): trueПроцедурная форма IntlCalendar::setFirstDayOfWeek. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| dayOfWeek | У setter одна из DOW_SUNDAY…DOW_SATURDAY. Имена лучше чисел: ICU считает воскресенье 1, понедельник 2. |
| Возврат | getter int|false, setter true. Настройка влияет на FIELD_WEEK_OF_YEAR и FIELD_YEAR_WOY, не только на порядок заголовков в интерфейсе. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
var_dump($calendar->getFirstDayOfWeek() === IntlCalendar::DOW_MONDAY);
Ожидаемый результат
bool(true)
Начало недели должно совпадать с договором отчётности.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
intlcal_set_first_day_of_week($calendar, IntlCalendar::DOW_SUNDAY);
var_dump(intlcal_get_first_day_of_week($calendar) === IntlCalendar::DOW_SUNDAY);
Ожидаемый результат
bool(true)
Местные привычки различаются; не считайте понедельник универсальным default всех локалей.
Тот же механизм в процедурной форме: intlcal_set_first_day_of_week. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setMinimalDaysInFirstWeek.
IntlCalendar::getMinimalDaysInFirstWeekОпределить, сколько дней нового года должно попасть в его первую неделю.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getMinimalDaysInFirstWeek(): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| days | У setter число 1…7; вне диапазона ValueError с PHP 8.0. Значение 1 всегда включает 1 января в первую неделю, 7 требует полной недели. |
| Возврат | getter int|false, setter true. Вместе с первым днём недели определяет недельный год, который около Нового года может отличаться от обычного. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
$calendar->setMinimalDaysInFirstWeek(4);
echo $calendar->getMinimalDaysInFirstWeek(), "
";
Ожидаемый результат
4
Для ISO-подобного счёта нужны обе настройки: понедельник и минимум 4 дня.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
$calendar->setMinimalDaysInFirstWeek(4);
$calendar->setDateTime(2021, 0, 1, 0, 0, 0);
echo $calendar->get(IntlCalendar::FIELD_YEAR), " / ", $calendar->get(IntlCalendar::FIELD_YEAR_WOY), "
";
Ожидаемый результат
2021 / 2020
Это объясняет, почему в шаблоне ICU yyyy и YYYY нельзя взаимозаменять.
Тот же механизм в процедурной форме: intlcal_get_minimal_days_in_first_week. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setFirstDayOfWeek, IntlDateFormatter::setPattern.
intlcal_get_minimal_days_in_first_weekОпределить, сколько дней нового года должно попасть в его первую неделю.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_minimal_days_in_first_week(IntlCalendar $calendar): int|falseПроцедурная форма IntlCalendar::getMinimalDaysInFirstWeek. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| days | У setter число 1…7; вне диапазона ValueError с PHP 8.0. Значение 1 всегда включает 1 января в первую неделю, 7 требует полной недели. |
| Возврат | getter int|false, setter true. Вместе с первым днём недели определяет недельный год, который около Нового года может отличаться от обычного. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
$calendar->setMinimalDaysInFirstWeek(4);
echo $calendar->getMinimalDaysInFirstWeek(), "
";
Ожидаемый результат
4
Для ISO-подобного счёта нужны обе настройки: понедельник и минимум 4 дня.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
$calendar->setMinimalDaysInFirstWeek(4);
$calendar->setDateTime(2021, 0, 1, 0, 0, 0);
echo $calendar->get(IntlCalendar::FIELD_YEAR), " / ", $calendar->get(IntlCalendar::FIELD_YEAR_WOY), "
";
Ожидаемый результат
2021 / 2020
Это объясняет, почему в шаблоне ICU yyyy и YYYY нельзя взаимозаменять.
Тот же механизм в процедурной форме: intlcal_get_minimal_days_in_first_week. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setFirstDayOfWeek, IntlDateFormatter::setPattern.
IntlCalendar::setMinimalDaysInFirstWeekОпределить, сколько дней нового года должно попасть в его первую неделю.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::setMinimalDaysInFirstWeek(int $days): true| Аргумент или результат | Что означает на практике |
|---|---|
| days | У setter число 1…7; вне диапазона ValueError с PHP 8.0. Значение 1 всегда включает 1 января в первую неделю, 7 требует полной недели. |
| Возврат | getter int|false, setter true. Вместе с первым днём недели определяет недельный год, который около Нового года может отличаться от обычного. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
$calendar->setMinimalDaysInFirstWeek(4);
echo $calendar->getMinimalDaysInFirstWeek(), "
";
Ожидаемый результат
4
Для ISO-подобного счёта нужны обе настройки: понедельник и минимум 4 дня.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
$calendar->setMinimalDaysInFirstWeek(4);
$calendar->setDateTime(2021, 0, 1, 0, 0, 0);
echo $calendar->get(IntlCalendar::FIELD_YEAR), " / ", $calendar->get(IntlCalendar::FIELD_YEAR_WOY), "
";
Ожидаемый результат
2021 / 2020
Это объясняет, почему в шаблоне ICU yyyy и YYYY нельзя взаимозаменять.
Тот же механизм в процедурной форме: intlcal_set_minimal_days_in_first_week. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setFirstDayOfWeek, IntlDateFormatter::setPattern.
intlcal_set_minimal_days_in_first_weekОпределить, сколько дней нового года должно попасть в его первую неделю.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_set_minimal_days_in_first_week(IntlCalendar $calendar, int $days): trueПроцедурная форма IntlCalendar::setMinimalDaysInFirstWeek. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| days | У setter число 1…7; вне диапазона ValueError с PHP 8.0. Значение 1 всегда включает 1 января в первую неделю, 7 требует полной недели. |
| Возврат | getter int|false, setter true. Вместе с первым днём недели определяет недельный год, который около Нового года может отличаться от обычного. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
$calendar->setMinimalDaysInFirstWeek(4);
echo $calendar->getMinimalDaysInFirstWeek(), "
";
Ожидаемый результат
4
Для ISO-подобного счёта нужны обе настройки: понедельник и минимум 4 дня.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setFirstDayOfWeek(IntlCalendar::DOW_MONDAY);
$calendar->setMinimalDaysInFirstWeek(4);
$calendar->setDateTime(2021, 0, 1, 0, 0, 0);
echo $calendar->get(IntlCalendar::FIELD_YEAR), " / ", $calendar->get(IntlCalendar::FIELD_YEAR_WOY), "
";
Ожидаемый результат
2021 / 2020
Это объясняет, почему в шаблоне ICU yyyy и YYYY нельзя взаимозаменять.
Тот же механизм в процедурной форме: intlcal_set_minimal_days_in_first_week. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setFirstDayOfWeek, IntlDateFormatter::setPattern.
IntlCalendar::getDayOfWeekTypeУзнать, считается ли день рабочим, выходным или содержит границу выходного по данным локали.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getDayOfWeekType(int $dayOfWeek): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| dayOfWeek | Одна из DOW_* констант дня. |
| Возврат | DOW_TYPE_WEEKDAY/WEEKEND/WEEKEND_OFFSET/WEEKEND_CEASE либо false. Для двух переходных типов getWeekendTransition сообщает время границы. |
| Граница применения | Это обычные выходные по локали, а не производственный календарь праздников, график сотрудника или юридический календарь страны. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump($calendar->getDayOfWeekType(IntlCalendar::DOW_SATURDAY) === IntlCalendar::DOW_TYPE_WEEKEND);
Ожидаемый результат
bool(true)
Проверка относится к явно выбранной локали en_US.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(intlcal_get_day_of_week_type($calendar, IntlCalendar::DOW_MONDAY) === IntlCalendar::DOW_TYPE_WEEKDAY);
Ожидаемый результат
bool(true)
Праздник в понедельник этим API не определяется.
Тот же механизм в процедурной форме: intlcal_get_day_of_week_type. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::isWeekend, IntlCalendar::getWeekendTransition.
intlcal_get_day_of_week_typeУзнать, считается ли день рабочим, выходным или содержит границу выходного по данным локали.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_day_of_week_type(IntlCalendar $calendar, int $dayOfWeek): int|falseПроцедурная форма IntlCalendar::getDayOfWeekType. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| dayOfWeek | Одна из DOW_* констант дня. |
| Возврат | DOW_TYPE_WEEKDAY/WEEKEND/WEEKEND_OFFSET/WEEKEND_CEASE либо false. Для двух переходных типов getWeekendTransition сообщает время границы. |
| Граница применения | Это обычные выходные по локали, а не производственный календарь праздников, график сотрудника или юридический календарь страны. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump($calendar->getDayOfWeekType(IntlCalendar::DOW_SATURDAY) === IntlCalendar::DOW_TYPE_WEEKEND);
Ожидаемый результат
bool(true)
Проверка относится к явно выбранной локали en_US.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(intlcal_get_day_of_week_type($calendar, IntlCalendar::DOW_MONDAY) === IntlCalendar::DOW_TYPE_WEEKDAY);
Ожидаемый результат
bool(true)
Праздник в понедельник этим API не определяется.
Тот же механизм в процедурной форме: intlcal_get_day_of_week_type. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::isWeekend, IntlCalendar::getWeekendTransition.
IntlCalendar::getWeekendTransitionПолучить время внутри дня, когда по правилам локали начинаются или заканчиваются выходные.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getWeekendTransition(int $dayOfWeek): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| dayOfWeek | DOW_*; сначала getDayOfWeekType должен дать WEEKEND_OFFSET либо WEEKEND_CEASE. Для обычного полного рабочего/выходного дня это ошибочный запрос. |
| Возврат | int|false: миллисекунды от полуночи, не Unix timestamp. |
| Применение | Нужен только для профилей с границей внутри дня. Не придумывайте такую границу для каждой субботы. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump($calendar->getWeekendTransition(IntlCalendar::DOW_MONDAY));
Ожидаемый результат
bool(false)
false здесь демонстрирует неверный для этого дня запрос, а не отсутствие расширения.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$day = IntlCalendar::DOW_SATURDAY;
$type = $calendar->getDayOfWeekType($day);
if (in_array($type, [IntlCalendar::DOW_TYPE_WEEKEND_OFFSET, IntlCalendar::DOW_TYPE_WEEKEND_CEASE], true)) {
echo $calendar->getWeekendTransition($day), "
";
} else {
echo "whole day policy
";
}
Ожидаемый результат
whole day policy
В современной en_US переход внутри субботы не нужен; пример не подменяет данные фиктивной локалью.
Тот же механизм в процедурной форме: intlcal_get_weekend_transition. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getDayOfWeekType.
intlcal_get_weekend_transitionПолучить время внутри дня, когда по правилам локали начинаются или заканчиваются выходные.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_weekend_transition(IntlCalendar $calendar, int $dayOfWeek): int|falseПроцедурная форма IntlCalendar::getWeekendTransition. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| dayOfWeek | DOW_*; сначала getDayOfWeekType должен дать WEEKEND_OFFSET либо WEEKEND_CEASE. Для обычного полного рабочего/выходного дня это ошибочный запрос. |
| Возврат | int|false: миллисекунды от полуночи, не Unix timestamp. |
| Применение | Нужен только для профилей с границей внутри дня. Не придумывайте такую границу для каждой субботы. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump($calendar->getWeekendTransition(IntlCalendar::DOW_MONDAY));
Ожидаемый результат
bool(false)
false здесь демонстрирует неверный для этого дня запрос, а не отсутствие расширения.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$day = IntlCalendar::DOW_SATURDAY;
$type = $calendar->getDayOfWeekType($day);
if (in_array($type, [IntlCalendar::DOW_TYPE_WEEKEND_OFFSET, IntlCalendar::DOW_TYPE_WEEKEND_CEASE], true)) {
echo $calendar->getWeekendTransition($day), "
";
} else {
echo "whole day policy
";
}
Ожидаемый результат
whole day policy
В современной en_US переход внутри субботы не нужен; пример не подменяет данные фиктивной локалью.
Тот же механизм в процедурной форме: intlcal_get_weekend_transition. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getDayOfWeekType.
IntlCalendar::isWeekendПроверить конкретный момент на попадание в обычный выходной выбранной локали.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::isWeekend(?float $timestamp = null): bool| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | ?float миллисекунд Unix-эпохи; null использует момент текущего объекта. |
| Возврат | bool; false может означать ошибку, если календарь в некорректном состоянии. Для производственных праздников нужен отдельный источник данных. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setDateTime(2024, 0, 6, 12, 0, 0);
var_dump($calendar->isWeekend());
Ожидаемый результат
bool(true)
Проверяется дата и пояс объекта, а не только номер дня в UTC.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance('UTC', 'en_US@calendar=gregorian');
$calendar->clear();
$calendar->setDateTime(2024, 0, 6, 9, 0, 0);
while ($calendar->isWeekend()) {
$calendar->add(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
}
echo IntlDateFormatter::formatObject($calendar, 'yyyy-MM-dd EEEE', 'en_US'), "\n";
Ожидаемый результат
2024-01-08 Monday
6 января 2024 года было субботой, затем воскресеньем, поэтому цикл остановился в понедельник. ICU знает обычные выходные локали, но не производственный календарь, праздники компании или переносы рабочих дней. Для реальной доставки эти исключения приходят из отдельного проверяемого источника.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(intlcal_is_weekend($calendar, 0.0));
Ожидаемый результат
bool(false)
Явно переданный timestamp позволяет проверить момент без изменения календаря.
Тот же механизм в процедурной форме: intlcal_is_weekend. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getDayOfWeekType.
intlcal_is_weekendПроверить конкретный момент на попадание в обычный выходной выбранной локали.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_is_weekend(IntlCalendar $calendar, ?float $timestamp = null): boolПроцедурная форма IntlCalendar::isWeekend. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | ?float миллисекунд Unix-эпохи; null использует момент текущего объекта. |
| Возврат | bool; false может означать ошибку, если календарь в некорректном состоянии. Для производственных праздников нужен отдельный источник данных. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setDateTime(2024, 0, 6, 12, 0, 0);
var_dump($calendar->isWeekend());
Ожидаемый результат
bool(true)
Проверяется дата и пояс объекта, а не только номер дня в UTC.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance('UTC', 'en_US@calendar=gregorian');
$calendar->clear();
$calendar->setDateTime(2024, 0, 6, 9, 0, 0);
while ($calendar->isWeekend()) {
$calendar->add(IntlCalendar::FIELD_DAY_OF_MONTH, 1);
}
echo IntlDateFormatter::formatObject($calendar, 'yyyy-MM-dd EEEE', 'en_US'), "\n";
Ожидаемый результат
2024-01-08 Monday
6 января 2024 года было субботой, затем воскресеньем, поэтому цикл остановился в понедельник. ICU знает обычные выходные локали, но не производственный календарь, праздники компании или переносы рабочих дней. Для реальной доставки эти исключения приходят из отдельного проверяемого источника.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(intlcal_is_weekend($calendar, 0.0));
Ожидаемый результат
bool(false)
Явно переданный timestamp позволяет проверить момент без изменения календаря.
Тот же механизм в процедурной форме: intlcal_is_weekend. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getDayOfWeekType.
IntlCalendar::isLenientУправлять тем, нормализуются ли выходящие за диапазон календарные поля или вызывают ошибку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::isLenient(): bool| Аргумент или результат | Что означает на практике |
|---|---|
| lenient | bool у setter; по умолчанию true. Например, февральское число 30 может нормализоваться в март; для поля формы такое исправление часто нежелательно. |
| Возврат | isLenient bool, setLenient true. Ошибка полей обычно проявляется при последующем getTime/get, когда ICU вычисляет момент. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
var_dump($calendar->isLenient());
Ожидаемый результат
bool(false)
Настройка не проверяет ещё не введённые поля заранее.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
$calendar->setDate(2024, 1, 30);
var_dump($calendar->getTime());
Ожидаемый результат
bool(false)
Сам setDate возвращает void; окончательная проверка происходит при вычислении.
Тот же механизм в процедурной форме: intlcal_is_lenient. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setDate, IntlCalendar::getErrorCode.
intlcal_is_lenientУправлять тем, нормализуются ли выходящие за диапазон календарные поля или вызывают ошибку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_is_lenient(IntlCalendar $calendar): boolПроцедурная форма IntlCalendar::isLenient. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| lenient | bool у setter; по умолчанию true. Например, февральское число 30 может нормализоваться в март; для поля формы такое исправление часто нежелательно. |
| Возврат | isLenient bool, setLenient true. Ошибка полей обычно проявляется при последующем getTime/get, когда ICU вычисляет момент. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
var_dump($calendar->isLenient());
Ожидаемый результат
bool(false)
Настройка не проверяет ещё не введённые поля заранее.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
$calendar->setDate(2024, 1, 30);
var_dump($calendar->getTime());
Ожидаемый результат
bool(false)
Сам setDate возвращает void; окончательная проверка происходит при вычислении.
Тот же механизм в процедурной форме: intlcal_is_lenient. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setDate, IntlCalendar::getErrorCode.
IntlCalendar::setLenientУправлять тем, нормализуются ли выходящие за диапазон календарные поля или вызывают ошибку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::setLenient(bool $lenient): true| Аргумент или результат | Что означает на практике |
|---|---|
| lenient | bool у setter; по умолчанию true. Например, февральское число 30 может нормализоваться в март; для поля формы такое исправление часто нежелательно. |
| Возврат | isLenient bool, setLenient true. Ошибка полей обычно проявляется при последующем getTime/get, когда ICU вычисляет момент. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
var_dump($calendar->isLenient());
Ожидаемый результат
bool(false)
Настройка не проверяет ещё не введённые поля заранее.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
$calendar->setDate(2024, 1, 30);
var_dump($calendar->getTime());
Ожидаемый результат
bool(false)
Сам setDate возвращает void; окончательная проверка происходит при вычислении.
Тот же механизм в процедурной форме: intlcal_set_lenient. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setDate, IntlCalendar::getErrorCode.
intlcal_set_lenientУправлять тем, нормализуются ли выходящие за диапазон календарные поля или вызывают ошибку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_set_lenient(IntlCalendar $calendar, bool $lenient): trueПроцедурная форма IntlCalendar::setLenient. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| lenient | bool у setter; по умолчанию true. Например, февральское число 30 может нормализоваться в март; для поля формы такое исправление часто нежелательно. |
| Возврат | isLenient bool, setLenient true. Ошибка полей обычно проявляется при последующем getTime/get, когда ICU вычисляет момент. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
var_dump($calendar->isLenient());
Ожидаемый результат
bool(false)
Настройка не проверяет ещё не введённые поля заранее.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
$calendar->setDate(2024, 1, 30);
var_dump($calendar->getTime());
Ожидаемый результат
bool(false)
Сам setDate возвращает void; окончательная проверка происходит при вычислении.
Тот же механизм в процедурной форме: intlcal_set_lenient. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setDate, IntlCalendar::getErrorCode.
IntlCalendar::inDaylightTimeПроверить, активна ли сезонная поправка именно в момент этого календаря.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::inDaylightTime(): bool| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | bool; false может также означать ошибку вычисления. Это проверка конкретного момента, в отличие от общего useDaylightTime у пояса. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump($calendar->inDaylightTime());
Ожидаемый результат
bool(false)
Нулевой сезонный сдвиг не мешает поясу иметь иной базовый offset.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setDateTime(2024, 6, 1, 12, 0, 0);
var_dump(intlcal_in_daylight_time($calendar));
Ожидаемый результат
bool(true)
Месяц 6 — июль. В другую дату того же пояса ответ может быть другим.
Тот же механизм в процедурной форме: intlcal_in_daylight_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
intlcal_in_daylight_timeПроверить, активна ли сезонная поправка именно в момент этого календаря.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_in_daylight_time(IntlCalendar $calendar): boolПроцедурная форма IntlCalendar::inDaylightTime. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | bool; false может также означать ошибку вычисления. Это проверка конкретного момента, в отличие от общего useDaylightTime у пояса. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump($calendar->inDaylightTime());
Ожидаемый результат
bool(false)
Нулевой сезонный сдвиг не мешает поясу иметь иной базовый offset.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setDateTime(2024, 6, 1, 12, 0, 0);
var_dump(intlcal_in_daylight_time($calendar));
Ожидаемый результат
bool(true)
Месяц 6 — июль. В другую дату того же пояса ответ может быть другим.
Тот же механизм в процедурной форме: intlcal_in_daylight_time. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlTimeZone::getOffset.
IntlCalendar::getRepeatedWallTimeOptionОпределить, какой момент соответствует повторённому местному времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getRepeatedWallTimeOption(): int| Аргумент или результат | Что означает на практике |
|---|---|
| option | При переводе часов назад местные 02:30 могут встретиться дважды. FIRST выбирает первый момент, LAST второй; default LAST. |
| Возврат | Getter int из WALLTIME_*; setter true. Неподходящая опция вызывает ValueError. |
| Строгость | Для skipped политика действует только в lenient режиме; при строгом несуществующее время даёт ошибку. Настройка выбирает момент; не воспринимайте её как автоматическое подтверждение пользователем переноса встречи. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($calendar->getRepeatedWallTimeOption() === IntlCalendar::WALLTIME_FIRST);
Ожидаемый результат
bool(true)
Название FIRST/LAST относится к вариантам одного настенного времени, а не к порядку событий.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setLenient(true);
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
$calendar->setDateTime(2024, 9, 27, 2, 30, 0);
$first = $calendar->getTime();
$calendar->clear();
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_LAST);
$calendar->setDateTime(2024, 9, 27, 2, 30, 0);
echo ($calendar->getTime() - $first) / 3600000, " hour
";
Ожидаемый результат
1 hour
В первом случае выбираются два разных момента с одинаковыми часами; во втором несуществующее время перенесено к границе разрыва.
Тот же механизм в процедурной форме: intlcal_get_repeated_wall_time_option. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setLenient, IntlTimeZone::getOffset.
intlcal_get_repeated_wall_time_optionОпределить, какой момент соответствует повторённому местному времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_repeated_wall_time_option(IntlCalendar $calendar): intПроцедурная форма IntlCalendar::getRepeatedWallTimeOption. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| option | При переводе часов назад местные 02:30 могут встретиться дважды. FIRST выбирает первый момент, LAST второй; default LAST. |
| Возврат | Getter int из WALLTIME_*; setter true. Неподходящая опция вызывает ValueError. |
| Строгость | Для skipped политика действует только в lenient режиме; при строгом несуществующее время даёт ошибку. Настройка выбирает момент; не воспринимайте её как автоматическое подтверждение пользователем переноса встречи. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($calendar->getRepeatedWallTimeOption() === IntlCalendar::WALLTIME_FIRST);
Ожидаемый результат
bool(true)
Название FIRST/LAST относится к вариантам одного настенного времени, а не к порядку событий.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setLenient(true);
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
$calendar->setDateTime(2024, 9, 27, 2, 30, 0);
$first = $calendar->getTime();
$calendar->clear();
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_LAST);
$calendar->setDateTime(2024, 9, 27, 2, 30, 0);
echo ($calendar->getTime() - $first) / 3600000, " hour
";
Ожидаемый результат
1 hour
В первом случае выбираются два разных момента с одинаковыми часами; во втором несуществующее время перенесено к границе разрыва.
Тот же механизм в процедурной форме: intlcal_get_repeated_wall_time_option. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setLenient, IntlTimeZone::getOffset.
IntlCalendar::setRepeatedWallTimeOptionОпределить, какой момент соответствует повторённому местному времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::setRepeatedWallTimeOption(int $option): true| Аргумент или результат | Что означает на практике |
|---|---|
| option | При переводе часов назад местные 02:30 могут встретиться дважды. FIRST выбирает первый момент, LAST второй; default LAST. |
| Возврат | Getter int из WALLTIME_*; setter true. Неподходящая опция вызывает ValueError. |
| Строгость | Для skipped политика действует только в lenient режиме; при строгом несуществующее время даёт ошибку. Настройка выбирает момент; не воспринимайте её как автоматическое подтверждение пользователем переноса встречи. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($calendar->getRepeatedWallTimeOption() === IntlCalendar::WALLTIME_FIRST);
Ожидаемый результат
bool(true)
Название FIRST/LAST относится к вариантам одного настенного времени, а не к порядку событий.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setLenient(true);
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
$calendar->setDateTime(2024, 9, 27, 2, 30, 0);
$first = $calendar->getTime();
$calendar->clear();
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_LAST);
$calendar->setDateTime(2024, 9, 27, 2, 30, 0);
echo ($calendar->getTime() - $first) / 3600000, " hour
";
Ожидаемый результат
1 hour
В первом случае выбираются два разных момента с одинаковыми часами; во втором несуществующее время перенесено к границе разрыва.
Тот же механизм в процедурной форме: intlcal_set_repeated_wall_time_option. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setLenient, IntlTimeZone::getOffset.
intlcal_set_repeated_wall_time_optionОпределить, какой момент соответствует повторённому местному времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_set_repeated_wall_time_option(IntlCalendar $calendar, int $option): trueПроцедурная форма IntlCalendar::setRepeatedWallTimeOption. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| option | При переводе часов назад местные 02:30 могут встретиться дважды. FIRST выбирает первый момент, LAST второй; default LAST. |
| Возврат | Getter int из WALLTIME_*; setter true. Неподходящая опция вызывает ValueError. |
| Строгость | Для skipped политика действует только в lenient режиме; при строгом несуществующее время даёт ошибку. Настройка выбирает момент; не воспринимайте её как автоматическое подтверждение пользователем переноса встречи. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($calendar->getRepeatedWallTimeOption() === IntlCalendar::WALLTIME_FIRST);
Ожидаемый результат
bool(true)
Название FIRST/LAST относится к вариантам одного настенного времени, а не к порядку событий.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setLenient(true);
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
$calendar->setDateTime(2024, 9, 27, 2, 30, 0);
$first = $calendar->getTime();
$calendar->clear();
$calendar->setRepeatedWallTimeOption(IntlCalendar::WALLTIME_LAST);
$calendar->setDateTime(2024, 9, 27, 2, 30, 0);
echo ($calendar->getTime() - $first) / 3600000, " hour
";
Ожидаемый результат
1 hour
В первом случае выбираются два разных момента с одинаковыми часами; во втором несуществующее время перенесено к границе разрыва.
Тот же механизм в процедурной форме: intlcal_set_repeated_wall_time_option. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setLenient, IntlTimeZone::getOffset.
IntlCalendar::getSkippedWallTimeOptionОпределить, какой момент соответствует пропущенному местному времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getSkippedWallTimeOption(): int| Аргумент или результат | Что означает на практике |
|---|---|
| option | При переводе часов вперёд местные 02:30 могут не существовать. FIRST выбирает сторону до разрыва, LAST после, NEXT_VALID начало следующего допустимого времени. Default LAST. |
| Возврат | Getter int из WALLTIME_*; setter true. Неподходящая опция вызывает ValueError. |
| Строгость | Для skipped политика действует только в lenient режиме; при строгом несуществующее время даёт ошибку. Настройка выбирает момент; не воспринимайте её как автоматическое подтверждение пользователем переноса встречи. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setSkippedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($calendar->getSkippedWallTimeOption() === IntlCalendar::WALLTIME_FIRST);
Ожидаемый результат
bool(true)
Название FIRST/LAST относится к вариантам одного настенного времени, а не к порядку событий.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setLenient(true);
$calendar->setSkippedWallTimeOption(IntlCalendar::WALLTIME_NEXT_VALID);
$calendar->setDateTime(2024, 2, 31, 2, 30, 0);
$moment = $calendar->getTime();
$formatter = new IntlDateFormatter("en_US", 0, 0, "Europe/Berlin", IntlDateFormatter::GREGORIAN, "HH:mm");
echo $formatter->format($moment / 1000), "
";
Ожидаемый результат
03:00
В первом случае выбираются два разных момента с одинаковыми часами; во втором несуществующее время перенесено к границе разрыва.
Тот же механизм в процедурной форме: intlcal_get_skipped_wall_time_option. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setLenient, IntlTimeZone::getOffset.
intlcal_get_skipped_wall_time_optionОпределить, какой момент соответствует пропущенному местному времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_skipped_wall_time_option(IntlCalendar $calendar): intПроцедурная форма IntlCalendar::getSkippedWallTimeOption. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| option | При переводе часов вперёд местные 02:30 могут не существовать. FIRST выбирает сторону до разрыва, LAST после, NEXT_VALID начало следующего допустимого времени. Default LAST. |
| Возврат | Getter int из WALLTIME_*; setter true. Неподходящая опция вызывает ValueError. |
| Строгость | Для skipped политика действует только в lenient режиме; при строгом несуществующее время даёт ошибку. Настройка выбирает момент; не воспринимайте её как автоматическое подтверждение пользователем переноса встречи. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setSkippedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($calendar->getSkippedWallTimeOption() === IntlCalendar::WALLTIME_FIRST);
Ожидаемый результат
bool(true)
Название FIRST/LAST относится к вариантам одного настенного времени, а не к порядку событий.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setLenient(true);
$calendar->setSkippedWallTimeOption(IntlCalendar::WALLTIME_NEXT_VALID);
$calendar->setDateTime(2024, 2, 31, 2, 30, 0);
$moment = $calendar->getTime();
$formatter = new IntlDateFormatter("en_US", 0, 0, "Europe/Berlin", IntlDateFormatter::GREGORIAN, "HH:mm");
echo $formatter->format($moment / 1000), "
";
Ожидаемый результат
03:00
В первом случае выбираются два разных момента с одинаковыми часами; во втором несуществующее время перенесено к границе разрыва.
Тот же механизм в процедурной форме: intlcal_get_skipped_wall_time_option. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setLenient, IntlTimeZone::getOffset.
IntlCalendar::setSkippedWallTimeOptionОпределить, какой момент соответствует пропущенному местному времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::setSkippedWallTimeOption(int $option): true| Аргумент или результат | Что означает на практике |
|---|---|
| option | При переводе часов вперёд местные 02:30 могут не существовать. FIRST выбирает сторону до разрыва, LAST после, NEXT_VALID начало следующего допустимого времени. Default LAST. |
| Возврат | Getter int из WALLTIME_*; setter true. Неподходящая опция вызывает ValueError. |
| Строгость | Для skipped политика действует только в lenient режиме; при строгом несуществующее время даёт ошибку. Настройка выбирает момент; не воспринимайте её как автоматическое подтверждение пользователем переноса встречи. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setSkippedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($calendar->getSkippedWallTimeOption() === IntlCalendar::WALLTIME_FIRST);
Ожидаемый результат
bool(true)
Название FIRST/LAST относится к вариантам одного настенного времени, а не к порядку событий.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setLenient(true);
$calendar->setSkippedWallTimeOption(IntlCalendar::WALLTIME_NEXT_VALID);
$calendar->setDateTime(2024, 2, 31, 2, 30, 0);
$moment = $calendar->getTime();
$formatter = new IntlDateFormatter("en_US", 0, 0, "Europe/Berlin", IntlDateFormatter::GREGORIAN, "HH:mm");
echo $formatter->format($moment / 1000), "
";
Ожидаемый результат
03:00
В первом случае выбираются два разных момента с одинаковыми часами; во втором несуществующее время перенесено к границе разрыва.
Тот же механизм в процедурной форме: intlcal_set_skipped_wall_time_option. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setLenient, IntlTimeZone::getOffset.
intlcal_set_skipped_wall_time_optionОпределить, какой момент соответствует пропущенному местному времени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_set_skipped_wall_time_option(IntlCalendar $calendar, int $option): trueПроцедурная форма IntlCalendar::setSkippedWallTimeOption. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| option | При переводе часов вперёд местные 02:30 могут не существовать. FIRST выбирает сторону до разрыва, LAST после, NEXT_VALID начало следующего допустимого времени. Default LAST. |
| Возврат | Getter int из WALLTIME_*; setter true. Неподходящая опция вызывает ValueError. |
| Строгость | Для skipped политика действует только в lenient режиме; при строгом несуществующее время даёт ошибку. Настройка выбирает момент; не воспринимайте её как автоматическое подтверждение пользователем переноса встречи. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setSkippedWallTimeOption(IntlCalendar::WALLTIME_FIRST);
var_dump($calendar->getSkippedWallTimeOption() === IntlCalendar::WALLTIME_FIRST);
Ожидаемый результат
bool(true)
Название FIRST/LAST относится к вариантам одного настенного времени, а не к порядку событий.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("Europe/Berlin", "en_US");
$calendar->clear();
$calendar->setLenient(true);
$calendar->setSkippedWallTimeOption(IntlCalendar::WALLTIME_NEXT_VALID);
$calendar->setDateTime(2024, 2, 31, 2, 30, 0);
$moment = $calendar->getTime();
$formatter = new IntlDateFormatter("en_US", 0, 0, "Europe/Berlin", IntlDateFormatter::GREGORIAN, "HH:mm");
echo $formatter->format($moment / 1000), "
";
Ожидаемый результат
03:00
В первом случае выбираются два разных момента с одинаковыми часами; во втором несуществующее время перенесено к границе разрыва.
Тот же механизм в процедурной форме: intlcal_set_skipped_wall_time_option. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::setLenient, IntlTimeZone::getOffset.
IntlCalendar::getErrorCodeУзнать причину отказа вычисления календарного момента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getErrorCode(): int|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false для кода; string|false для текста. Код может обозначать warning: проверяйте intl_is_failure. |
| Область | Ошибки аргументов, обнаруженные PHP до вызова ICU, не обязательно записаны как ошибка объекта. Глобальное состояние и состояние объекта различаются; читайте нужное сразу после вызова. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(intl_is_failure($calendar->getErrorCode()));
Ожидаемый результат
bool(false)
Успех относится к конкретной операции этого объекта.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
$calendar->setDate(2024, 1, 30);
$calendar->getTime();
var_dump(intl_is_failure($calendar->getErrorCode()));
Ожидаемый результат
bool(true)
Показывайте пользователю смысл: такой даты нет, а технический код сохраняйте для разработчика.
Тот же механизм в процедурной форме: intlcal_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_is_failure.
intlcal_get_error_codeУзнать причину отказа вычисления календарного момента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_error_code(IntlCalendar $calendar): int|falseПроцедурная форма IntlCalendar::getErrorCode. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false для кода; string|false для текста. Код может обозначать warning: проверяйте intl_is_failure. |
| Область | Ошибки аргументов, обнаруженные PHP до вызова ICU, не обязательно записаны как ошибка объекта. Глобальное состояние и состояние объекта различаются; читайте нужное сразу после вызова. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
var_dump(intl_is_failure($calendar->getErrorCode()));
Ожидаемый результат
bool(false)
Успех относится к конкретной операции этого объекта.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
$calendar->setDate(2024, 1, 30);
$calendar->getTime();
var_dump(intl_is_failure($calendar->getErrorCode()));
Ожидаемый результат
bool(true)
Показывайте пользователю смысл: такой даты нет, а технический код сохраняйте для разработчика.
Тот же механизм в процедурной форме: intlcal_get_error_code. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_is_failure.
IntlCalendar::getErrorMessageУзнать причину отказа вычисления календарного момента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCalendar::getErrorMessage(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false для кода; string|false для текста. Код может обозначать warning: проверяйте intl_is_failure. |
| Область | Ошибки аргументов, обнаруженные PHP до вызова ICU, не обязательно записаны как ошибка объекта. Глобальное состояние и состояние объекта различаются; читайте нужное сразу после вызова. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Успех относится к конкретной операции этого объекта.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
$calendar->setDate(2024, 1, 30);
$calendar->getTime();
echo str_contains($calendar->getErrorMessage(), "U_ILLEGAL_ARGUMENT_ERROR") ? "invalid date
" : "other
";
Ожидаемый результат
invalid date
Показывайте пользователю смысл: такой даты нет, а технический код сохраняйте для разработчика.
Тот же механизм в процедурной форме: intlcal_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_is_failure.
intlcal_get_error_messageУзнать причину отказа вычисления календарного момента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlcal_get_error_message(IntlCalendar $calendar): string|falseПроцедурная форма IntlCalendar::getErrorMessage. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false для кода; string|false для текста. Код может обозначать warning: проверяйте intl_is_failure. |
| Область | Ошибки аргументов, обнаруженные PHP до вызова ICU, не обязательно записаны как ошибка объекта. Глобальное состояние и состояние объекта различаются; читайте нужное сразу после вызова. |
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Успех относится к конкретной операции этого объекта.
<?php
declare(strict_types=1);
$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
$calendar->setLenient(false);
$calendar->setDate(2024, 1, 30);
$calendar->getTime();
echo str_contains($calendar->getErrorMessage(), "U_ILLEGAL_ARGUMENT_ERROR") ? "invalid date
" : "other
";
Ожидаемый результат
invalid date
Показывайте пользователю смысл: такой даты нет, а технический код сохраняйте для разработчика.
Тот же механизм в процедурной форме: intlcal_get_error_message. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: intl_get_error_code, intl_is_failure.
IntlGregorianCalendar::__constructСоздать именно григорианский календарь независимо от обычной системы выбранной локали.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlGregorianCalendar::__construct($timezoneOrYear, $localeOrMonth, $day, $hour, $minute, $second)| Аргумент или результат | Что означает на практике |
|---|---|
| Современная форма | Ноль, один или два аргумента: пояс и locale. Затем clear + setDate/setDateTime либо setTime. |
| Исторические формы | Конструктор с year, month, day и optional hour/minute/second deprecated с PHP 8.4. Используйте createFromDate/createFromDateTime. Месяцы от 0. |
| Процедурная фабрика | intlgregcal_create_instance целиком deprecated с PHP 8.4; заменяется конструктором или современными статическими фабриками. |
| Результат | IntlGregorianCalendar, наследующий все операции IntlCalendar. При создании без полей момент текущий; не используйте его неуказанные секунды как ноль. |
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
echo $calendar->getType(), "
";
Ожидаемый результат
gregorian
Класс задаёт систему явно; locale всё ещё влияет на недельные правила.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
$calendar->clear();
$calendar->setDateTime(2024, 1, 29, 0, 0, 0);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd", "en_US"), "
";
Ожидаемый результат
2024-02-29
Месяц 1 — февраль, день 29 допустим в выбранном високосном году.
Тот же механизм в процедурной форме: intlgregcal_create_instance. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlGregorianCalendar::createFromDate, IntlCalendar::clear.
intlgregcal_create_instanceСоздать именно григорианский календарь независимо от обычной системы выбранной локали.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlgregcal_create_instance($timezoneOrYear, $localeOrMonth, $day, $hour, $minute, $second): ?IntlGregorianCalendarУстаревший API в текущем PHP. Используйте современную замену, указанную в контракте ниже; сохранён для чтения и миграции существующего кода.
Процедурная форма IntlGregorianCalendar::__construct. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| Современная форма | Ноль, один или два аргумента: пояс и locale. Затем clear + setDate/setDateTime либо setTime. |
| Исторические формы | Конструктор с year, month, day и optional hour/minute/second deprecated с PHP 8.4. Используйте createFromDate/createFromDateTime. Месяцы от 0. |
| Процедурная фабрика | intlgregcal_create_instance целиком deprecated с PHP 8.4; заменяется конструктором или современными статическими фабриками. |
| Результат | IntlGregorianCalendar, наследующий все операции IntlCalendar. При создании без полей момент текущий; не используйте его неуказанные секунды как ноль. |
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
echo $calendar->getType(), "
";
Ожидаемый результат
gregorian
Класс задаёт систему явно; locale всё ещё влияет на недельные правила.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
$calendar->clear();
$calendar->setDateTime(2024, 1, 29, 0, 0, 0);
echo IntlDateFormatter::formatObject($calendar, "yyyy-MM-dd", "en_US"), "
";
Ожидаемый результат
2024-02-29
Месяц 1 — февраль, день 29 допустим в выбранном високосном году.
Тот же механизм в процедурной форме: intlgregcal_create_instance. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlGregorianCalendar::createFromDate, IntlCalendar::clear.
IntlGregorianCalendar::createFromDateСоздать календарь непосредственно из даты с понятной сигнатурой.
PHP 8.3+ · intl
static IntlGregorianCalendar::createFromDate(int $year, int $month, int $dayOfMonth): static| Аргумент или результат | Что означает на практике |
|---|---|
| year,month,dayOfMonth | Год, месяц от 0, день от 1. Не передавайте месяц HTML-формы 1…12 без преобразования. |
| hour,minute,second | У createFromDateTime дополнительные поля времени; second nullable. Для точного нового момента задавайте все поля явно и учитывайте default timezone: у фабрик нет параметра timezone. |
| Возврат | static: новый объект данного класса. Для строгой проверки пользовательской даты не полагайтесь на lenient default: задайте строгий календарь, поля и проверьте getTime. |
<?php
declare(strict_types=1);
$calendar = IntlGregorianCalendar::createFromDate(2024, 1, 29);
echo $calendar->get(IntlCalendar::FIELD_YEAR), " / ", $calendar->get(IntlCalendar::FIELD_MONTH), " / ", $calendar->get(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
2024 / 1 / 29
Вывод полей не зависит от отображения названия месяца на конкретном языке.
<?php
declare(strict_types=1);
$calendar = IntlGregorianCalendar::createFromDate(2024, 0, 1);
echo $calendar->getActualMaximum(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
31
Фабрика экономит неоднозначную перегрузку, но не отменяет смысл календарных единиц.
Рядом по задаче: IntlCalendar::setDateTime, IntlCalendar::setTimeZone.
IntlGregorianCalendar::createFromDateTimeСоздать календарь непосредственно из даты и времени с понятной сигнатурой.
PHP 8.3+ · intl
static IntlGregorianCalendar::createFromDateTime(int $year, int $month, int $dayOfMonth, int $hour, int $minute, ?int $second = null): static| Аргумент или результат | Что означает на практике |
|---|---|
| year,month,dayOfMonth | Год, месяц от 0, день от 1. Не передавайте месяц HTML-формы 1…12 без преобразования. |
| hour,minute,second | У createFromDateTime дополнительные поля времени; second nullable. Для точного нового момента задавайте все поля явно и учитывайте default timezone: у фабрик нет параметра timezone. |
| Возврат | static: новый объект данного класса. Для строгой проверки пользовательской даты не полагайтесь на lenient default: задайте строгий календарь, поля и проверьте getTime. |
<?php
declare(strict_types=1);
$calendar = IntlGregorianCalendar::createFromDateTime(2024, 1, 29, 12, 30, 0);
echo $calendar->get(IntlCalendar::FIELD_YEAR), " / ", $calendar->get(IntlCalendar::FIELD_MONTH), " / ", $calendar->get(IntlCalendar::FIELD_DAY_OF_MONTH), "
";
Ожидаемый результат
2024 / 1 / 29
Вывод полей не зависит от отображения названия месяца на конкретном языке.
<?php
declare(strict_types=1);
$calendar = IntlGregorianCalendar::createFromDateTime(2024, 0, 1, 8, 15, 0);
echo $calendar->get(IntlCalendar::FIELD_HOUR_OF_DAY), " / ", $calendar->get(IntlCalendar::FIELD_MINUTE), "
";
Ожидаемый результат
8 / 15
Фабрика экономит неоднозначную перегрузку, но не отменяет смысл календарных единиц.
Рядом по задаче: IntlCalendar::setDateTime, IntlCalendar::setTimeZone.
IntlGregorianCalendar::isLeapYearОпределить високосность года в настроенном григорианском календаре.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlGregorianCalendar::isLeapYear(int $year): bool| Аргумент или результат | Что означает на практике |
|---|---|
| year | Целый год. Правила исторического перехода Julian/Gregorian могут влиять на исторические годы. |
| Возврат | bool, false также возможен при ошибке. Для дня конкретного месяца обычно удобнее getActualMaximum(FIELD_DAY_OF_MONTH). |
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
var_dump($calendar->isLeapYear(2024), $calendar->isLeapYear(2023));
Ожидаемый результат
bool(true)
bool(false)
Четырёхлетнее правило имеет исключения для веков.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
var_dump(intlgregcal_is_leap_year($calendar, 1900), intlgregcal_is_leap_year($calendar, 2000));
Ожидаемый результат
bool(false)
bool(true)
Делимость на 100 исключает високосность, делимость на 400 возвращает её в григорианской системе.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar('UTC', 'ru_RU');
foreach ([2023, 2024, 2100] as $year) {
echo $year, ': ', $calendar->isLeapYear($year)
? "29 февраля допустимо\n"
: "в феврале 28 дней\n";
}
Ожидаемый результат
2023: в феврале 28 дней
2024: 29 февраля допустимо
2100: в феврале 28 дней
Год 2100 делится на 4, но не является високосным по правилу веков. Такая проверка объясняет ошибку поля понятнее, чем общий текст «неверная дата». Для окончательной валидации всей даты используйте строгий календарь и getTime: одна високосность не проверяет месяц, день и пояс.
Тот же механизм в процедурной форме: intlgregcal_is_leap_year. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum.
intlgregcal_is_leap_yearОпределить високосность года в настроенном григорианском календаре.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlgregcal_is_leap_year(IntlGregorianCalendar $calendar, int $year): boolПроцедурная форма IntlGregorianCalendar::isLeapYear. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| year | Целый год. Правила исторического перехода Julian/Gregorian могут влиять на исторические годы. |
| Возврат | bool, false также возможен при ошибке. Для дня конкретного месяца обычно удобнее getActualMaximum(FIELD_DAY_OF_MONTH). |
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
var_dump($calendar->isLeapYear(2024), $calendar->isLeapYear(2023));
Ожидаемый результат
bool(true)
bool(false)
Четырёхлетнее правило имеет исключения для веков.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
var_dump(intlgregcal_is_leap_year($calendar, 1900), intlgregcal_is_leap_year($calendar, 2000));
Ожидаемый результат
bool(false)
bool(true)
Делимость на 100 исключает високосность, делимость на 400 возвращает её в григорианской системе.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar('UTC', 'ru_RU');
foreach ([2023, 2024, 2100] as $year) {
echo $year, ': ', $calendar->isLeapYear($year)
? "29 февраля допустимо\n"
: "в феврале 28 дней\n";
}
Ожидаемый результат
2023: в феврале 28 дней
2024: 29 февраля допустимо
2100: в феврале 28 дней
Год 2100 делится на 4, но не является високосным по правилу веков. Такая проверка объясняет ошибку поля понятнее, чем общий текст «неверная дата». Для окончательной валидации всей даты используйте строгий календарь и getTime: одна високосность не проверяет месяц, день и пояс.
Тот же механизм в процедурной форме: intlgregcal_is_leap_year. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::getActualMaximum.
IntlGregorianCalendar::getGregorianChangeПрочитать или настроить историческую границу перехода с юлианских дат на григорианские.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlGregorianCalendar::getGregorianChange(): float| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | У setter миллисекунды Unix-эпохи. Стандартная граница — 15 октября 1582, 00:00 UTC. |
| Возврат | Getter float, setter bool. Это настройка интерпретации исторических полей, а не дата перехода конкретной страны, автоматически угаданная по locale. |
| Применение | Нужно архивным/историческим данным с известным календарным соглашением. Обычному магазину не следует менять эту границу ради исправления современного часового пояса. |
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
echo $calendar->getGregorianChange(), "
";
Ожидаемый результат
-12219292800000
Отрицательное число — момент до 1970 года, измеренный в миллисекундах.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
$calendar->setGregorianChange(0.0);
echo $calendar->getGregorianChange(), "
";
Ожидаемый результат
0
Это демонстрация настройки, а не рекомендация использовать эпоху как историческую границу.
Тот же механизм в процедурной форме: intlgregcal_get_gregorian_change. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::isEquivalentTo, IntlCalendar::getType.
intlgregcal_get_gregorian_changeПрочитать или настроить историческую границу перехода с юлианских дат на григорианские.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlgregcal_get_gregorian_change(IntlGregorianCalendar $calendar): floatПроцедурная форма IntlGregorianCalendar::getGregorianChange. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | У setter миллисекунды Unix-эпохи. Стандартная граница — 15 октября 1582, 00:00 UTC. |
| Возврат | Getter float, setter bool. Это настройка интерпретации исторических полей, а не дата перехода конкретной страны, автоматически угаданная по locale. |
| Применение | Нужно архивным/историческим данным с известным календарным соглашением. Обычному магазину не следует менять эту границу ради исправления современного часового пояса. |
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
echo $calendar->getGregorianChange(), "
";
Ожидаемый результат
-12219292800000
Отрицательное число — момент до 1970 года, измеренный в миллисекундах.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
$calendar->setGregorianChange(0.0);
echo $calendar->getGregorianChange(), "
";
Ожидаемый результат
0
Это демонстрация настройки, а не рекомендация использовать эпоху как историческую границу.
Тот же механизм в процедурной форме: intlgregcal_get_gregorian_change. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::isEquivalentTo, IntlCalendar::getType.
IntlGregorianCalendar::setGregorianChangeПрочитать или настроить историческую границу перехода с юлианских дат на григорианские.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlGregorianCalendar::setGregorianChange(float $timestamp): bool| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | У setter миллисекунды Unix-эпохи. Стандартная граница — 15 октября 1582, 00:00 UTC. |
| Возврат | Getter float, setter bool. Это настройка интерпретации исторических полей, а не дата перехода конкретной страны, автоматически угаданная по locale. |
| Применение | Нужно архивным/историческим данным с известным календарным соглашением. Обычному магазину не следует менять эту границу ради исправления современного часового пояса. |
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
echo $calendar->getGregorianChange(), "
";
Ожидаемый результат
-12219292800000
Отрицательное число — момент до 1970 года, измеренный в миллисекундах.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
$calendar->setGregorianChange(0.0);
echo $calendar->getGregorianChange(), "
";
Ожидаемый результат
0
Это демонстрация настройки, а не рекомендация использовать эпоху как историческую границу.
Тот же механизм в процедурной форме: intlgregcal_set_gregorian_change. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::isEquivalentTo, IntlCalendar::getType.
intlgregcal_set_gregorian_changeПрочитать или настроить историческую границу перехода с юлианских дат на григорианские.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intlgregcal_set_gregorian_change(IntlGregorianCalendar $calendar, float $timestamp): boolПроцедурная форма IntlGregorianCalendar::setGregorianChange. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.
| Аргумент или результат | Что означает на практике |
|---|---|
| timestamp | У setter миллисекунды Unix-эпохи. Стандартная граница — 15 октября 1582, 00:00 UTC. |
| Возврат | Getter float, setter bool. Это настройка интерпретации исторических полей, а не дата перехода конкретной страны, автоматически угаданная по locale. |
| Применение | Нужно архивным/историческим данным с известным календарным соглашением. Обычному магазину не следует менять эту границу ради исправления современного часового пояса. |
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
echo $calendar->getGregorianChange(), "
";
Ожидаемый результат
-12219292800000
Отрицательное число — момент до 1970 года, измеренный в миллисекундах.
<?php
declare(strict_types=1);
$calendar = new IntlGregorianCalendar("UTC", "en_US");
$calendar->setGregorianChange(0.0);
echo $calendar->getGregorianChange(), "
";
Ожидаемый результат
0
Это демонстрация настройки, а не рекомендация использовать эпоху как историческую границу.
Тот же механизм в процедурной форме: intlgregcal_set_gregorian_change. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.
Рядом по задаче: IntlCalendar::isEquivalentTo, IntlCalendar::getType.
UConverter::__constructПрочитать текст старого файла/сервиса в известной кодировке и привести его к UTF-8 приложения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::__construct(?string $destination_encoding = null, ?string $source_encoding = null)| Аргумент или результат | Что означает на практике |
|---|---|
| destination_encoding,source_encoding | Сначала куда, затем откуда. При опущенных аргументах PHP использует UTF-8; явный null передаёт выбор default-конвертеру ICU, поэтому для воспроизводимости задавайте имена строками. |
| Результат | Объект с двумя конвертерами. Неподдерживаемая кодировка при создании вызывает IntlException; имя кодировки не определяется по содержимому автоматически. |
| Контракт входа | Получите кодировку из спецификации/заголовка/согласованного источника. Повторное ошибочное перекодирование уже правильного UTF-8 создаёт «кракозябры». |
<?php
declare(strict_types=1);
$nameFromSupplier = "caf\xE9";
$converter = new UConverter('UTF-8', 'ISO-8859-1');
$name = $converter->convert($nameFromSupplier);
if ($name === false) {
echo "Название не прочитано\n";
} else {
echo 'Название: ', $name, "\n";
}
Ожидаемый результат
Название: café
Поставщик заранее сообщил ISO-8859-1. Запись \xE9 в двойных кавычках создаёт ровно один байт: так пример содержит настоящие исходные данные независимо от UTF-8 самого PHP-файла. new создаёт инструмент и запоминает направление; первая строка конструктора — куда, вторая — откуда. convert получает байты, возвращает новую строку; исходная переменная не меняется. В UTF-8 буква é занимает C3 A9, но читателю нужен видимый текст café, который и выведен. UConverter не угадывает кодировку и не переводит слова.
<?php
declare(strict_types=1);
$converter = new UConverter("UTF-8", "UTF-8");
echo $converter->convert("Привет"), "
";
Ожидаемый результат
Привет
Конверсия меняет представление текста, а не переводит его язык.
<?php
declare(strict_types=1);
// Учебный файл поставщика; в проекте он уже получен из интеграции.
file_put_contents('supplier.csv', "id;name\n41;caf\xE9\n42;th\xE9\n");
$bytes = file_get_contents('supplier.csv');
if ($bytes === false) { throw new RuntimeException('Не прочитан supplier.csv'); }
$converter = new UConverter('UTF-8', 'ISO-8859-1');
$utf8 = $converter->convert($bytes);
if ($utf8 === false) { throw new RuntimeException('Не удалось перекодировать каталог'); }
$stream = fopen('php://memory', 'w+');
if ($stream === false) { throw new RuntimeException('Не открыт поток'); }
fwrite($stream, $utf8);
rewind($stream);
$header = fgetcsv($stream, 0, ';', '"', '');
if ($header !== ['id', 'name']) { throw new RuntimeException('Другие столбцы каталога'); }
while (($row = fgetcsv($stream, 0, ';', '"', '')) !== false) {
if (count($row) !== 2) { throw new RuntimeException('Некорректная строка'); }
echo 'Товар ', $row[0], ': ', $row[1], "\n";
}
fclose($stream);
Ожидаемый результат
Товар 41: café
Товар 42: thé
После запуска рядом появляется supplier.csv, а программа показывает две уже читаемые позиции. Здесь три разные работы: прочитать байты файла; привести их к UTF-8; разобрать структуру CSV. fgetcsv обрабатывает разделители и кавычки, поэтому не заменён explode по точке с запятой. Код ограничен небольшим доверенным учебным файлом: в загрузчике отдельно ограничивают размер, проверяют значения ID и обязательность названия. Если файл UTF-16, сначала преобразуют весь небольшой файл в UTF-8, затем разбирают CSV; побайтовое разбиение исходного UTF-16 по \n ошибочно. Для большого файла нужен поток с сохранением состояния декодера, а не convert над произвольными кусками.
Рядом по задаче: UConverter::convert, UConverter::transcode.
UConverter::convertПреобразовать байты из настроенного источника в настроенную целевую кодировку.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::convert(string $str, bool $reverse = false): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| str | Байтовая строка в source encoding, а не обязательно UTF-8. |
| reverse | false: source → destination; true меняет направление на destination → source. |
| Возврат | string|false. Непредставимые символы могут заменяться согласно политике конвертера; успешный результат не всегда означает отсутствие потери. Для строгого импорта переопределите callback и проверяйте ошибку. |
<?php
declare(strict_types=1);
$converter = new UConverter("UTF-8", "ISO-8859-1");
echo $converter->convert("caf\xE9"), "
";
Ожидаемый результат
café
Исходная строка содержит Latin-1; вывод после преобразования — UTF-8.
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'ISO-8859-1');
$csv = "id;name\n41;café\n";
$legacyBytes = $converter->convert($csv, true);
if ($legacyBytes === false) { throw new RuntimeException('Экспорт не подготовлен'); }
if (file_put_contents('legacy-catalog.csv', $legacyBytes) === false) {
throw new RuntimeException('Файл не сохранён');
}
echo "Файл legacy-catalog.csv записан в ISO-8859-1\n";
// Для просмотра в нашей UTF-8 консоли читаем файл обратно в UTF-8.
echo $converter->convert(file_get_contents('legacy-catalog.csv'));
Ожидаемый результат
Файл legacy-catalog.csv записан в ISO-8859-1
id;name
41;café
reverse=true разворачивает уже настроенную пару: UTF-8 → ISO-8859-1. На диске действительно лежит Latin-1, а повторная конверсия в конце служит только понятному просмотру. В редакторе файл надо открыть как ISO-8859-1. Заголовок HTTP charset сам по себе байты не преобразует. Этот набор содержит только представимые знаки; для произвольных названий требуется строгая политика потерь, разобранная в fromUCallback. В CSV из динамических полей используйте fputcsv, как в главе о файлах, а не склейку без кавычек.
Рядом по задаче: UConverter::setSubstChars, UConverter::fromUCallback.
UConverter::transcodeОдин раз перекодировать данные без хранения объекта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static UConverter::transcode(string $str, string $toEncoding, string $fromEncoding, ?array $options = null): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| str,toEncoding,fromEncoding | Байты, целевое имя, исходное имя. Порядок совпадает с конструктором. |
| options | ?array; документированный to_subst задаёт замену непредставимого символа в целевой кодировке. Она должна представлять один символ этой кодировки. |
| Возврат | string|false. Для нескольких порций с одной политикой и собственных callbacks удобнее объект. Это не потоковый декодер произвольно разрезанных посередине символа чанков. |
<?php
declare(strict_types=1);
$bytes = "\x00i\x00d\x00;\x00n\x00a\x00m\x00e\x00\n\x004\x001\x00;\x00c\x00a\x00f\x00\xE9\x00\n";
$text = UConverter::transcode($bytes, 'UTF-8', 'UTF-16BE');
if ($text === false) {
echo "Выгрузка не прочитана\n";
} else {
echo $text;
}
Ожидаемый результат
id;name
41;café
Показаны точные байты короткого файла UTF-16BE без BOM. BE означает старший байт первым. Конверсия применяется один раз ко всему небольшому файлу и делает результат пригодным для последующего fgetcsv. Это не рецепт «удалить все нули»: нулевые байты являются частью кодировки, а их вырезание может испортить другие символы. Направление берётся из договора поставщика; наличие странных символов на экране само по себе не доказывает UTF-16BE.
<?php
declare(strict_types=1);
echo UConverter::transcode("A€B", "US-ASCII", "UTF-8", ["to_subst" => "?"]), "
";
Ожидаемый результат
A?B
ASCII не умеет €. Замена допустима только если получатель согласен на потерю; финансовый знак может быть критичен.
Рядом по задаче: UConverter::convert.
UConverter::getSourceEncodingПрочитать каноническое имя исходной кодировки для журнала импорта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::getSourceEncoding(): string|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string|false|null. ICU может вернуть каноническое имя, отличающееся от переданного алиаса. null означает отсутствие соответствующего настроенного конвертера. |
| Назначение | Этот метод читает конфигурацию, а не определяет кодировку произвольной строки по её байтам. |
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'ISO-8859-1');
$name = $converter->convert("caf\xE9");
if ($name === false) { throw new RuntimeException('Название не прочитано'); }
echo 'источник: ', $converter->getSourceEncoding(), "\n";
echo 'Название: ', $name, "\n";
Ожидаемый результат
источник: ISO-8859-1
Название: café
Такую пару «настройка + прочитанное название» полезно видеть в локальной диагностике импорта. Getter читает состояние объекта, а не исследует содержимое строки. Имя может нормализоваться ICU; при неполной или неудачной конфигурации отдельно учитывайте false/null, описанные в контракте.
<?php
declare(strict_types=1);
$converter = new UConverter("UTF-8", "UTF-8");
echo $converter->getSourceEncoding(), "
";
Ожидаемый результат
UTF-8
UTF-8 → UTF-8 не является нормализацией NFC и не удаляет HTML.
Рядом по задаче: UConverter::convert.
UConverter::getDestinationEncodingПрочитать каноническое имя целевой кодировки для журнала импорта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::getDestinationEncoding(): string|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | string|false|null. ICU может вернуть каноническое имя, отличающееся от переданного алиаса. null означает отсутствие соответствующего настроенного конвертера. |
| Назначение | Этот метод читает конфигурацию, а не определяет кодировку произвольной строки по её байтам. |
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'ISO-8859-1');
$name = $converter->convert("caf\xE9");
if ($name === false) { throw new RuntimeException('Название не прочитано'); }
echo 'результат: ', $converter->getDestinationEncoding(), "\n";
echo 'Название: ', $name, "\n";
Ожидаемый результат
результат: UTF-8
Название: café
Такую пару «настройка + прочитанное название» полезно видеть в локальной диагностике импорта. Getter читает состояние объекта, а не исследует содержимое строки. Имя может нормализоваться ICU; при неполной или неудачной конфигурации отдельно учитывайте false/null, описанные в контракте.
<?php
declare(strict_types=1);
$converter = new UConverter("UTF-8", "UTF-8");
echo $converter->getDestinationEncoding(), "
";
Ожидаемый результат
UTF-8
UTF-8 → UTF-8 не является нормализацией NFC и не удаляет HTML.
Рядом по задаче: UConverter::convert.
UConverter::setSourceEncodingИзменить исходную кодировку, когда следующая партия имеет другой известный контракт.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::setSourceEncoding(string $encoding): bool| Аргумент или результат | Что означает на практике |
|---|---|
| encoding | Поддерживаемое имя/алиас кодировки ICU. |
| Возврат | bool. После смены настройка относится ко всем последующим convert этого объекта. Для разных одновременных интеграций проще отдельные объекты, чтобы не перепутать состояние. |
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'UTF-8');
echo $converter->convert('café'), "\n";
if (!$converter->setSourceEncoding('ISO-8859-1')) {
throw new RuntimeException('Новая кодировка не поддерживается');
}
echo $converter->convert("th\xE9"), "\n";
Ожидаемый результат
café
thé
Первая строка уже была UTF-8, вторая партия по договору пришла в Latin-1. Мы изменили только источник, поэтому оба результата остаются UTF-8. В обработчике, который параллельно обслуживает разных поставщиков, удобнее отдельный объект на конфигурацию: иначе чужая смена состояния может испортить данные.
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'ISO-8859-1');
if (!$converter->setSourceEncoding('NO-SUCH-ENCODING')) {
echo "Импорт остановлен: исправьте имя кодировки в настройках поставщика\n";
} else {
echo "Можно начать обработку\n";
}
Ожидаемый результат
Импорт остановлен: исправьте имя кодировки в настройках поставщика
Ложный результат управляет действием программы: код не приступает к преобразованию партии с неверным договором. Само слово false в отладчике не объяснило бы читателю, что делать. Подробность для журнала нужно взять из getErrorCode/getErrorMessage сразу после отказа.
Рядом по задаче: UConverter::getSourceEncoding, UConverter::getDestinationEncoding.
UConverter::setDestinationEncodingИзменить целевую кодировку, когда следующая партия имеет другой известный контракт.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::setDestinationEncoding(string $encoding): bool| Аргумент или результат | Что означает на практике |
|---|---|
| encoding | Поддерживаемое имя/алиас кодировки ICU. |
| Возврат | bool. После смены настройка относится ко всем последующим convert этого объекта. Для разных одновременных интеграций проще отдельные объекты, чтобы не перепутать состояние. |
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'UTF-8');
if (!$converter->setDestinationEncoding('ISO-8859-1')) {
throw new RuntimeException('Экспортная кодировка не поддерживается');
}
$bytes = $converter->convert('café');
if ($bytes === false) { throw new RuntimeException('Название не перекодировано'); }
file_put_contents('name-latin1.txt', $bytes);
echo 'На диске name-latin1.txt; текст: ',
UConverter::transcode(file_get_contents('name-latin1.txt'), 'UTF-8', 'ISO-8859-1'), "\n";
Ожидаемый результат
На диске name-latin1.txt; текст: café
Меняется формат результата следующего convert, а исходная строка PHP остаётся UTF-8. Последняя строка читает файл в заявленной кодировке, чтобы показать человеческий результат. Для произвольного текста сначала задайте политику непредставимых знаков; одна успешная запись файла не гарантирует сохранность каждого символа.
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'ISO-8859-1');
if (!$converter->setDestinationEncoding('NO-SUCH-ENCODING')) {
echo "Импорт остановлен: исправьте имя кодировки в настройках поставщика\n";
} else {
echo "Можно начать обработку\n";
}
Ожидаемый результат
Импорт остановлен: исправьте имя кодировки в настройках поставщика
Ложный результат управляет действием программы: код не приступает к преобразованию партии с неверным договором. Само слово false в отладчике не объяснило бы читателю, что делать. Подробность для журнала нужно взять из getErrorCode/getErrorMessage сразу после отказа.
Рядом по задаче: UConverter::getSourceEncoding, UConverter::getDestinationEncoding.
UConverter::getSourceTypeУзнать техническую категорию конвертера для диагностики возможностей и структуры кодировки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::getSourceType(): int|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false|null из констант типа UConverter. Это категория реализации, не имя charset и не определение языка. |
| Применение | UTF8, SBCS, MBCS и другие группы полезны в инструментах анализа; обычному импорту важнее правильные имена кодировок. |
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'UTF-8');
$type = $converter->getSourceType();
$label = match ($type) {
UConverter::UTF8 => 'UTF-8: у символа может быть несколько байтов',
UConverter::US_ASCII => 'ASCII: только базовый 7-битный набор',
default => 'Другая категория: читайте договор кодировки',
};
echo $label, "\n";
Ожидаемый результат
UTF-8: у символа может быть несколько байтов
Это пример страницы диагностики интеграции. match сопоставляет код именованной константе и выбирает текст для человека. По одному типу нельзя узнать язык, допустимость произвольной строки или безопасную границу разрезания потока; используйте декодер. Числа констант не нужно зашивать в свой код.
<?php
declare(strict_types=1);
$converter = new UConverter("US-ASCII", "US-ASCII");
var_dump($converter->getSourceType() === UConverter::US_ASCII);
Ожидаемый результат
bool(true)
Категория не даёт права заменять неизвестные символы без проверки результата.
Рядом по задаче: UConverter::getAvailable.
UConverter::getDestinationTypeУзнать техническую категорию конвертера для диагностики возможностей и структуры кодировки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::getDestinationType(): int|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | int|false|null из констант типа UConverter. Это категория реализации, не имя charset и не определение языка. |
| Применение | UTF8, SBCS, MBCS и другие группы полезны в инструментах анализа; обычному импорту важнее правильные имена кодировок. |
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'UTF-8');
$type = $converter->getDestinationType();
$label = match ($type) {
UConverter::UTF8 => 'UTF-8: у символа может быть несколько байтов',
UConverter::US_ASCII => 'ASCII: только базовый 7-битный набор',
default => 'Другая категория: читайте договор кодировки',
};
echo $label, "\n";
Ожидаемый результат
UTF-8: у символа может быть несколько байтов
Это пример страницы диагностики интеграции. match сопоставляет код именованной константе и выбирает текст для человека. По одному типу нельзя узнать язык, допустимость произвольной строки или безопасную границу разрезания потока; используйте декодер. Числа констант не нужно зашивать в свой код.
<?php
declare(strict_types=1);
$converter = new UConverter("US-ASCII", "US-ASCII");
var_dump($converter->getDestinationType() === UConverter::US_ASCII);
Ожидаемый результат
bool(true)
Категория не даёт права заменять неизвестные символы без проверки результата.
Рядом по задаче: UConverter::getAvailable.
UConverter::getAvailableПроверить набор кодировок конкретной ICU-сборки перед настройкой интеграции.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static UConverter::getAvailable(): array| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | array имён доступных конвертеров. Это не полный список всех алиасов: их даёт getAliases. Не фиксируйте число элементов как неизменную характеристику PHP. |
<?php
declare(strict_types=1);
$names = UConverter::getAvailable();
var_dump(in_array("UTF-8", $names, true));
Ожидаемый результат
bool(true)
Сборки ICU могут отличаться набором данных.
<?php
declare(strict_types=1);
$installed = UConverter::getAvailable();
$allowed = ['UTF-8', 'US-ASCII'];
foreach ($allowed as $encoding) {
if (in_array($encoding, $installed, true)) {
echo 'Можно выбрать: ', $encoding, "\n";
}
}
Ожидаемый результат
Можно выбрать: UTF-8
Можно выбрать: US-ASCII
Получен готовый список выбора для администратора, а не сотни технических названий ICU. Поддержка на сервере и разрешение вашим продуктом — разные фильтры. getAvailable возвращает имена конвертеров, поэтому произвольный алиас пользователя нельзя отклонять только из-за отсутствия в этом списке: сначала согласуйте каноническое имя.
Рядом по задаче: UConverter::getAliases.
UConverter::getAliasesУзнать альтернативные имена одной кодировки при согласовании charset разных систем.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static UConverter::getAliases(string $name): array|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| name | Известное имя/алиас конвертера. |
| Возврат | array|false|null. Алиасы обозначают одну кодировку в данных ICU; похожие названия не следует считать эквивалентными без проверки. |
<?php
declare(strict_types=1);
$aliases = UConverter::getAliases('UTF-8');
if (!is_array($aliases)) { throw new RuntimeException('Список имён недоступен'); }
$configured = 'utf-8';
$found = false;
foreach ($aliases as $alias) {
if (strcasecmp($configured, $alias) === 0) { $found = true; break; }
}
echo $configured, $found ? " — известный алиас UTF-8\n" : " — нужно проверить настройку\n";
Ожидаемый результат
utf-8 — известный алиас UTF-8
Пользователь интерфейса написал utf-8, документация — UTF-8. Вместо заведения двух разных форматов можно показать, что это известное ICU имя той же кодировки. Пример распознаёт только возвращённые алиасы выбранной UTF-8 и игнорирует регистр; ICU дополнительно допускает нечёткое написание имён, например utf8 может приниматься конструктором, не присутствуя буквально в getAliases. Поэтому отсутствие в этом списке не доказывает, что кодировка не поддерживается. Каноническое имя принятого конвертера показывает getSourceEncoding.
<?php
declare(strict_types=1);
$converter = new UConverter("UTF-8", "utf8");
echo $converter->getSourceEncoding(), "
";
Ожидаемый результат
UTF-8
Принятый алиас не нужно сохранять как новый отдельный тип данных.
Рядом по задаче: UConverter::getAvailable.
UConverter::getStandardsПосмотреть, какие стандарты именования конвертеров представлены в ICU.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static UConverter::getStandards(): ?array| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | ?array строк стандартов, например MIME/IANA. Это имена схем обозначения charset, а не сами кодировки. |
<?php
declare(strict_types=1);
$standards = UConverter::getStandards();
foreach (['MIME', 'IANA'] as $standard) {
if (is_array($standards) && in_array($standard, $standards, true)) {
echo $standard, ': схема имён присутствует в данных ICU', "\n";
}
}
Ожидаемый результат
MIME: схема имён присутствует в данных ICU
IANA: схема имён присутствует в данных ICU
Метод полезен автору диагностического инструмента, когда разные системы по-разному называют charset. Он не кодирует текст и не строит HTTP-заголовок; прикладному экспорту обычно достаточно convert/transcode. Важно показать границы: не каждой служебной функции нужно выдумывать роль в каждой форме сайта.
<?php
declare(strict_types=1);
$standards = UConverter::getStandards();
var_dump(is_array($standards) && in_array("IANA", $standards, true));
Ожидаемый результат
bool(true)
Наличие схемы не означает, что произвольная строка из заголовка является корректной кодировкой.
Рядом по задаче: UConverter::getAliases.
UConverter::setSubstCharsВыбрать или проверить замену символа, который невозможно представить в целевой кодировке.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::setSubstChars(string $chars): bool| Аргумент или результат | Что означает на практике |
|---|---|
| chars | У setter байтовая строка замены; должна быть допустима для соответствующих конвертеров. PHP задаёт её исходному и целевому конвертеру, поэтому настройка может не подойти одному из них. |
| Возврат | setSubstChars bool; getSubstChars string|false|null (читает настройку source). Нельзя считать замену универсальным исправлением повреждённого текста. |
| Потеря | Если часть знаков заменяется ?, оригинал уже не восстановить. Для денежных документов/идентификаторов предпочтительнее отклонить запись или явно сохранить сообщение о потере. |
<?php
declare(strict_types=1);
$converter = new UConverter('US-ASCII', 'UTF-8');
if (!$converter->setSubstChars('?')) { throw new RuntimeException('Замена не настроена'); }
echo 'Замена: ', $converter->getSubstChars(), "\n";
echo 'Было: Price 10 €', "\n";
echo 'Стало: ', $converter->convert('Price 10 €'), "\n";
Ожидаемый результат
Замена: ?
Было: Price 10 €
Стало: Price 10 ?
Технически строка получена, но знак валюты потерян. Показаны исходное значение Price 10 € и результат Price 10 ?. В денежных документах такое поведение обычно недопустимо; строгий callback ниже отклоняет экспорт. getSubstChars читает настройку исходной стороны; setSubstChars устанавливает её обеим сторонам.
<?php
declare(strict_types=1);
$converter = new UConverter("US-ASCII", "UTF-8");
$converter->setSubstChars("?");
echo $converter->convert("A€B"), "
";
Ожидаемый результат
A?B
Успешная строка не содержит исходный знак евро; это осознанно показанный побочный эффект.
Рядом по задаче: UConverter::fromUCallback, UConverter::transcode.
UConverter::getSubstCharsВыбрать или проверить замену символа, который невозможно представить в целевой кодировке.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::getSubstChars(): string|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| chars | У setter байтовая строка замены; должна быть допустима для соответствующих конвертеров. PHP задаёт её исходному и целевому конвертеру, поэтому настройка может не подойти одному из них. |
| Возврат | setSubstChars bool; getSubstChars string|false|null (читает настройку source). Нельзя считать замену универсальным исправлением повреждённого текста. |
| Потеря | Если часть знаков заменяется ?, оригинал уже не восстановить. Для денежных документов/идентификаторов предпочтительнее отклонить запись или явно сохранить сообщение о потере. |
<?php
declare(strict_types=1);
$converter = new UConverter('US-ASCII', 'UTF-8');
if (!$converter->setSubstChars('?')) { throw new RuntimeException('Замена не настроена'); }
echo 'Замена: ', $converter->getSubstChars(), "\n";
echo 'Было: Price 10 €', "\n";
echo 'Стало: ', $converter->convert('Price 10 €'), "\n";
Ожидаемый результат
Замена: ?
Было: Price 10 €
Стало: Price 10 ?
Технически строка получена, но знак валюты потерян. Показаны исходное значение Price 10 € и результат Price 10 ?. В денежных документах такое поведение обычно недопустимо; строгий callback ниже отклоняет экспорт. getSubstChars читает настройку исходной стороны; setSubstChars устанавливает её обеим сторонам.
<?php
declare(strict_types=1);
$converter = new UConverter("US-ASCII", "UTF-8");
$converter->setSubstChars("?");
echo $converter->convert("A€B"), "
";
Ожидаемый результат
A?B
Успешная строка не содержит исходный знак евро; это осознанно показанный побочный эффект.
Рядом по задаче: UConverter::fromUCallback, UConverter::transcode.
UConverter::toUCallbackОпределить политику повреждённых исходных байтов при декодировании.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::toUCallback(int $reason, string $source, string $codeUnits, &$error): array|string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| reason | REASON_UNASSIGNED/ILLEGAL/IRREGULAR сообщают проблему; RESET/CLOSE/CLONE — события жизненного цикла, которые нельзя трактовать как плохой символ. |
| source | У toUCallback оставшиеся исходные байты; у fromUCallback массив Unicode-кодовых точек оставшегося источника. Это диагностический контекст, не весь первоначальный файл. |
| Проблемный фрагмент | codeUnits — проблемные байты у toUCallback; codePoint — одна проблемная Unicode-точка у fromUCallback. |
| error | Код ICU по ссылке. В runtime PHP 8.5 параметр родителя не типизирован; в переопределении оставляем &$error без сужения до int, иначе нарушается совместимость сигнатуры. Обработав замену, callback может сбросить ошибку в U_ZERO_ERROR; сохранив ошибку, заставляет convert отказаться. |
| Возврат | string|int|array|null. При движении к Unicode int — кодовая точка, string — UTF-8; в обратном направлении int — выходной байт, string — выходные байты. Массив объединяет части, null не добавляет замену. |
| Когда вызывается | Обычно переопределяется в наследнике UConverter и вызывается ICU автоматически. Callback может вызываться на подготовительном проходе и при очистке: не делайте в нём платежи/внешние отправки и не считайте число вызовов количеством ошибок. |
<?php
declare(strict_types=1);
$converter = new UConverter("UTF-8", "US-ASCII");
$converter->setSubstChars("?");
$error = U_INVALID_CHAR_FOUND;
echo $converter->toUCallback(UConverter::REASON_ILLEGAL, "", "\xFF", $error), "
";
Ожидаемый результат
?
Прямой вызов здесь только показывает контракт. Обычная интеграция запускает convert и получает callback автоматически.
<?php
declare(strict_types=1);
class StrictImport extends UConverter
{
public function toUCallback(int $reason, string $source, string $codeUnits, &$error): string|int|array|null
{
if (in_array($reason, [self::REASON_UNASSIGNED, self::REASON_ILLEGAL, self::REASON_IRREGULAR], true)) {
$error = U_INVALID_CHAR_FOUND;
return null;
}
return parent::toUCallback($reason, $source, $codeUnits, $error);
}
}
$converter = new StrictImport('UTF-8', 'US-ASCII');
foreach (["Order 41", "Order \xFF"] as $record) {
$result = $converter->convert($record);
if ($result === false) {
echo "Запись отклонена: преобразование потеряло бы данные\n";
} else {
echo 'Готово: ', $result, "\n";
}
}
Ожидаемый результат
Готово: Order 41
Запись отклонена: преобразование потеряло бы данные
Первый элемент обрабатывается и даёт строку; второй не подменяется вопросительным знаком, а явно отклоняется. В ASCII не существует входного байта FF: toUCallback срабатывает при попытке декодирования. Приложение вызывает convert; ICU само обращается к переопределённому методу. Параметр error передан по ссылке: назначенный код сообщает ICU об отказе. События RESET/CLOSE/CLONE отданы родителю, потому что они не означают повреждение символа. Callback не отправляет письма и не пишет строку в БД: он может вызываться несколько раз, а решение по результату принимает внешний код.
Рядом по задаче: UConverter::reasonText, UConverter::convert.
UConverter::fromUCallbackОпределить политику непредставимых Unicode-символов при кодировании.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::fromUCallback(int $reason, array $source, int $codePoint, &$error): array|string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| reason | REASON_UNASSIGNED/ILLEGAL/IRREGULAR сообщают проблему; RESET/CLOSE/CLONE — события жизненного цикла, которые нельзя трактовать как плохой символ. |
| source | У toUCallback оставшиеся исходные байты; у fromUCallback массив Unicode-кодовых точек оставшегося источника. Это диагностический контекст, не весь первоначальный файл. |
| Проблемный фрагмент | codeUnits — проблемные байты у toUCallback; codePoint — одна проблемная Unicode-точка у fromUCallback. |
| error | Код ICU по ссылке. В runtime PHP 8.5 параметр родителя не типизирован; в переопределении оставляем &$error без сужения до int, иначе нарушается совместимость сигнатуры. Обработав замену, callback может сбросить ошибку в U_ZERO_ERROR; сохранив ошибку, заставляет convert отказаться. |
| Возврат | string|int|array|null. При движении к Unicode int — кодовая точка, string — UTF-8; в обратном направлении int — выходной байт, string — выходные байты. Массив объединяет части, null не добавляет замену. |
| Когда вызывается | Обычно переопределяется в наследнике UConverter и вызывается ICU автоматически. Callback может вызываться на подготовительном проходе и при очистке: не делайте в нём платежи/внешние отправки и не считайте число вызовов количеством ошибок. |
<?php
declare(strict_types=1);
$converter = new UConverter("US-ASCII", "UTF-8");
$converter->setSubstChars("?");
$error = U_INVALID_CHAR_FOUND;
echo $converter->fromUCallback(UConverter::REASON_UNASSIGNED, [], 0x20AC, $error), "
";
Ожидаемый результат
?
Прямой вызов здесь только показывает контракт. Обычная интеграция запускает convert и получает callback автоматически.
<?php
declare(strict_types=1);
class StrictExport extends UConverter
{
public function fromUCallback(int $reason, array $source, int $codePoint, &$error): string|int|array|null
{
if (in_array($reason, [self::REASON_UNASSIGNED, self::REASON_ILLEGAL, self::REASON_IRREGULAR], true)) {
$error = U_INVALID_CHAR_FOUND;
return null;
}
return parent::fromUCallback($reason, $source, $codePoint, $error);
}
}
$converter = new StrictExport('US-ASCII', 'UTF-8');
foreach (['Order 41', 'Price 10 €'] as $record) {
$result = $converter->convert($record);
if ($result === false) {
echo "Запись отклонена: преобразование потеряло бы данные\n";
} else {
echo 'Готово: ', $result, "\n";
}
}
Ожидаемый результат
Готово: Order 41
Запись отклонена: преобразование потеряло бы данные
Первый элемент обрабатывается и даёт строку; второй не подменяется вопросительным знаком, а явно отклоняется. В UTF-8 знак евро корректен, но в ASCII его невозможно записать: fromUCallback срабатывает при кодировании результата. Приложение вызывает convert; ICU само обращается к переопределённому методу. Параметр error передан по ссылке: назначенный код сообщает ICU об отказе. События RESET/CLOSE/CLONE отданы родителю, потому что они не означают повреждение символа. Callback не отправляет письма и не пишет строку в БД: он может вызываться несколько раз, а решение по результату принимает внешний код.
Рядом по задаче: UConverter::reasonText, UConverter::convert.
UConverter::reasonTextПреобразовать код события callback в техническое имя для диагностики.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static UConverter::reasonText(int $reason): string| Аргумент или результат | Что означает на практике |
|---|---|
| reason | Одна из REASON_* констант. |
| Возврат | string с названием причины. Это диагностическая подпись, а не перевод для интерфейса и не код ошибки UErrorCode. |
<?php
declare(strict_types=1);
echo UConverter::reasonText(UConverter::REASON_UNASSIGNED), "
";
Ожидаемый результат
REASON_UNASSIGNED
Reason объясняет событие конвертера, error отдельно сообщает статус результата.
<?php
declare(strict_types=1);
foreach ([UConverter::REASON_RESET, UConverter::REASON_ILLEGAL] as $reason) {
$badText = in_array($reason, [UConverter::REASON_UNASSIGNED, UConverter::REASON_ILLEGAL, UConverter::REASON_IRREGULAR], true);
echo UConverter::reasonText($reason), ': ',
$badText ? 'нужно применить политику ошибки данных' : 'служебное событие', "\n";
}
Ожидаемый результат
REASON_RESET: служебное событие
REASON_ILLEGAL: нужно применить политику ошибки данных
Это разбор двух заранее выбранных событий, а не утверждение, что convert вызвал их именно в таком порядке. reasonText даёт имя для журнала разработчика, а приложение отдельно выбирает понятное действие. Код причины не равен коду ошибки UErrorCode; передавать reason в intl_is_failure неверно.
Рядом по задаче: UConverter::toUCallback, UConverter::fromUCallback.
UConverter::getErrorCodeУзнать результат последней операции перекодирования или настройки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::getErrorCode(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | getErrorCode int; getErrorMessage ?string. Сообщение может отсутствовать при отсутствии ошибки. |
| Порядок | Проверяйте сразу после false; следующая операция может сбросить состояние. Успешная конверсия с заменой всё ещё может быть потерей, поэтому код ошибки не заменяет выбранную политику callbacks. |
<?php
declare(strict_types=1);
$converter = new UConverter("UTF-8", "ISO-8859-1");
$converter->convert("abc");
var_dump(intl_is_failure($converter->getErrorCode()));
Ожидаемый результат
bool(false)
Не требуем фиксированную строку сообщения при отсутствии ошибки.
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'ISO-8859-1');
$configured = $converter->setSourceEncoding('NO-SUCH-ENCODING');
$error = $converter->getErrorCode();
if (!$configured && intl_is_failure($error)) {
echo "Партия не запущена. Укажите существующую кодировку поставщика.\n";
}
Ожидаемый результат
Партия не запущена. Укажите существующую кодировку поставщика.
Статус считан сразу после неудачной операции, пока другая операция его не перезаписала. Мы не сравниваем с одним случайным числом ошибки ICU: сначала проверяем общий отказ, затем принимаем решение по партии. Отдельно можно записать техническое имя intl_error_name($error) в служебный журнал.
Рядом по задаче: intl_is_failure.
UConverter::getErrorMessageУзнать результат последней операции перекодирования или настройки.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
UConverter::getErrorMessage(): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| Возврат | getErrorCode int; getErrorMessage ?string. Сообщение может отсутствовать при отсутствии ошибки. |
| Порядок | Проверяйте сразу после false; следующая операция может сбросить состояние. Успешная конверсия с заменой всё ещё может быть потерей, поэтому код ошибки не заменяет выбранную политику callbacks. |
<?php
declare(strict_types=1);
$converter = new UConverter("UTF-8", "ISO-8859-1");
$converter->convert("abc");
var_dump($converter->getErrorMessage() === null || str_contains($converter->getErrorMessage(), "U_ZERO_ERROR"));
Ожидаемый результат
bool(true)
Не требуем фиксированную строку сообщения при отсутствии ошибки.
<?php
declare(strict_types=1);
$converter = new UConverter('UTF-8', 'ISO-8859-1');
if (!$converter->setSourceEncoding('NO-SUCH-ENCODING')) {
$details = $converter->getErrorMessage();
file_put_contents('import-error.log', ($details ?? 'Нет подробностей ICU') . "\n");
echo "Импорт остановлен; техническая причина сохранена в import-error.log\n";
echo 'Код для обращения к разработчику: ', intl_error_name($converter->getErrorCode()), "\n";
}
Ожидаемый результат
Импорт остановлен; техническая причина сохранена в import-error.log
Код для обращения к разработчику: U_FILE_ACCESS_ERROR
В файле находится реальное сообщение ICU, а оператор видит понятный результат и технический код. Формулировка getErrorMessage может различаться между версиями, поэтому не разбирайте её регулярным выражением для управления программой. Журнал в примере лежит рядом со скриптом; в веб-проекте для него нужен закрытый от скачивания каталог с ограниченным доступом, а не публичная папка сайта.
Рядом по задаче: intl_is_failure.
Spoofchecker::__constructПодготовить проверку похожих Unicode-имён при регистрации аккаунта или показе домена.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Spoofchecker::__construct()| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. Настройки проверок задаются отдельными методами. |
| Политика | По умолчанию с ICU 58 включены все проверки, уровень HIGHLY_RESTRICTIVE. Явные настройки предпочтительнее неявной зависимости от версии. |
| Результат | Объект для проверки строк. Он не проверяет владельца домена, права доступа или честность пользователя; это дополнительный сигнал о структуре текста. |
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$candidate = 'garden42';
if ($checker->isSuspicious($candidate)) {
echo "Имя требует дополнительной проверки\n";
} else {
echo "Unicode-подмена не обнаружена; продолжаем остальные проверки\n";
}
Ожидаемый результат
Unicode-подмена не обнаружена; продолжаем остальные проверки
Объект создаётся без аргументов и применяет профиль ICU. false здесь означает только отсутствие сигналов Spoofchecker. До регистрации всё равно проверяют длину, разрешённую грамматику продукта, занятость имени, права и другие правила. Так результат функции становится одним шагом процесса, а не обещанием полной безопасности.
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$checker->setAllowedChars('[a-z0-9_]');
foreach (['service_42', 'service-42'] as $candidate) {
echo $candidate, $checker->isSuspicious($candidate) ? ': отклонён форматом' : ': формат принят', "\n";
}
Ожидаемый результат
service_42: формат принят
service-42: отклонён форматом
В договоре технического логина разрешены строчные латинские буквы, цифры и underscore. Дефис не опасен сам по себе — он отсутствует именно в выбранной грамматике. Ограничение символов не проверяет, что имя начинается с буквы, имеет допустимую длину или ещё свободно; эти условия добавляются отдельно.
Рядом по задаче: Spoofchecker::setChecks, Spoofchecker::setAllowedChars.
Spoofchecker::isSuspiciousПроверить одно имя на смешение письменностей, невидимые символы и другие признаки выбранного профиля.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Spoofchecker::isSuspicious(string $string, &$errorCode = null): bool| Аргумент или результат | Что означает на практике |
|---|---|
| string | Строка UTF-8. Метод анализирует последовательность Unicode, а не отрисовку конкретным шрифтом. |
| errorCode | Необязательная переменная по ссылке получает битовую маску сработавших проверок. Несмотря на имя параметра, при успешной проверке это не обычный код UErrorCode; не передавайте маску в intl_is_failure как статус вызова. |
| Возврат | bool: найдены подозрительные признаки. Ошибка ICU/невалидный ввод также может привести к true и warning; это нельзя трактовать как успешно завершённую проверку без замечаний. |
| После проверки | Покажите пользователю понятную причину/подсказку или отправьте спорное имя на дополнительную проверку. Не запрещайте все нелатинские имена автоматически без политики продукта. |
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$checker->setAllowedChars('[a-z]');
$checks = 0;
$candidate = 'shop1';
if ($checker->isSuspicious($candidate, $checks) && ($checks & Spoofchecker::CHAR_LIMIT)) {
echo "Имя {$candidate} отклонено: разрешены только буквы a–z\n";
}
Ожидаемый результат
Имя shop1 отклонено: разрешены только буквы a–z
Вторая переменная заполняется битовой маской сработавших признаков. Оператор & проверяет конкретный флаг CHAR_LIMIT; это не сравнение величины ошибки. Пользователь получает правило поля, а разработчик может сохранить маску для диагностики. Если цифры нужны, исправляют UnicodeSet, а не отключают всю проверку.
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$candidate = 'pаypal'; // второй символ визуально похож на a, но это кириллическая а
if ($checker->isSuspicious($candidate)) {
$points = [];
foreach (mb_str_split($candidate) as $character) {
$points[] = sprintf('U+%04X', IntlChar::ord($character));
}
echo "Имя отправлено на проверку\n";
echo implode(' ', $points), "\n";
}
Ожидаемый результат
Имя отправлено на проверку
U+0070 U+0430 U+0079 U+0070 U+0061 U+006C
В слове p а ypal вторая видимая буква — кириллическая а U+0430, остальные латинские. Список кодовых точек делает отличие наблюдаемым даже в шрифте, где знаки выглядят одинаково. Комментарий в коде уточнён по позиции: после p идёт подменённая а. Пример не объявляет владельца злоумышленником; спорное имя получает дополнительную проверку.
Рядом по задаче: Spoofchecker::areConfusable, Normalizer::normalize.
Spoofchecker::areConfusableСравнить новое имя с важным существующим именем: не выглядит ли оно похожим из-за Unicode-подмены.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Spoofchecker::areConfusable(string $string1, string $string2, &$errorCode = null): bool| Аргумент или результат | Что означает на практике |
|---|---|
| string1,string2 | Две строки UTF-8. |
| errorCode | Выходная маска типов смешиваемости SINGLE_SCRIPT/MIXED_SCRIPT/WHOLE_SCRIPT_CONFUSABLE; это не статус UErrorCode при успешной проверке. |
| Возврат | bool. Эвристика не гарантирует визуальную идентичность во всех шрифтах. Для большого каталога не сравнивайте каждую новую строку без индекса/ограничения со всеми историческими значениями. |
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$reserved = 'support';
$candidate = 'suppоrt'; // здесь о — кириллическая U+043E
$checks = 0;
if ($checker->areConfusable($reserved, $candidate, $checks)) {
echo "Имя нельзя зарегистрировать: оно похоже на служебное support\n";
echo 'Сработавшая маска: ', $checks, "\n";
}
Ожидаемый результат
Имя нельзя зарегистрировать: оно похоже на служебное support
Сработавшая маска: 2
Метод сравнивает две конкретные строки. Кандидат содержит кириллическую о и выглядит как служебное имя support. Число 2 — маска MIXED_SCRIPT_CONFUSABLE в текущем API; в прикладном сообщении показывается понятная причина, а не число. На большом сайте зарезервированных имён мало и их можно проверять напрямую; сравнивать каждую новую строку со всеми пользователями квадратичным перебором нельзя.
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$reserved = 'support';
$candidate = 'garden';
echo $checker->areConfusable($reserved, $candidate)
? "Нужна ручная проверка\n"
: "На support не похоже; продолжаем проверку занятости\n";
Ожидаемый результат
На support не похоже; продолжаем проверку занятости
false отвечает только на вопрос визуальной смешиваемости этой пары по правилам ICU. Имя garden всё ещё может быть занято, запрещено политикой или принадлежать другому пользователю. Следующий шаг назван явно, чтобы areConfusable не воспринимался как универсальная валидация.
Рядом по задаче: Spoofchecker::isSuspicious.
Spoofchecker::setChecksВыбрать конкретные проверки для поля с известным назначением.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Spoofchecker::setChecks(int $checks): void| Аргумент или результат | Что означает на практике |
|---|---|
| checks | Битовая маска поддержанных флагов проверок: CONFUSABLE, SINGLE_SCRIPT, INVISIBLE, CHAR_LIMIT и современные MIXED_NUMBERS/HIDDEN_OVERLAY. Это не константы уровней ASCII/HIGHLY_RESTRICTIVE и не опции UnicodeSet. |
| Возврат | void. Маска заменяет набор проверок; отключая флаг, вы отключаете соответствующий сигнал. С ICU 58 default включает все проверки; до этого SINGLE_SCRIPT исключался. |
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$checker->setAllowedChars('[A-Z0-9-]');
$checker->setChecks(Spoofchecker::CHAR_LIMIT);
foreach (['BOX-42', 'BOX_42'] as $code) {
echo $code, $checker->isSuspicious($code) ? ': неверные символы' : ': символы допустимы', "\n";
}
Ожидаемый результат
BOX-42: символы допустимы
BOX_42: неверные символы
setChecks заменяет активный набор проверок одним CHAR_LIMIT, поэтому результат говорит только о разрешённых символах. Для BOX-42 отдельно проверяют шаблон частей, длину и существование коробки. Если также важны невидимые комбинации или смешение письменностей, соответствующие флаги объединяют через |.
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$checker->setAllowedChars('[a-z]');
$checker->setChecks(Spoofchecker::CHAR_LIMIT | Spoofchecker::INVISIBLE);
$checks = 0;
$candidate = 'shop1';
$checker->isSuspicious($candidate, $checks);
$reasons = [];
if ($checks & Spoofchecker::CHAR_LIMIT) { $reasons[] = 'есть запрещённый символ'; }
if ($checks & Spoofchecker::INVISIBLE) { $reasons[] = 'есть подозрительная невидимая комбинация'; }
echo implode('; ', $reasons), "\n";
Ожидаемый результат
есть запрещённый символ
Оператор | включает обе проверки, а & затем расшифровывает независимо сработавшие биты. У этой строки найден только запрещённый символ 1. Массив причин можно превратить в подсказки формы. Не следует выводить сырые технические маски пользователю или предполагать, что одна причина исключает другую.
Рядом по задаче: Spoofchecker::setRestrictionLevel, Spoofchecker::setAllowedChars.
Spoofchecker::setRestrictionLevelЗадать допустимую сложность сочетаний письменностей для идентификаторов продукта.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Spoofchecker::setRestrictionLevel(int $level): void| Аргумент или результат | Что означает на практике |
|---|---|
| level | Один из ASCII, SINGLE_SCRIPT_RESTRICTIVE, HIGHLY_RESTRICTIVE, MODERATELY_RESTRICTIVE, MINIMALLY_RESTRICTIVE, UNRESTRICTIVE. Неверное значение вызывает ValueError. |
| Возврат | void; default HIGHLY_RESTRICTIVE. Уровень — политика смешения, не регистр символов и не порог числа найденных ошибок. |
| Применение | ASCII уместен для технического кода с такой спецификацией, но не для произвольного имени человека. Международному продукту нужен профиль, допускающий реальные языки аудитории. |
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$checker->setRestrictionLevel(Spoofchecker::ASCII);
foreach (['API42', 'АПИ42'] as $code) {
echo $code, $checker->isSuspicious($code) ? ': не подходит для API-кода' : ': подходит для API-кода', "\n";
}
Ожидаемый результат
API42: подходит для API-кода
АПИ42: не подходит для API-кода
ASCII выбран по спецификации машинного API-кода. Кириллица не объявляется плохой: для отображаемого имени клиента нужна другая политика. Уровень ограничения относится к сочетанию письменностей, не проверяет смысл, длину, уникальность или секретность кода.
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
try { $checker->setRestrictionLevel(123); } catch (ValueError $error) { echo "invalid level
"; }
Ожидаемый результат
invalid level
Именованные константы защищают от случайной передачи маски другой группы.
Рядом по задаче: Spoofchecker::setChecks.
Spoofchecker::setAllowedLocalesРазрешить письменности, связанные с заданными локалями, когда известны языки поля.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Spoofchecker::setAllowedLocales(string $locales): void| Аргумент или результат | Что означает на практике |
|---|---|
| locales | Строка списка locale через запятую, например en,ru. ICU определяет разрешённые письменности по данным локалей; это не проверка словаря и не доказательство языка конкретного текста. |
| Возврат | void. Настройка влияет на разрешённый набор символов и CHAR_LIMIT. Последующий setAllowedChars задаёт свою явную политику; порядок настроек имеет значение. |
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$checker->setAllowedLocales('en');
$checker->setChecks(Spoofchecker::CHAR_LIMIT);
foreach (['warehouse', 'склад'] as $name) {
echo $name, $checker->isSuspicious($name) ? ': письменность вне профиля en' : ': письменность разрешена', "\n";
}
Ожидаемый результат
warehouse: письменность разрешена
склад: письменность вне профиля en
Поле предназначено для английского системного имени, поэтому en ограничивает письменности. Это решение продукта, а не общий запрет русского текста. Для названия, которое видит пользователь, обычно разрешают реальные языки аудитории и сохраняют оригинальное написание.
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$checker->setAllowedLocales('en,ru');
$checker->setChecks(Spoofchecker::CHAR_LIMIT);
foreach (['магазин', 'shop', '東京'] as $name) {
echo $name, $checker->isSuspicious($name) ? ': нужна проверка профиля' : ': письменность разрешена', "\n";
}
Ожидаемый результат
магазин: письменность разрешена
shop: письменность разрешена
東京: нужна проверка профиля
ICU связывает локали en и ru с допустимыми письменностями. Японское имя не становится вредоносным — оно просто не входит в заявленный профиль этого продукта и требует осмысленного решения. setAllowedLocales не определяет язык текста и не проверяет слово по словарю.
Рядом по задаче: Spoofchecker::setAllowedChars.
Spoofchecker::setAllowedCharsЗадать точную грамматику допустимых символов для служебного имени.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
Spoofchecker::setAllowedChars(string $pattern, int $patternOptions = 0): void| Аргумент или результат | Что означает на практике |
|---|---|
| pattern | UnicodeSet в квадратных скобках, например [a-z0-9]. Это похожая на regex символьная группа, но не полный PCRE с /.../ и якорями. |
| patternOptions | 0; либо IGNORE_SPACE отдельно или вместе ровно с одной из CASE_INSENSITIVE, ADD_CASE_MAPPINGS, SIMPLE_CASE_INSENSITIVE. Нельзя передать CASE_INSENSITIVE отдельно или смешать все варианты. |
| Возврат / ошибки | void; неверный pattern или комбинация flags вызывает ValueError. SIMPLE_CASE_INSENSITIVE зависит от достаточно нового ICU. |
| Практика | Ограничение набора не проверяет длину, порядок символов и уникальность. Эти правила проверяются отдельно. |
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$checker->setAllowedChars('[a-z0-9_]');
foreach (['order_7', 'order-7'] as $name) {
echo $name, $checker->isSuspicious($name) ? ': отклонено' : ': принято', "\n";
}
Ожидаемый результат
order_7: принято
order-7: отклонено
UnicodeSet перечисляет допустимые символы технического идентификатора. Underscore добавлен намеренно, дефис — нет. Это не полный PCRE: правило позиции символов и длины задаётся отдельно. Изменение договора делается в одном явном наборе, а не подавлением результата для отдельных строк.
<?php
declare(strict_types=1);
$checker = new Spoofchecker();
$options = Spoofchecker::IGNORE_SPACE | Spoofchecker::CASE_INSENSITIVE;
$checker->setAllowedChars('[a-z]', $options);
$candidate = 'Shop';
echo $checker->isSuspicious($candidate) ? "Имя отклонено\n" : "Принято как написано: {$candidate}\n";
Ожидаемый результат
Принято как написано: Shop
CASE_INSENSITIVE расширяет допустимый набор регистра, но не переводит строку в lower-case и не меняет переменную candidate. IGNORE_SPACE относится к пробелам синтаксиса UnicodeSet, а не разрешает пробелы в самом имени. Если приложению нужен регистронезависимый уникальный ключ, его строят и проверяют отдельно.
Рядом по задаче: Spoofchecker::setChecks.
IntlBreakIterator::createCharacterInstanceНайти границы воспринимаемых символов: буква и комбинируемые знаки остаются вместе.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlBreakIterator::createCharacterInstance(?string $locale = null): ?IntlBreakIterator| Аргумент или результат | Что означает на практике |
|---|---|
| locale | У языковых фабрик locale или null для default locale. CodePoint не принимает locale: позиции кодовых точек не зависят от языка. |
| Возврат | Объект IntlBreakIterator или специализированного потомка; языковые фабрики допускают null при неудаче. CodePoint возвращает IntlCodePointBreakIterator. |
| После создания | setText получает UTF-8. foreach выдаёт целые байтовые позиции, включая 0 и конец; пустой текст имеет граничную позицию 0. |
| Title | Семейство ICU Title историческое/deprecated на уровне ICU; PHP сохраняет фабрику для совместимости. Для новых задач предпочитайте явное преобразование регистра, а не самодельный алгоритм по найденным частям. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("Ae\u{0301}B");
echo implode(",", iterator_to_array($iterator)), "
";
Ожидаемый результат
0,1,4,5
Составная e + ударение занимает три байта, но образует одну графему.
<?php
declare(strict_types=1);
$caption = 'Заказ готов 👍🏽 сегодня';
$limit = 14;
$iterator = IntlBreakIterator::createCharacterInstance('ru_RU');
$iterator->setText($caption);
$boundaries = iterator_to_array($iterator, false);
if (count($boundaries) - 1 <= $limit) {
echo $caption, "\n";
} else {
$byteEnd = $boundaries[$limit];
echo rtrim(substr($caption, 0, $byteEnd)), "…\n";
}
Ожидаемый результат
Заказ готов 👍🏽…
Лимит считается по графемам: модификатор оттенка остаётся внутри одного эмодзи. Граница уже выражена в байтах, поэтому её можно безопасно передать substr. Многоточие добавлено после обрезки и само не входит в лимит 14. Для ограничения поля в базе отдельно проверяют число байт итоговой строки; видимый знак не имеет фиксированного размера в байтах или пикселях.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("A");
echo $iterator->last(), "
";
$iterator->setText("я");
echo $iterator->last(), "
";
Ожидаемый результат
1
2
last возвращает длину исходного UTF-8 в байтах. Один видимый символ я занимает два байта.
Рядом по задаче: IntlBreakIterator::setText, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::createCodePointInstanceНайти границы отдельных кодовых точек Unicode.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlBreakIterator::createCodePointInstance(): IntlCodePointBreakIterator| Аргумент или результат | Что означает на практике |
|---|---|
| locale | У языковых фабрик locale или null для default locale. CodePoint не принимает locale: позиции кодовых точек не зависят от языка. |
| Возврат | Объект IntlBreakIterator или специализированного потомка; языковые фабрики допускают null при неудаче. CodePoint возвращает IntlCodePointBreakIterator. |
| После создания | setText получает UTF-8. foreach выдаёт целые байтовые позиции, включая 0 и конец; пустой текст имеет граничную позицию 0. |
| Title | Семейство ICU Title историческое/deprecated на уровне ICU; PHP сохраняет фабрику для совместимости. Для новых задач предпочитайте явное преобразование регистра, а не самодельный алгоритм по найденным частям. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCodePointInstance();
$iterator->setText("Ae\u{0301}B");
echo implode(",", iterator_to_array($iterator)), "
";
Ожидаемый результат
0,1,2,4,5
Буква e и комбинируемое ударение — разные кодовые точки; это не два самостоятельных видимых символа.
<?php
declare(strict_types=1);
$text = "e\u{0301}";
$iterator = IntlBreakIterator::createCodePointInstance();
$iterator->setText($text);
while ($iterator->next() !== IntlBreakIterator::DONE) {
$point = $iterator->getLastCodePoint();
printf("U+%04X %s\n", $point, IntlChar::charName($point));
}
Ожидаемый результат
U+0065 LATIN SMALL LETTER E
U+0301 COMBINING ACUTE ACCENT
Видимое é здесь состоит из буквы e и отдельного акцента. Такой инспектор помогает объяснить различия в импорте и нормализации. Для обрезки текста нужен Character iterator или grapheme-функции: CodePoint iterator намеренно разделяет компоненты одной графемы.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCodePointInstance();
$iterator->setText("A");
echo $iterator->last(), "
";
$iterator->setText("я");
echo $iterator->last(), "
";
Ожидаемый результат
1
2
last возвращает длину исходного UTF-8 в байтах. Один видимый символ я занимает два байта.
Рядом по задаче: IntlBreakIterator::setText, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::createLineInstanceНайти возможные места переноса строки, независимо от ширины экрана.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlBreakIterator::createLineInstance(?string $locale = null): ?IntlBreakIterator| Аргумент или результат | Что означает на практике |
|---|---|
| locale | У языковых фабрик locale или null для default locale. CodePoint не принимает locale: позиции кодовых точек не зависят от языка. |
| Возврат | Объект IntlBreakIterator или специализированного потомка; языковые фабрики допускают null при неудаче. CodePoint возвращает IntlCodePointBreakIterator. |
| После создания | setText получает UTF-8. foreach выдаёт целые байтовые позиции, включая 0 и конец; пустой текст имеет граничную позицию 0. |
| Title | Семейство ICU Title историческое/deprecated на уровне ICU; PHP сохраняет фабрику для совместимости. Для новых задач предпочитайте явное преобразование регистра, а не самодельный алгоритм по найденным частям. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createLineInstance("en_US");
$iterator->setText("One two");
echo implode(",", iterator_to_array($iterator)), "
";
Ожидаемый результат
0,4,7
Алгоритм предлагает допустимые границы; реальную ширину в пикселях и выбор переноса решает средство вёрстки.
<?php
declare(strict_types=1);
$text = 'доставка сегодня';
$iterator = IntlBreakIterator::createLineInstance('ru_RU');
$iterator->setText($text);
$start = $iterator->first();
while (($end = $iterator->next()) !== IntlBreakIterator::DONE) {
echo '[', substr($text, $start, $end - $start), "]\n";
$start = $end;
}
Ожидаемый результат
[доставка ]
[сегодня]
Получились два допустимых фрагмента; пробел остался в первом. Это языковые кандидаты для переноса, а не готовая вёрстка. Какой кандидат реально помещается в строку, решают CSS и движок браузера с учётом шрифта, ширины контейнера и hyphens.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createLineInstance("en_US");
$iterator->setText("A");
echo $iterator->last(), "
";
$iterator->setText("я");
echo $iterator->last(), "
";
Ожидаемый результат
1
2
last возвращает длину исходного UTF-8 в байтах. Один видимый символ я занимает два байта.
Рядом по задаче: IntlBreakIterator::setText, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::createSentenceInstanceНайти границы предложений для аннотации или последовательного чтения.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlBreakIterator::createSentenceInstance(?string $locale = null): ?IntlBreakIterator| Аргумент или результат | Что означает на практике |
|---|---|
| locale | У языковых фабрик locale или null для default locale. CodePoint не принимает locale: позиции кодовых точек не зависят от языка. |
| Возврат | Объект IntlBreakIterator или специализированного потомка; языковые фабрики допускают null при неудаче. CodePoint возвращает IntlCodePointBreakIterator. |
| После создания | setText получает UTF-8. foreach выдаёт целые байтовые позиции, включая 0 и конец; пустой текст имеет граничную позицию 0. |
| Title | Семейство ICU Title историческое/deprecated на уровне ICU; PHP сохраняет фабрику для совместимости. Для новых задач предпочитайте явное преобразование регистра, а не самодельный алгоритм по найденным частям. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createSentenceInstance("en_US");
$iterator->setText("One. Two!");
echo implode(",", iterator_to_array($iterator)), "
";
Ожидаемый результат
0,5,9
Пробел после точки относится к первой части; сокращения и контекст требуют правил языка, а не explode по точке.
<?php
declare(strict_types=1);
$text = 'Заказ принят. Курьер выехал! Следите за статусом.';
$iterator = IntlBreakIterator::createSentenceInstance('ru_RU');
$iterator->setText($text);
$parts = $iterator->getPartsIterator();
$sentences = [];
foreach ($parts as $sentence) {
if (trim($sentence) !== '') {
$sentences[] = trim($sentence);
}
if (count($sentences) === 2) {
break;
}
}
echo implode(' ', $sentences), "\n";
Ожидаемый результат
Заказ принят. Курьер выехал!
Итератор учитывает правила предложений, поэтому код не разрезает текст простым explode по точке. trim убирает пробел, который правило может включить в предыдущий сегмент. Для юридического текста, сокращений и пользовательских аббревиатур результат всё равно проверяют на реальном корпусе нужного языка и версии ICU.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createSentenceInstance("en_US");
$iterator->setText("A");
echo $iterator->last(), "
";
$iterator->setText("я");
echo $iterator->last(), "
";
Ожидаемый результат
1
2
last возвращает длину исходного UTF-8 в байтах. Один видимый символ я занимает два байта.
Рядом по задаче: IntlBreakIterator::setText, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::createTitleInstanceНайти исторические границы для преобразования начальных букв слов.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlBreakIterator::createTitleInstance(?string $locale = null): ?IntlBreakIterator| Аргумент или результат | Что означает на практике |
|---|---|
| locale | У языковых фабрик locale или null для default locale. CodePoint не принимает locale: позиции кодовых точек не зависят от языка. |
| Возврат | Объект IntlBreakIterator или специализированного потомка; языковые фабрики допускают null при неудаче. CodePoint возвращает IntlCodePointBreakIterator. |
| После создания | setText получает UTF-8. foreach выдаёт целые байтовые позиции, включая 0 и конец; пустой текст имеет граничную позицию 0. |
| Title | Семейство ICU Title историческое/deprecated на уровне ICU; PHP сохраняет фабрику для совместимости. Для новых задач предпочитайте явное преобразование регистра, а не самодельный алгоритм по найденным частям. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createTitleInstance("en_US");
$iterator->setText("one two");
echo implode(",", iterator_to_array($iterator)), "
";
Ожидаемый результат
0,4,7
Итератор только находит границы и сам не меняет регистр. Для нового преобразования регистра выбирайте предназначенный API, например mb_convert_case.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createTitleInstance("en_US");
$iterator->setText("A");
echo $iterator->last(), "
";
$iterator->setText("я");
echo $iterator->last(), "
";
Ожидаемый результат
1
2
last возвращает длину исходного UTF-8 в байтах. Один видимый символ я занимает два байта.
Рядом по задаче: IntlBreakIterator::setText, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::createWordInstanceНайти границы слов, чисел, пробелов и пунктуации.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
static IntlBreakIterator::createWordInstance(?string $locale = null): ?IntlBreakIterator| Аргумент или результат | Что означает на практике |
|---|---|
| locale | У языковых фабрик locale или null для default locale. CodePoint не принимает locale: позиции кодовых точек не зависят от языка. |
| Возврат | Объект IntlBreakIterator или специализированного потомка; языковые фабрики допускают null при неудаче. CodePoint возвращает IntlCodePointBreakIterator. |
| После создания | setText получает UTF-8. foreach выдаёт целые байтовые позиции, включая 0 и конец; пустой текст имеет граничную позицию 0. |
| Title | Семейство ICU Title историческое/deprecated на уровне ICU; PHP сохраняет фабрику для совместимости. Для новых задач предпочитайте явное преобразование регистра, а не самодельный алгоритм по найденным частям. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
echo implode(",", iterator_to_array($iterator)), "
";
Ожидаемый результат
0,2,3,5
Здесь три фрагмента: Hi, пробел, 42. Количество границ минус один не равно количеству слов.
<?php
declare(strict_types=1);
$text = 'Кофе арабика — 2 пачки';
$iterator = IntlBreakIterator::createWordInstance('ru_RU');
$iterator->setText($text);
$parts = $iterator->getPartsIterator();
$terms = [];
foreach ($parts as $part) {
$status = $parts->getRuleStatus();
if ($status >= IntlBreakIterator::WORD_LETTER
&& $status < IntlBreakIterator::WORD_LETTER_LIMIT) {
$terms[] = mb_strtolower($part, 'UTF-8');
}
}
echo implode('|', $terms), "\n";
Ожидаемый результат
кофе|арабика|пачки
В результат попали три буквенных сегмента. Пробел, тире и число получили другие статусы. Это заготовка для небольшого учебного индекса, а не полноценный морфологический поиск: формы «пачка» и «пачки» остаются разными. Пример дополнительно использует mbstring для смены регистра.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("A");
echo $iterator->last(), "
";
$iterator->setText("я");
echo $iterator->last(), "
";
Ожидаемый результат
1
2
last возвращает длину исходного UTF-8 в байтах. Один видимый символ я занимает два байта.
Рядом по задаче: IntlBreakIterator::setText, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::__constructПонять, почему базовый анализатор создаётся фабрикой, а не new IntlBreakIterator.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::__construct()| Аргумент или результат | Что означает на практике |
|---|---|
| Доступность | private, без параметров. Прямое создание извне класса запрещено. |
| Замена | createCharacterInstance/createWordInstance и другие фабрики выбирают правила анализа. IntlRuleBasedBreakIterator имеет собственный публичный конструктор для правил. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->first(), "
";
Ожидаемый результат
0
Фабрика сразу готовит конкретную реализацию правил.
<?php
declare(strict_types=1);
try { $iterator = new IntlBreakIterator(); } catch (Error $error) { echo "use factory
"; }
Ожидаемый результат
use factory
Error здесь связан с доступностью конструктора, а не с содержимым текста.
Рядом по задаче: IntlBreakIterator::createCharacterInstance.
IntlBreakIterator::currentПрочитать текущую байтовую позицию, не передвигая анализатор.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::current(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | following/preceding принимают абсолютный offset в байтах UTF-8. next принимает nullable число шагов: null — следующий, 0 — текущий, отрицательное — назад. first/last/current/previous не принимают аргументов. |
| Возврат | int: найденная граница или IntlBreakIterator::DONE для отсутствующего шага. first возвращает 0, last — байтовый конец. Перемещающие методы изменяют состояние объекта. |
| Ограничение | В PHP offset должен помещаться в 32-битный диапазон ICU. Не передавайте огромные значения из пользовательского запроса; проверяйте диапазон текста. Не смешивайте ручное перемещение с активным foreach по тому же объекту. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->current(), "
";
Ожидаемый результат
0
Прочитать текущую байтовую позицию, не передвигая анализатор.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$iterator->next();
echo $iterator->current(), "
";
Ожидаемый результат
1
Ни current, ни возвращённое число не являются текстом символа.
Рядом по задаче: IntlBreakIterator::isBoundary, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::firstВернуться на начальную границу перед первым символом.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::first(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | following/preceding принимают абсолютный offset в байтах UTF-8. next принимает nullable число шагов: null — следующий, 0 — текущий, отрицательное — назад. first/last/current/previous не принимают аргументов. |
| Возврат | int: найденная граница или IntlBreakIterator::DONE для отсутствующего шага. first возвращает 0, last — байтовый конец. Перемещающие методы изменяют состояние объекта. |
| Ограничение | В PHP offset должен помещаться в 32-битный диапазон ICU. Не передавайте огромные значения из пользовательского запроса; проверяйте диапазон текста. Не смешивайте ручное перемещение с активным foreach по тому же объекту. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$iterator->last();
echo $iterator->first(), "
";
Ожидаемый результат
0
Вернуться на начальную границу перед первым символом.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$iterator->first();
$end = $iterator->next();
echo substr($iterator->getText(), 0, $end), "
";
Ожидаемый результат
A
Для первого фрагмента используем две границы и substr с байтовой длиной.
Рядом по задаче: IntlBreakIterator::isBoundary, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::lastПерейти к границе после последнего символа.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::last(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | following/preceding принимают абсолютный offset в байтах UTF-8. next принимает nullable число шагов: null — следующий, 0 — текущий, отрицательное — назад. first/last/current/previous не принимают аргументов. |
| Возврат | int: найденная граница или IntlBreakIterator::DONE для отсутствующего шага. first возвращает 0, last — байтовый конец. Перемещающие методы изменяют состояние объекта. |
| Ограничение | В PHP offset должен помещаться в 32-битный диапазон ICU. Не передавайте огромные значения из пользовательского запроса; проверяйте диапазон текста. Не смешивайте ручное перемещение с активным foreach по тому же объекту. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->last(), "
";
Ожидаемый результат
4
Перейти к границе после последнего символа.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$end = $iterator->last();
$start = $iterator->previous();
echo substr($iterator->getText(), $start, $end - $start), "
";
Ожидаемый результат
B
Конец строки — допустимая граница, хотя символа на этой позиции уже нет.
Рядом по задаче: IntlBreakIterator::isBoundary, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::nextПродвинуться на следующую границу или на заданное число границ.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::next(?int $offset = null): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | following/preceding принимают абсолютный offset в байтах UTF-8. next принимает nullable число шагов: null — следующий, 0 — текущий, отрицательное — назад. first/last/current/previous не принимают аргументов. |
| Возврат | int: найденная граница или IntlBreakIterator::DONE для отсутствующего шага. first возвращает 0, last — байтовый конец. Перемещающие методы изменяют состояние объекта. |
| Ограничение | В PHP offset должен помещаться в 32-битный диапазон ICU. Не передавайте огромные значения из пользовательского запроса; проверяйте диапазон текста. Не смешивайте ручное перемещение с активным foreach по тому же объекту. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->next(), "
";
Ожидаемый результат
1
Продвинуться на следующую границу или на заданное число границ.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->next(2), "
";
echo $iterator->next(-1), "
";
Ожидаемый результат
3
1
offset у next — число шагов, а не абсолютный номер байта; отрицательное значение движется назад.
Рядом по задаче: IntlBreakIterator::isBoundary, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::previousПерейти к предыдущей границе.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::previous(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | following/preceding принимают абсолютный offset в байтах UTF-8. next принимает nullable число шагов: null — следующий, 0 — текущий, отрицательное — назад. first/last/current/previous не принимают аргументов. |
| Возврат | int: найденная граница или IntlBreakIterator::DONE для отсутствующего шага. first возвращает 0, last — байтовый конец. Перемещающие методы изменяют состояние объекта. |
| Ограничение | В PHP offset должен помещаться в 32-битный диапазон ICU. Не передавайте огромные значения из пользовательского запроса; проверяйте диапазон текста. Не смешивайте ручное перемещение с активным foreach по тому же объекту. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$iterator->last();
echo $iterator->previous(), "
";
Ожидаемый результат
3
Перейти к предыдущей границе.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->previous() === IntlBreakIterator::DONE ? "no previous
" : "found
";
Ожидаемый результат
no previous
DONE равен -1; не проверяйте результат просто как boolean, ведь 0 — нормальная граница.
Рядом по задаче: IntlBreakIterator::isBoundary, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::followingНайти первую границу строго после указанной байтовой позиции.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::following(int $offset): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | following/preceding принимают абсолютный offset в байтах UTF-8. next принимает nullable число шагов: null — следующий, 0 — текущий, отрицательное — назад. first/last/current/previous не принимают аргументов. |
| Возврат | int: найденная граница или IntlBreakIterator::DONE для отсутствующего шага. first возвращает 0, last — байтовый конец. Перемещающие методы изменяют состояние объекта. |
| Ограничение | В PHP offset должен помещаться в 32-битный диапазон ICU. Не передавайте огромные значения из пользовательского запроса; проверяйте диапазон текста. Не смешивайте ручное перемещение с активным foreach по тому же объекту. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->following(1), "
";
Ожидаемый результат
3
Найти первую границу строго после указанной байтовой позиции.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->following(4) === IntlBreakIterator::DONE ? "end
" : "found
";
Ожидаемый результат
end
Даже если offset уже является границей, following ищет следующую, а не возвращает сам offset.
Рядом по задаче: IntlBreakIterator::isBoundary, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::precedingНайти первую границу строго перед указанной байтовой позицией.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::preceding(int $offset): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | following/preceding принимают абсолютный offset в байтах UTF-8. next принимает nullable число шагов: null — следующий, 0 — текущий, отрицательное — назад. first/last/current/previous не принимают аргументов. |
| Возврат | int: найденная граница или IntlBreakIterator::DONE для отсутствующего шага. first возвращает 0, last — байтовый конец. Перемещающие методы изменяют состояние объекта. |
| Ограничение | В PHP offset должен помещаться в 32-битный диапазон ICU. Не передавайте огромные значения из пользовательского запроса; проверяйте диапазон текста. Не смешивайте ручное перемещение с активным foreach по тому же объекту. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->preceding(3), "
";
Ожидаемый результат
1
Найти первую границу строго перед указанной байтовой позицией.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->preceding(0) === IntlBreakIterator::DONE ? "start
" : "found
";
Ожидаемый результат
start
Это абсолютная байтовая позиция, в отличие от числа шагов у next.
Рядом по задаче: IntlBreakIterator::isBoundary, IntlBreakIterator::getPartsIterator.
IntlBreakIterator::isBoundaryПроверить, можно ли разрезать текст на заданной позиции по выбранным правилам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::isBoundary(int $offset): bool| Аргумент или результат | Что означает на практике |
|---|---|
| offset | Байтовая позиция от начала UTF-8, не номер буквы. Для самостоятельной проверки сначала ограничьте её диапазоном 0…strlen(text). |
| Возврат | bool. Проверка изменяет текущую позицию анализатора: при отсутствии границы перемещается к следующей. Она не является чистой проверкой без изменения состояния. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
var_dump($iterator->isBoundary(1), $iterator->isBoundary(2), $iterator->isBoundary(3));
Ожидаемый результат
bool(true)
bool(false)
bool(true)
Байт 2 находится внутри буквы я.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$iterator->isBoundary(2);
echo $iterator->current(), "
";
Ожидаемый результат
3
Для независимых проверок и обходов храните разные экземпляры.
<?php
declare(strict_types=1);
$text = 'AяB';
$requestedByte = 2;
$iterator = IntlBreakIterator::createCharacterInstance('ru_RU');
$iterator->setText($text);
if (!$iterator->isBoundary($requestedByte)) {
$requestedByte = $iterator->current();
}
echo 'Безопасная позиция: ', $requestedByte, "\n";
echo substr($text, 0, $requestedByte), "|",
substr($text, $requestedByte), "\n";
Ожидаемый результат
Безопасная позиция: 3
Aя|B
Байт 2 находится внутри двухбайтовой буквы я. isBoundary вернул false и как побочный эффект поставил курсор на следующую допустимую границу 3. Политика редактора могла бы выбрать предыдущую границу через preceding; здесь выбор следующей сделан явно. Перед такой операцией ещё ограничивают вход диапазоном 0…strlen.
Рядом по задаче: IntlBreakIterator::following, IntlBreakIterator::current.
IntlBreakIterator::setTextПередать текст, который нужно разделить, и начать его анализ.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::setText(string $text): bool| Аргумент или результат | Что означает на практике |
|---|---|
| text | Строка UTF-8. Это содержимое, а не путь к файлу. Переданный текст хранится объектом; повторный setText заменяет его и начинает анализ заново. |
| Возврат | bool: true при успехе, false при ошибке с PHP 8.3; в прежних версиях при ошибке мог возвращаться null. |
| Практика | Не используйте setText как проверку корректности кодировки. При импорте проверяйте договор UTF-8 отдельно, а кодировку внешнего источника преобразовывайте явно. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->getText(), "
";
Ожидаемый результат
AяB
Анализатор не изменяет исходные буквы.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$iterator->last();
var_dump($iterator->setText("Hi"));
echo $iterator->current(), "
";
Ожидаемый результат
bool(true)
0
Старая позиция больше не относится к новому тексту.
Рядом по задаче: IntlBreakIterator::getText, UConverter::transcode.
IntlBreakIterator::getTextПолучить исходный текст для вырезания найденного фрагмента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::getText(): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | ?string: исходный UTF-8 либо null, если текст ещё не задан. Пустая строка после setText("") отличается от отсутствующего текста. |
| Особенность | Результат не равен current: current возвращает число-позицию, getText — всю строку. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
var_dump($iterator->getText());
$iterator->setText("");
var_dump($iterator->getText());
Ожидаемый результат
NULL
string(0) ""
Строгое сравнение позволяет отличить оба состояния.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$start = $iterator->following(0);
$end = $iterator->following($start);
echo substr($iterator->getText(), $start, $end - $start), "
";
Ожидаемый результат
я
substr здесь уместен: обе границы уже получены в байтах.
Рядом по задаче: IntlBreakIterator::following.
IntlBreakIterator::getPartsIteratorПолучать готовые фрагменты вместо ручного вычитания соседних границ.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::getPartsIterator(int $type = IntlPartsIterator::KEY_SEQUENTIAL): IntlPartsIterator| Аргумент или результат | Что означает на практике |
|---|---|
| type | Целая константа KEY_SEQUENTIAL, KEY_LEFT или KEY_RIGHT: обычный номер, левая либо правая байтовая граница. Неверная константа вызывает ValueError. |
| Возврат | IntlPartsIterator. Он связан с тем же анализатором и его позицией: не перемещайте анализатор вручную посреди обхода частей. |
| Метаданные PHP 8.5.11 | Reflection/stub ошибочно показывает string $type. Реализация PHP использует Z_PARAM_LONG и принимает int; здесь приведён реальный контракт. Не преобразовывайте константы в строки ради ошибочного отражения. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
foreach ($parts as $key => $part) { echo $key, "=[", $part, "]
"; }
Ожидаемый результат
0=[Hi]
1=[ ]
2=[42]
Пробел — отдельный сегмент, который иногда нужно сохранить, например для подсветки исходного текста.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
foreach ($iterator->getPartsIterator(IntlPartsIterator::KEY_LEFT) as $offset => $part) { echo $offset, "=", $part, "
"; }
Ожидаемый результат
0=A
1=я
3=B
Левая граница фрагмента готова для сопоставления с исходным UTF-8.
<?php
declare(strict_types=1);
$text = 'Кофе, чай и какао';
$wanted = ['чай' => true, 'какао' => true];
$iterator = IntlBreakIterator::createWordInstance('ru_RU');
$iterator->setText($text);
$parts = $iterator->getPartsIterator();
foreach ($parts as $part) {
$safe = htmlspecialchars($part, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
$status = $parts->getRuleStatus();
$isWord = $status >= IntlBreakIterator::WORD_LETTER
&& $status < IntlBreakIterator::WORD_LETTER_LIMIT;
echo $isWord && isset($wanted[mb_strtolower($part, 'UTF-8')])
? '<mark>'.$safe.'</mark>'
: $safe;
}
Ожидаемый результат
Кофе, <mark>чай</mark> и <mark>какао</mark>В браузере останутся запятая и пробелы, а совпавшие словесные сегменты получат mark. Каждая часть экранируется до вставки в HTML. Это точное совпадение слов в небольшом списке; склонения, синонимы и ранжирование требуют поискового движка. mbstring используется только для регистра.
Рядом по задаче: IntlPartsIterator::getRuleStatus, IntlPartsIterator::getBreakIterator.
IntlBreakIterator::getIteratorЯвно получить Iterator, который foreach обычно запрашивает сам.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::getIterator(): Iterator| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | Iterator с целыми байтовыми позициями границ. Это механизм IteratorAggregate, а не массив всех слов. |
| Состояние | Обход использует состояние анализатора; несколько обёрток не дают независимых курсоров. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
foreach ($iterator->getIterator() as $index => $offset) { echo $index, "=", $offset, "
"; }
Ожидаемый результат
0=0
1=1
2=3
3=4
Ключ — номер границы, значение — байтовая позиция.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
$boundaries = iterator_to_array($iterator->getIterator(), false);
echo count($boundaries), "
";
Ожидаемый результат
4
Материализация удобна для небольшой строки; на больших текстах обход экономит память.
IntlBreakIterator::getLocaleУзнать, какие локальные правила фактически выбрал ICU.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::getLocale(int $type): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| type | Locale::VALID_LOCALE или Locale::ACTUAL_LOCALE: поддержанная/реально использованная локаль. |
| Возврат | string|false. Для многих языков правила общие и ICU может вернуть пустую строку/root. Это не признак отсутствующего текста или ошибка языка пользователя. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
var_dump(is_string($iterator->getLocale(Locale::ACTUAL_LOCALE)));
Ожидаемый результат
bool(true)
Точное имя fallback зависит от данных ICU, поэтому не закладывайте его в бизнес-правило.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
var_dump(is_string($iterator->getLocale(Locale::VALID_LOCALE)), is_string($iterator->getLocale(Locale::ACTUAL_LOCALE)));
Ожидаемый результат
bool(true)
bool(true)
VALID и ACTUAL не обязаны совпадать с текстом аргумента фабрики.
Рядом по задаче: Locale::getDefault.
IntlBreakIterator::getErrorCodeПрочитать код последней ошибки данного анализатора.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::getErrorCode(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | int UErrorCode |
| Граница диагностики | Статус объекта относится к этому объекту. intl_get_error_code/message читают глобальное состояние и не являются процедурными алиасами метода с тем же объектом; следующая операция может изменить статус. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->getErrorCode(), "
";
Ожидаемый результат
0
Нулевой код означает успех; текст пригоден для диагностики, не для ветвления по подстроке.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
var_dump(intl_is_failure($iterator->getErrorCode()));
Ожидаемый результат
bool(false)
Проверка failure учитывает различие предупреждения ICU и настоящей ошибки.
Рядом по задаче: intl_get_error_code, intl_is_failure.
IntlBreakIterator::getErrorMessageПрочитать сообщение последней ошибки данного анализатора.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlBreakIterator::getErrorMessage(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | string с описанием ошибки, для успеха U_ZERO_ERROR. |
| Граница диагностики | Статус объекта относится к этому объекту. intl_get_error_code/message читают глобальное состояние и не являются процедурными алиасами метода с тем же объектом; следующая операция может изменить статус. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
echo $iterator->getErrorMessage(), "
";
Ожидаемый результат
U_ZERO_ERROR
Нулевой код означает успех; текст пригоден для диагностики, не для ветвления по подстроке.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCharacterInstance("en_US");
$iterator->setText("AяB");
var_dump(intl_is_failure($iterator->getErrorCode()));
Ожидаемый результат
bool(false)
Проверка failure учитывает различие предупреждения ICU и настоящей ошибки.
Рядом по задаче: intl_get_error_code, intl_is_failure.
IntlRuleBasedBreakIterator::__constructСделать собственные границы для простого служебного формата, когда стандартных слов недостаточно.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlRuleBasedBreakIterator::__construct(string $rules, bool $compiled = false)| Аргумент или результат | Что означает на практике |
|---|---|
| rules | Текст правил ICU RBBI в UTF-8 либо бинарные правила. [a-z]+ {100}; объединяет латинские буквы и ставит статус 100; [0-9]+ {200}; — цифры; .; пропускает остальные точки по одному. |
| compiled | false для текстовых правил; true для результата getBinaryRules совместимого ICU. Это не PHP, не PCRE и не сериализованный объект. |
| Ошибки | Неверные правила или их UTF-8 вызывают IntlException. Прикладные правила лучше хранить в коде проекта, а не принимать от случайного посетителя. |
| Практика | Подходит контролируемой разметке. Для JSON/XML/языков программирования используйте соответствующий парсер: несколько правил границ не заменяют грамматику. |
<?php
declare(strict_types=1);
$iterator = new IntlRuleBasedBreakIterator("[a-z]+ {100}; [0-9]+ {200}; .;");
$iterator->setText("ab 42");
foreach ($iterator->getPartsIterator() as $part) { echo "[", $part, "]
"; }
Ожидаемый результат
[ab]
[ ]
[42]
Каждая группа становится одним сегментом; пробел сохраняется.
<?php
declare(strict_types=1);
$rules = '[A-Z]+ {100}; [0-9]+ {200}; [- ]+ {0}; . {900};';
$iterator = new IntlRuleBasedBreakIterator($rules);
$iterator->setText('BOX-42');
$parts = $iterator->getPartsIterator();
foreach ($parts as $part) {
$status = $parts->getRuleStatus();
if ($status === 100) {
echo 'Код: ', $part, "\n";
} elseif ($status === 200) {
echo 'Количество: ', $part, "\n";
}
}
Ожидаемый результат
Код: BOX
Количество: 42
Метки 100 и 200 — договор именно этих правил. Дефис получил статус 0 и не попал в результат. Для короткого контролируемого формата это делает разбор объяснимым; для CSV, JSON, SQL или языка программирования нужен их настоящий парсер. Значения после выделения всё равно валидируют по бизнес-правилам, например количество должно входить в разрешённый диапазон.
<?php
declare(strict_types=1);
try { new IntlRuleBasedBreakIterator("["); } catch (IntlException $error) { echo "invalid rules
"; }
Ожидаемый результат
invalid rules
Конфигурацию валидируют при подготовке приложения, не после начала выдачи документа.
Рядом по задаче: IntlRuleBasedBreakIterator::getRuleStatus, IntlRuleBasedBreakIterator::getBinaryRules.
IntlRuleBasedBreakIterator::getRulesПрочитать текст правил, используемый анализатором.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlRuleBasedBreakIterator::getRules(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | string|false. Правила могут быть нормализованы ICU; не рассчитывайте на побайтовое совпадение с исходным оформлением. |
| Применение | Диагностика конфигурации и текстовое хранение правил. Для сравнения поведения проверьте сегменты, а не пробелы в возвращённой грамматике. |
<?php
declare(strict_types=1);
$iterator = new IntlRuleBasedBreakIterator("[a-z]+ {100}; [0-9]+ {200}; .;");
$iterator->setText("ab 42");
var_dump(is_string($iterator->getRules()), strlen($iterator->getRules()) > 0);
Ожидаемый результат
bool(true)
bool(true)
Возвращаются правила, а не обрабатываемый текст.
<?php
declare(strict_types=1);
$iterator = new IntlRuleBasedBreakIterator("[a-z]+ {100}; [0-9]+ {200}; .;");
$iterator->setText("ab 42");
$other = new IntlRuleBasedBreakIterator($iterator->getRules());
$other->setText("xy 7");
echo implode("|", iterator_to_array($other->getPartsIterator())), "
";
Ожидаемый результат
xy| |7
Второй объект имеет собственный текст и курсор.
Рядом по задаче: IntlRuleBasedBreakIterator::__construct.
IntlRuleBasedBreakIterator::getBinaryRulesПолучить скомпилированные правила, чтобы не разбирать текст грамматики повторно в совместимой среде.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlRuleBasedBreakIterator::getBinaryRules(): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | string|false: бинарные байты, не UTF-8 для отображения. Храните как бинарный файл/blob. |
| Совместимость | Бинарная форма зависит от ICU и формата/платформы. При обновлении окружения пересобирайте её из текстового источника; не обещайте переносимость произвольного blob между серверами. |
<?php
declare(strict_types=1);
$iterator = new IntlRuleBasedBreakIterator("[a-z]+ {100}; [0-9]+ {200}; .;");
$iterator->setText("ab 42");
$binary = $iterator->getBinaryRules();
var_dump(is_string($binary), strlen($binary) > 0);
Ожидаемый результат
bool(true)
bool(true)
Бинарные данные не выводим посетителю и не вставляем как HTML.
<?php
declare(strict_types=1);
$iterator = new IntlRuleBasedBreakIterator("[a-z]+ {100}; [0-9]+ {200}; .;");
$iterator->setText("ab 42");
$other = new IntlRuleBasedBreakIterator($iterator->getBinaryRules(), true);
$other->setText("ab 42");
echo implode("|", iterator_to_array($other->getPartsIterator())), "
";
Ожидаемый результат
ab| |42
Флаг true переключает конструктор с текстовых правил на готовую бинарную форму.
Рядом по задаче: IntlRuleBasedBreakIterator::getRules.
IntlRuleBasedBreakIterator::getRuleStatusУзнать, какое правило завершило текущий сегмент.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlRuleBasedBreakIterator::getRuleStatus(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет; сначала нужно перейти к концу сегмента, например next. |
| Возврат | getRuleStatus: наибольшая метка завершившихся правил; getRuleStatusVec: массив всех меток либо false. Это классификация сегмента, не код ошибки ICU. |
| Встроенные правила | WORD_NONE…WORD_IDEO и соответствующие LIMIT описывают полуоткрытые диапазоны. В собственных правилах значения задаёте вы; метка 100 не обязана означать число. |
<?php
declare(strict_types=1);
$iterator = new IntlRuleBasedBreakIterator("[a-z]+ {100}; [0-9]+ {200}; .;");
$iterator->setText("ab 42");
$iterator->next();
echo $iterator->getRuleStatus(), "
";
Ожидаемый результат
100
Наша метка 100 означает группу [a-z], независимо от значений стандартных констант WORD_NUMBER.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$words = 0;
foreach ($parts as $part) {
$status = $parts->getRuleStatus();
if ($status >= IntlBreakIterator::WORD_LETTER && $status < IntlBreakIterator::WORD_LETTER_LIMIT) { $words++; }
}
echo $words, "
";
Ожидаемый результат
1
В Hi 42 только Hi попадает в буквенный диапазон; пробел и число обрабатываются отдельно.
Рядом по задаче: IntlPartsIterator::getRuleStatus.
IntlRuleBasedBreakIterator::getRuleStatusVecУзнать, какое правило завершило текущий сегмент.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlRuleBasedBreakIterator::getRuleStatusVec(): array|false| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет; сначала нужно перейти к концу сегмента, например next. |
| Возврат | getRuleStatus: наибольшая метка завершившихся правил; getRuleStatusVec: массив всех меток либо false. Это классификация сегмента, не код ошибки ICU. |
| Встроенные правила | WORD_NONE…WORD_IDEO и соответствующие LIMIT описывают полуоткрытые диапазоны. В собственных правилах значения задаёте вы; метка 100 не обязана означать число. |
<?php
declare(strict_types=1);
$iterator = new IntlRuleBasedBreakIterator("[a-z]+ {100}; [0-9]+ {200}; .;");
$iterator->setText("ab 42");
$iterator->next();
echo implode(",", $iterator->getRuleStatusVec()), "
";
Ожидаемый результат
100
Наша метка 100 означает группу [a-z], независимо от значений стандартных констант WORD_NUMBER.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$words = 0;
foreach ($parts as $part) {
$status = $parts->getRuleStatus();
if ($status >= IntlBreakIterator::WORD_LETTER && $status < IntlBreakIterator::WORD_LETTER_LIMIT) { $words++; }
}
echo $words, "
";
Ожидаемый результат
1
В Hi 42 только Hi попадает в буквенный диапазон; пробел и число обрабатываются отдельно.
Рядом по задаче: IntlPartsIterator::getRuleStatus.
IntlCodePointBreakIterator::getLastCodePointУзнать кодовую точку, через которую только что прошёл курсор.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlCodePointBreakIterator::getLastCodePoint(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. Сначала next/previous; current сам не проходит символ. |
| Возврат | int Unicode code point; при отсутствии доступной точки используется служебное отрицательное значение. Это не символ-строка и не позиция UTF-8. |
| Ограничение | Кодовая точка не равна графеме: буква и комбинируемый знак могут приходить по отдельности. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCodePointInstance();
$iterator->setText("Aя");
$iterator->next();
echo $iterator->getLastCodePoint(), "
";
Ожидаемый результат
65
65 — Unicode U+0041; граница после него равна 1, это другое число.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createCodePointInstance();
$iterator->setText("Aя");
$iterator->next(2);
echo $iterator->getLastCodePoint(), "
";
Ожидаемый результат
-1
Особенность PHP 8.5.11: next(n) записывает кодовую точку на новой позиции, в отличие от одиночного next(). На конце получается -1. Для последней пройденной точки делайте одиночные шаги; это видно и в tagged реализации CodePointBreakIterator.
Рядом по задаче: IntlChar::chr, IntlBreakIterator::createCharacterInstance.
IntlIterator::currentПрочитать текущий элемент, не двигаясь дальше.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlIterator::current(): mixed| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. Для ручного обхода сначала rewind, затем valid/current/key и next. |
| Возврат | current/key: mixed, зависит от конкретного поставщика значений; next/rewind: void; valid: bool. |
| Состояние | foreach и эти методы используют один курсор. Не вызывайте next дополнительно внутри foreach без намерения пропустить элемент. |
| Граница | Проверяйте valid перед чтением; пустое строковое значение или ключ 0 не означают завершение обхода. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
echo "[", $parts->current(), "]
";
Ожидаемый результат
[Hi]
Прочитать текущий элемент, не двигаясь дальше.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
$parts->next();
echo "[", $parts->current(), "]
";
Ожидаемый результат
[ ]
Здесь IntlPartsIterator наследует общий интерфейс IntlIterator; другие фабрики Intl могут возвращать иные типы значений.
Рядом по задаче: IntlBreakIterator::getPartsIterator, IntlIterator::valid.
IntlIterator::keyПрочитать ключ текущего элемента.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlIterator::key(): mixed| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. Для ручного обхода сначала rewind, затем valid/current/key и next. |
| Возврат | current/key: mixed, зависит от конкретного поставщика значений; next/rewind: void; valid: bool. |
| Состояние | foreach и эти методы используют один курсор. Не вызывайте next дополнительно внутри foreach без намерения пропустить элемент. |
| Граница | Проверяйте valid перед чтением; пустое строковое значение или ключ 0 не означают завершение обхода. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
echo $parts->key(), "
";
Ожидаемый результат
0
Прочитать ключ текущего элемента.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
$parts->next();
echo $parts->key(), "
";
Ожидаемый результат
1
Здесь IntlPartsIterator наследует общий интерфейс IntlIterator; другие фабрики Intl могут возвращать иные типы значений.
Рядом по задаче: IntlBreakIterator::getPartsIterator, IntlIterator::valid.
IntlIterator::nextПереместить курсор на следующий элемент.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlIterator::next(): void| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. Для ручного обхода сначала rewind, затем valid/current/key и next. |
| Возврат | current/key: mixed, зависит от конкретного поставщика значений; next/rewind: void; valid: bool. |
| Состояние | foreach и эти методы используют один курсор. Не вызывайте next дополнительно внутри foreach без намерения пропустить элемент. |
| Граница | Проверяйте valid перед чтением; пустое строковое значение или ключ 0 не означают завершение обхода. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
$parts->next();
echo "[", $parts->current(), "]
";
Ожидаемый результат
[ ]
Переместить курсор на следующий элемент.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
$parts->next();
$parts->next();
echo $parts->current(), "
";
Ожидаемый результат
42
Здесь IntlPartsIterator наследует общий интерфейс IntlIterator; другие фабрики Intl могут возвращать иные типы значений.
<?php
declare(strict_types=1);
$iterator = IntlTimeZone::createEnumeration('RU');
$shown = 0;
foreach ($iterator as $zoneId) {
echo $zoneId, "\n";
if (++$shown === 3) {
break;
}
}
Ожидаемый результат
Asia/Anadyr
Asia/Barnaul
Asia/Chita
IntlIterator используется не только для частей текста. Здесь список зон читается лениво и обход прекращается после трёх элементов. Конкретный полный набор и порядок принадлежат версии ICU; для интерфейса обычно сортируют локализованные подписи отдельно и сохраняют стабильный ID зоны. Этот пример проверен на ICU 77.1.
Рядом по задаче: IntlBreakIterator::getPartsIterator, IntlIterator::valid.
IntlIterator::rewindНачать обход заново.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlIterator::rewind(): void| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. Для ручного обхода сначала rewind, затем valid/current/key и next. |
| Возврат | current/key: mixed, зависит от конкретного поставщика значений; next/rewind: void; valid: bool. |
| Состояние | foreach и эти методы используют один курсор. Не вызывайте next дополнительно внутри foreach без намерения пропустить элемент. |
| Граница | Проверяйте valid перед чтением; пустое строковое значение или ключ 0 не означают завершение обхода. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
$parts->next();
$parts->rewind();
echo $parts->current(), "
";
Ожидаемый результат
Hi
Начать обход заново.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$result = iterator_to_array($parts);
$parts->rewind();
echo $parts->key(), "
";
Ожидаемый результат
3
После ручного rewind элемент снова первый, но в PHP 8.5.11 последовательный ключ этого parts iterator после iterator_to_array остаётся 3. foreach сбрасывает индекс механизмом движка; если нужен гарантированно новый ручной счётчик, создайте новый parts iterator или считайте сами.
Рядом по задаче: IntlBreakIterator::getPartsIterator, IntlIterator::valid.
IntlIterator::validПроверить, существует ли текущий элемент.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlIterator::valid(): bool| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. Для ручного обхода сначала rewind, затем valid/current/key и next. |
| Возврат | current/key: mixed, зависит от конкретного поставщика значений; next/rewind: void; valid: bool. |
| Состояние | foreach и эти методы используют один курсор. Не вызывайте next дополнительно внутри foreach без намерения пропустить элемент. |
| Граница | Проверяйте valid перед чтением; пустое строковое значение или ключ 0 не означают завершение обхода. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
var_dump($parts->valid());
Ожидаемый результат
bool(true)
Проверить, существует ли текущий элемент.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
$parts->rewind();
while ($parts->valid()) { $parts->next(); }
var_dump($parts->valid());
Ожидаемый результат
bool(false)
Здесь IntlPartsIterator наследует общий интерфейс IntlIterator; другие фабрики Intl могут возвращать иные типы значений.
Рядом по задаче: IntlBreakIterator::getPartsIterator, IntlIterator::valid.
IntlPartsIterator::getBreakIteratorПолучить анализатор, из которого построен обход частей.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlPartsIterator::getBreakIterator(): IntlBreakIterator| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | IntlBreakIterator: связанный анализатор, не его независимая копия. |
| Применение | Прочитать правила/текст/диагностику или использовать специфичный метод потомка. Перемещение этого объекта посреди обхода меняет состояние частей. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
var_dump($parts->getBreakIterator() === $iterator);
Ожидаемый результат
bool(true)
Две ссылки указывают на один анализатор.
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
echo $parts->getBreakIterator()->getText(), "
";
Ожидаемый результат
Hi 42
Метод полезен адаптеру, которому передали только parts iterator.
Рядом по задаче: IntlBreakIterator::getText.
IntlPartsIterator::getRuleStatusПрочитать статус именно текущего фрагмента при foreach по частям.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
IntlPartsIterator::getRuleStatus(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | int: метка правила сегмента. Для встроенного word iterator используйте диапазоны WORD_*. |
| Условие | Требуется анализатор на основе правил. CodePoint iterator не имеет таких правил; нельзя предполагать наличие статуса слов у любого анализатора. |
<?php
declare(strict_types=1);
$iterator = IntlBreakIterator::createWordInstance("en_US");
$iterator->setText("Hi 42");
$parts = $iterator->getPartsIterator();
foreach ($parts as $part) { echo "[", $part, "]=", $parts->getRuleStatus(), "
"; }
Ожидаемый результат
[Hi]=200
[ ]=0
[42]=100
Здесь 200 — буквы, 0 — не слово, 100 — число.
<?php
declare(strict_types=1);
$iterator = new IntlRuleBasedBreakIterator("[a-z]+ {100}; [0-9]+ {200}; .;");
$iterator->setText("ab 42");
$parts = $iterator->getPartsIterator();
foreach ($parts as $part) { if ($parts->getRuleStatus() === 200) { echo $part, "
"; } }
Ожидаемый результат
42
В своей грамматике метку 200 назначили цифрам; не переносите автоматически стандартный смысл констант.
Рядом по задаче: IntlRuleBasedBreakIterator::getRuleStatus.
IntlChar::isalnumРазобрать буквы и десятичные цифры международной метки.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isalnum(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Категории L и Nd; это не все символы с числовым значением и не проверка целой строки. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isalnum("Ж"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x662, 0xb2];
foreach ($points as $point) {
$result = IntlChar::isalnum($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0662: yes
U+00B2: no
Арабская десятичная 2 проходит, надстрочная² нет. Для ограниченного ASCII SKU нужен отдельный договор.
Рядом по задаче: IntlChar::isalpha, IntlChar::isdigit, IntlChar::getNumericValue.
IntlChar::isalphaВыделить именно буквы при диагностике импортированного текста.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isalpha(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Любая категория L: Lu/Ll/Lt/Lm/Lo. Combining marks отдельно буквами не становятся. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isalpha("é"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x416, 0x301];
foreach ($points as $point) {
$result = IntlChar::isalpha($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0416: yes
U+0301: no
Отдельный акцент U+0301 не буква; нельзя поэтому удалять его из имени: он может относиться к предшествующей e.
Рядом по задаче: IntlChar::isUAlphabetic, IntlChar::charType.
IntlChar::isbaseСопоставить старый ICU критерий базового символа при переносе алгоритма.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isbase(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Категории L, N, Mc и Me. Это исторический ICU набор, отличный от общей Unicode модели base character и от Grapheme_Base. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isbase("A"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x31, 0x301];
foreach ($points as $point) {
$result = IntlChar::isbase($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0031: yes
U+0301: no
Для разбиения видимых знаков выбирают grapheme/BreakIterator, а не этот предикат.
Рядом по задаче: IntlChar::hasBinaryProperty, IntlChar::getCombiningClass.
IntlChar::isblankОтличить горизонтальный промежуток в табличном импорте от новой строки.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isblank(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | TAB и Zs; вертикальные LF/VT/FF/CR/NEL/LS/PS не входят. ZWSP не горизонтальный пробел. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isblank(0x09));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0xa0, 0xa];
foreach ($points as $point) {
$result = IntlChar::isblank($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+00A0: yes
U+000A: no
Неразрывный пробел остаётся горизонтальным; перевод строки должен обрабатываться отдельно.
Рядом по задаче: IntlChar::isUWhiteSpace, IntlChar::isWhitespace.
IntlChar::iscntrlНайти управляющие/форматирующие точки для понятной диагностики журнала.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::iscntrl(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Cc, Cf, Zl и Zp: шире ISO control. Не означает, что каждый такой знак следует молча удалить из текста. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::iscntrl(0x0A));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x200d, 0x41];
foreach ($points as $point) {
$result = IntlChar::iscntrl($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+200D: yes
U+0041: no
ZWJ относится к Cf, но важен для emoji и письменностей. Диагностика и разрушительное удаление — разные задачи.
Рядом по задаче: IntlChar::isISOControl, IntlChar::charType.
IntlChar::isdefinedУзнать, назначена ли точке категория в установленной Unicode базе.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isdefined(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | true для категории, отличной от Cn. Noncharacters вроде FDD0 — false; surrogate Cs — true. Это не проверка возможности корректного UTF-8 вывода. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isdefined("A"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0xfdd0, 0xd800];
foreach ($points as $point) {
$result = IntlChar::isdefined($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+FDD0: no
U+D800: yes
Для сериализации отдельно исключают surrogate range; assigned не равнозначно разрешённому пользовательскому символу.
Рядом по задаче: IntlChar::charAge, IntlChar::charType, IntlChar::chr.
IntlChar::isdigitПринять десятичную цифру Unicode там, где международные цифры разрешены форматом.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isdigit(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Только категория Nd/Numeric_Type Decimal; римские числа, дроби и надстрочные цифры не входят. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isdigit(0x0662));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0xff13, 0x2163];
foreach ($points as $point) {
$result = IntlChar::isdigit($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+FF13: yes
U+2163: no
Полноширинная 3 — десятичная цифра, римскаяⅣ — числовой символ другого типа. PHP int cast не нормализует их автоматически.
Рядом по задаче: IntlChar::charDigitValue, IntlChar::digit.
IntlChar::isgraphПометить кодовые точки, имеющие графическое содержание по ICU классификации.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isgraph(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Исключает Cc/Cf/Cs/Cn и все Z. Это не измерение видимой ширины и не гарантия наличия глифа в шрифте. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isgraph("€"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x20, 0x301];
foreach ($points as $point) {
$result = IntlChar::isgraph($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0020: no
U+0301: yes
Комбинируемый акцент может быть графическим при нулевой самостоятельной ширине; пробел исключён.
Рядом по задаче: IntlChar::isprint, IntlChar::charType.
IntlChar::isIDIgnorableОбнаружить скрытые точки, которые старый identifier алгоритм считает игнорируемыми.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isIDIgnorable(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Cf и ISO controls0000–0008,000E–001B,007F–009F. Unicode рекомендация игнорировать Cf уже этого набора. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isIDIgnorable(0x200D));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x0, 0x9];
foreach ($points as $point) {
$result = IntlChar::isIDIgnorable($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0000: yes
U+0009: no
Игнорирование при сравнении может столкнуть два разных имени. Для новых идентификаторов задают явную нормализацию/политику и spoof checks.
Рядом по задаче: IntlChar::isIDPart, IntlChar::hasBinaryProperty.
IntlChar::isIDPartРазобрать последующие точки учебного Unicode идентификатора.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isIDPart(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | L, Nl, Nd, Mc, Mn, Pc и isIDIgnorable. Это старый ICU критерий, не точная копия современного ID_Continue. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isIDPart("7"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x5f, 0x2d];
foreach ($points as $point) {
$result = IntlChar::isIDPart($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+005F: yes
U+002D: no
Подчёркивание допустимо, дефис нет. Первый символ проверяется отдельно; правила PHP переменных здесь не определяются.
Рядом по задаче: IntlChar::isIDStart, IntlChar::isIDIgnorable, IntlChar::hasBinaryProperty.
IntlChar::isIDStartПроверить начало идентификатора по старому Unicode/ICU профилю.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isIDStart(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Категории L и Nl; underscore и цифры сами по себе не входят. Современные ID_Start/XID_Start проверяют через binary property. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isIDStart("Я"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x37, 0x5f];
foreach ($points as $point) {
$result = IntlChar::isIDStart($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0037: no
U+005F: no
Для своего DSL можно разрешить underscore дополнительно явно; не называйте это без изменений валидатором PHP имени.
Рядом по задаче: IntlChar::isIDPart, IntlChar::isJavaIDStart, IntlChar::hasBinaryProperty.
IntlChar::isISOControlНайти C0/C1 управляющие коды при просмотре некорректной выгрузки.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isISOControl(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | 0000–001F и 007F–009F; категория Cc. Cf вроде ZWJ сюда не относится. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isISOControl(0x7F));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0xa, 0x200d];
foreach ($points as $point) {
$result = IntlChar::isISOControl($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+000A: yes
U+200D: no
Протокол может разрешать LF, но запрещать NUL. Этот признак — материал для конкретной политики, не сама политика.
Рядом по задаче: IntlChar::iscntrl, IntlChar::isprint.
IntlChar::isJavaIDPartПроверить продолжение имени для генератора Java кода.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isJavaIDPart(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Дополняет isIDPart символами валюты Sc. Относится к ICU версии Unicode; полный Java lexer имеет и другие ограничения. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isJavaIDPart("$"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x37, 0x2d];
foreach ($points as $point) {
$result = IntlChar::isJavaIDPart($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0037: yes
U+002D: no
Прошедшие символы ещё не исключают зарезервированное слово, конфликт имён или неправильное начало.
Рядом по задаче: IntlChar::isJavaIDStart, IntlChar::isIDPart.
IntlChar::isJavaIDStartПроверить первый символ при генерации имени Java поля.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isJavaIDStart(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | isIDStart плюс Sc и Pc; поэтому $ и underscore возможны. Это не правило имён пользователя сайта. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isJavaIDStart("_"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x24, 0x37];
foreach ($points as $point) {
$result = IntlChar::isJavaIDStart($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0024: yes
U+0037: no
Далее проверяют каждый символ через isJavaIDPart и отдельно словарь ключевых слов/доступную версию Java.
Рядом по задаче: IntlChar::isJavaIDPart, IntlChar::isIDStart.
IntlChar::isJavaSpaceCharСогласовать импорт с Java isSpaceChar, когда нужны категории разделителей.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isJavaSpaceChar(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Любая Z: Zs/Zl/Zp; TAB/LF как управляющие коды сюда не входят. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isJavaSpaceChar(0xA0));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x2028, 0x9];
foreach ($points as $point) {
$result = IntlChar::isJavaSpaceChar($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+2028: yes
U+0009: no
Неразрывный пробел входит, табуляция нет — это осмысленное отличие от других whitespace функций.
Рядом по задаче: IntlChar::isWhitespace, IntlChar::isUWhiteSpace.
IntlChar::islowerНайти точки категории строчных букв Ll для статистики текста.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::islower(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Именно Ll. Более широкое Unicode свойство Lowercase включает дополнительные категории. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::islower("я"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x61, 0x2170];
foreach ($points as $point) {
$result = IntlChar::islower($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0061: yes
U+2170: no
Строчная римскаяⅰ не Ll, хотя Lowercase у неё true. Не используйте этот метод как исчерпывающую модель регистра.
Рядом по задаче: IntlChar::isULowercase, IntlChar::tolower.
IntlChar::isMirroredПоказать редактору, что глиф знака может зеркально отображаться в RTL контексте.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isMirrored(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Unicode Bidi_Mirrored; это признак отображения, не команда перевернуть строку. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isMirrored("("));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x3c, 0x41];
foreach ($points as $point) {
$result = IntlChar::isMirrored($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+003C: yes
U+0041: no
Знак< зеркален, буква A нет. Браузер с bidi algorithm обычно сам решает визуальное представление.
Рядом по задаче: IntlChar::charMirror, IntlChar::getBidiPairedBracket.
IntlChar::isprintОтличить печатные категории от C при диагностике импортированного значения.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isprint(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Все категории кроме C. Разделители входят; private use Co исключён. Печатный по категории не значит видимый/безопасный для HTML. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isprint(" "));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x20, 0xa];
foreach ($points as $point) {
$result = IntlChar::isprint($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0020: yes
U+000A: no
Пробел проходит, LF нет. HTML всё равно экранируется независимо от этого результата.
Рядом по задаче: IntlChar::isgraph, IntlChar::iscntrl.
IntlChar::ispunctКлассифицировать пунктуацию в поисковом анализаторе.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::ispunct(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Все категории P, а не любой ASCII знак между буквами. Валюты и математические символы принадлежат S. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::ispunct("!"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x2014, 0x24];
foreach ($points as $point) {
$result = IntlChar::ispunct($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+2014: yes
U+0024: no
Длинное тире — пунктуация, доллар — валюта. Слепое удаление пунктуации испортит артикулы с дефисом.
Рядом по задаче: IntlChar::charType, IntlChar::isalnum.
IntlChar::isspaceПеренести C/POSIX-подобную классификацию пробельных точек на Unicode.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isspace(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Разделители Z плюс whitespace ISO controls, включая неразрывные пробелы и IS1–IS4. Отличается от UnicodeWhite_Space и Java/ICUWhitespace. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isspace(0x20));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x1c, 0xa0];
foreach ($points as $point) {
$result = IntlChar::isspace($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+001C: yes
U+00A0: yes
Оба знака проходят здесь; isUWhiteSpace исключит 1C, isWhitespace исключит NBSP. Сначала выбирают договор импорта.
Рядом по задаче: IntlChar::isUWhiteSpace, IntlChar::isWhitespace, IntlChar::isblank.
IntlChar::istitleРаспознать отдельную titlecase точку в лингвистическом инструменте.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::istitle(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Только Lt: напримерDž, одна Unicode точка с особым регистром. Не проверяет, начинается ли слово с заглавной буквы. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::istitle("Dž"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x1c5, 0x41];
foreach ($points as $point) {
$result = IntlChar::istitle($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+01C5: yes
U+0041: no
Обычная A является Lu, а не Lt. Для заголовка целой строки нужен строковый алгоритм.
Рядом по задаче: IntlChar::totitle, IntlChar::isupper.
IntlChar::isUAlphabeticИспользовать полное свойство Alphabetic при Unicode анализе.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isUAlphabetic(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Эквивалент hasBinaryProperty(PROPERTY_ALPHABETIC): шире isalpha, включает часть marks/letter numbers. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isUAlphabetic("Ж"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x345, 0x31];
foreach ($points as $point) {
$result = IntlChar::isUAlphabetic($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0345: yes
U+0031: no
Combining Greek ypogegrammeni Alphabetictrue, хотя не категория L. Такой анализ не устанавливает язык текста.
Рядом по задаче: IntlChar::isalpha, IntlChar::hasBinaryProperty.
IntlChar::isULowercaseПроверить Unicode Lowercase, включая символы вне Ll.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isULowercase(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Эквивалент binaryPROPERTY_LOWERCASE; зависит от UCD, не от locale. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isULowercase("я"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x2170, 0x41];
foreach ($points as $point) {
$result = IntlChar::isULowercase($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+2170: yes
U+0041: no
Строчная римскаяⅰ проходит; так видна разница с узким islower.
Рядом по задаче: IntlChar::islower, IntlChar::foldCase.
IntlChar::isupperНайти точки категории прописных букв Lu.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isupper(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Именно Lu; Unicode Uppercase шире и включает некоторые числа/символы. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isupper("Я"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x41, 0x2160];
foreach ($points as $point) {
$result = IntlChar::isupper($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0041: yes
U+2160: no
Прописная римскаяⅠ не Lu; при необходимости свойства регистра нужен isUUppercase.
Рядом по задаче: IntlChar::isUUppercase, IntlChar::toupper.
IntlChar::isUUppercaseПроверить полное Unicode Uppercase при сравнении систем импорта.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isUUppercase(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Эквивалент binaryPROPERTY_UPPERCASE, не узкой категории Lu. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isUUppercase("Я"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x2160, 0x61];
foreach ($points as $point) {
$result = IntlChar::isUUppercase($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+2160: yes
U+0061: no
Прописная римскаяⅠ имеет Uppercase, хотя относится к Nl.
Рядом по задаче: IntlChar::isupper, IntlChar::hasBinaryProperty.
IntlChar::isUWhiteSpaceВыбрать именно стандартизованное Unicode White_Space для поля формы.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isUWhiteSpace(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Эквивалент PROPERTY_WHITE_SPACE: включает NBSP и другие Unicode spaces; исключает IS1–IS4, ZWSP и BOM. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isUWhiteSpace(0xA0));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x1c, 0x200b];
foreach ($points as $point) {
$result = IntlChar::isUWhiteSpace($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+001C: no
U+200B: no
Невидимый знак не обязательно whitespace. Решение об удалении BOM/zero-width задаётся отдельно на границе формата.
Рядом по задаче: IntlChar::isWhitespace, IntlChar::isspace, IntlChar::hasBinaryProperty.
IntlChar::isWhitespaceПовторить Java/ICU правило whitespace без неразрывных пробелов.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isWhitespace(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Z кроме 00A0/2007/202F, плюс 0009–000D и 001C–001F. Это не весь UnicodeWhite_Space; U+200B с Unicode4.0.1 больше не пробел. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isWhitespace(0x09));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0xa0, 0x1c];
foreach ($points as $point) {
$result = IntlChar::isWhitespace($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+00A0: no
U+001C: yes
NBSP сохраняет смысл неразрывности, управляющий file separator входит. Не подменяйте этим методом другой whitespace контракт.
Рядом по задаче: IntlChar::isUWhiteSpace, IntlChar::isJavaSpaceChar.
IntlChar::isxdigitРазобрать hexadecimal-подобную Unicode цифру там, где международная форма разрешена.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::isxdigit(string|int $codepoint): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Точное правило | Nd плюс A–F/a–f и полноширинные аналоги букв. Шире ASCII hex; нельзя напрямую применять как валидатор SHA256/цвета API. |
| Результат | true/false означает свойство корректной точки; null — отказ разбора входа. Проверка ===true отличается от проверки результата на null. Свойства берутся из версии Unicode используемой ICU, не из setlocale и не из языка посетителя. |
<?php
declare(strict_types=1);
var_dump(IntlChar::isxdigit("F"));
Ожидаемый результат
bool(true)
Метод проверяет один элемент Unicode; true не утверждает ничего обо всём имени или документе.
<?php
declare(strict_types=1);
$points = [0x662, 0x47];
foreach ($points as $point) {
$result = IntlChar::isxdigit($point);
if ($result === null) throw new RuntimeException("Некорректная точка");
printf("U+%04X: %s\n", $point, $result ? "yes" : "no");
}
Ожидаемый результат
U+0662: yes
U+0047: no
Арабская 2 проходит, G нет. Для ASCII hex сначала ограничивают кодовую точку<=0x7F или используют точный ASCII parser.
Рядом по задаче: IntlChar::digit, IntlChar::charDigitValue.
IntlChar::chrСобрать UTF-8 символ из числового кода API или таблицы, без eval и самодельного byte encoding.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::chr(string|int $codepoint): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | UTF-8 string одной точки либо null. Строковый вход из одной корректной точки возвращается как тот же символ. integer0 возвращает строку NUL, а не пустую строку. |
<?php
declare(strict_types=1);
echo IntlChar::chr(0x20AC), "
";
Ожидаемый результат
€
В отличие от обычного chr, число обозначает Unicode кодовую точку, не один байт 0…255.
<?php
declare(strict_types=1);
$point = 0x1F600;
if ($point < 0 || $point > 0x10FFFF || ($point >= 0xD800 && $point <= 0xDFFF)) {
throw new InvalidArgumentException('Нужен Unicode scalar value');
}
$symbol = IntlChar::chr($point);
if ($symbol === null) throw new RuntimeException(intl_get_error_message());
echo $symbol, " / bytes=", strlen($symbol), "\n";
Ожидаемый результат
😀 / bytes=4
Сначала проверяем число, затем кодируем. Для динамического значения не конструируют Unicode escape через eval. Это ещё не проверка разрешённости emoji бизнес-правилом.
Рядом по задаче: IntlChar::ord, IntlChar::isdefined.
IntlChar::ordРазобраться, какая точка скрыта за непривычным знаком в импорте.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::ord(string|int $character): ?int| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Integer номер точки либо null. Для integer входа в диапазоне возвращается то же число; строковый"7" — символ с кодом 55, а не integer7. |
<?php
declare(strict_types=1);
printf("U+%04X\n", IntlChar::ord("\u{00A0}"));
Ожидаемый результат
U+00A0
Номер позволяет отличить NBSP от обычного U+0020, хотя оба выглядят пробелами.
<?php
declare(strict_types=1);
echo IntlChar::ord(7), " / ", IntlChar::ord("7"), "
";
Ожидаемый результат
7 / 55
Сигнатура int|string действительно задаёт два представления точки. Для численного значения цифры нужен charDigitValue/digit.
Рядом по задаче: IntlChar::chr, IntlChar::charDigitValue, IntlChar::charName.
IntlChar::tolowerСопоставить простой строчный вариант одной Unicode точки.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::tolower(string|int $codepoint): string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Тип сохраняется по входу: string→UTF-8 string, int→номер int; null при отказе. Если simple mapping отсутствует, возвращается исходная точка. Одноточечный mapping не расширяет один символ в несколько. |
<?php
declare(strict_types=1);
echo IntlChar::tolower("Я"), "
";
Ожидаемый результат
я
Простой mapping не зависит от locale и контекста слова. Для строки с языковыми правилами используют соответствующий строковый API.
<?php
declare(strict_types=1);
$point = IntlChar::tolower(0x41);
echo $point, " / ", IntlChar::chr($point), "
";
Ожидаемый результат
97 / a
Возвращён integer; chr нужен только там, где требуется строка вывода. Простой mapping не зависит от locale и контекста слова. Для строки с языковыми правилами используют соответствующий строковый API.
Рядом по задаче: IntlChar::toupper, IntlChar::foldCase.
IntlChar::toupperСопоставить простой прописной вариант одной точки.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::toupper(string|int $codepoint): string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Тип сохраняется по входу: string→UTF-8 string, int→номер int; null при отказе. Если simple mapping отсутствует, возвращается исходная точка. Одноточечный mapping не расширяет один символ в несколько. |
<?php
declare(strict_types=1);
echo IntlChar::toupper("я"), "
";
Ожидаемый результат
Я
Одна точка не разворачивается в строку SS: не используйте цикл toupper как полную Unicode uppercase операцию.
<?php
declare(strict_types=1);
$point = IntlChar::toupper(0x61);
echo $point, " / ", IntlChar::chr($point), "
";
Ожидаемый результат
65 / A
Возвращён integer; chr нужен только там, где требуется строка вывода. Одна точка не разворачивается в строку SS: не используйте цикл toupper как полную Unicode uppercase операцию.
Рядом по задаче: IntlChar::tolower, IntlChar::totitle.
IntlChar::totitleПолучить отдельный titlecase вариант сложной буквы, напримерdž→Dž.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::totitle(string|int $codepoint): string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Тип сохраняется по входу: string→UTF-8 string, int→номер int; null при отказе. Если simple mapping отсутствует, возвращается исходная точка. Одноточечный mapping не расширяет один символ в несколько. |
<?php
declare(strict_types=1);
echo IntlChar::totitle("dž"), "
";
Ожидаемый результат
Dž
Titlecase одной точки не умеет находить границы слов и не превращает всё предложение в заголовок.
<?php
declare(strict_types=1);
$point = IntlChar::totitle(0x1c6);
echo $point, " / ", IntlChar::chr($point), "
";
Ожидаемый результат
453 / Dž
Возвращён integer; chr нужен только там, где требуется строка вывода. Titlecase одной точки не умеет находить границы слов и не превращает всё предложение в заголовок.
Рядом по задаче: IntlChar::istitle, IntlChar::toupper.
IntlChar::charMirrorПосмотреть простую Unicode замену для зеркального глифа при конвертации legacy visual-order данных.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::charMirror(string|int $codepoint): string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Тип сохраняется по входу: string→UTF-8 string, int→номер int; null при отказе. Если simple mapping отсутствует, возвращается исходная точка. Одноточечный mapping не расширяет один символ в несколько. |
<?php
declare(strict_types=1);
echo IntlChar::charMirror("<"), "
";
Ожидаемый результат
>
Не разворачивает порядок RTL текста. Bidi_Mirrored = true не гарантирует отдельную точку-пару для любого глифа; отсутствие mapping возвращает исходную точку.
<?php
declare(strict_types=1);
$point = IntlChar::charMirror(0x28);
echo $point, " / ", IntlChar::chr($point), "
";
Ожидаемый результат
41 / )
Возвращён integer; chr нужен только там, где требуется строка вывода. Не разворачивает порядок RTL текста. Bidi_Mirrored = true не гарантирует отдельную точку-пару для любого глифа; отсутствие mapping возвращает исходную точку.
Рядом по задаче: IntlChar::isMirrored, IntlChar::getBidiPairedBracket.
IntlChar::getBidiPairedBracketНайти парную скобку в анализаторе Unicode текста.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getBidiPairedBracket(string|int $codepoint): string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Тип сохраняется по входу: string→UTF-8 string, int→номер int; null при отказе. Если simple mapping отсутствует, возвращается исходная точка. Одноточечный mapping не расширяет один символ в несколько. |
<?php
declare(strict_types=1);
echo IntlChar::getBidiPairedBracket("("), "
";
Ожидаемый результат
)
Проверяет Bidi_Paired_Bracket_Type Open/Close и mapping; прочим точкам возвращает их же. Это уже, чем общий зеркальный glyph mapping.
<?php
declare(strict_types=1);
$point = IntlChar::getBidiPairedBracket(0x5b);
echo $point, " / ", IntlChar::chr($point), "
";
Ожидаемый результат
93 / ]
Возвращён integer; chr нужен только там, где требуется строка вывода. Проверяет Bidi_Paired_Bracket_Type Open/Close и mapping; прочим точкам возвращает их же. Это уже, чем общий зеркальный glyph mapping.
Рядом по задаче: IntlChar::charMirror, IntlChar::getIntPropertyValue.
IntlChar::foldCaseСвести варианты регистра одной точки к форме сравнения, например две греческие сигмы.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::foldCase(string|int $codepoint, int $options = IntlChar::FOLD_CASE_DEFAULT): string|int|null| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| options | FOLD_CASE_DEFAULT либо FOLD_CASE_EXCLUDE_SPECIAL_I. Второй вариант включает Turkic mappingI→ı иİ→i; это настройка алгоритма, не locale detection. |
| Возврат | Тип сохраняется по входу: string→UTF-8 string, int→номер int; null при отказе. Если simple mapping отсутствует, возвращается исходная точка. Одноточечный mapping не расширяет один символ в несколько. |
| Граница | Simple case folding без расширений: не делает полный string casefold/NFKC и не устраняет все confusables. |
<?php
declare(strict_types=1);
echo IntlChar::foldCase("Σ"), " / ", IntlChar::foldCase("ς"), "
";
Ожидаемый результат
σ / σ
Для поиска формы приводятся к одному simple case folding значению; это не перевод и не транслитерация.
<?php
declare(strict_types=1);
echo IntlChar::foldCase("I"), " / ", IntlChar::foldCase("I", IntlChar::FOLD_CASE_EXCLUDE_SPECIAL_I), "
";
Ожидаемый результат
i / ı
Политика сравнения логинов должна быть одинаковой при регистрации и поиске, а не зависеть от случайной locale процесса.
Рядом по задаче: IntlChar::tolower, IntlChar::getFC_NFKC_Closure.
IntlChar::charDigitValueПревратить одну международную десятичную цифру в обычное числовое значение.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::charDigitValue(string|int $codepoint): ?int| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | 0…9 для Nd; -1 у корректного символа, который не является десятичной цифрой; null при ошибке входа.0 — успешная цифра, -1 не null. |
<?php
declare(strict_types=1);
echo IntlChar::charDigitValue("٢"), "
";
Ожидаемый результат
2
Обычный cast(int) строки с арабской цифрой не заменяет эту Unicode операцию.
<?php
declare(strict_types=1);
$digits = ['٢', '٣'];
$ascii = '';
foreach ($digits as $char) {
$value = IntlChar::charDigitValue($char);
if ($value === null || $value < 0) throw new InvalidArgumentException('Нужны десятичные цифры');
$ascii .= (string) $value;
}
echo $ascii, "\n";
Ожидаемый результат
23
Для реального поля до преобразования ограничивают длину, разрешённые письменности и формат; денежную сумму не собирают float без договора.
Рядом по задаче: IntlChar::isdigit, IntlChar::digit, IntlChar::getNumericValue.
IntlChar::digitРазобрать одну цифру позиционной системы счисления с выбранным основанием.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::digit(string|int $codepoint, int $base = 10): int|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| base | От 2 до 36 включительно. Помимо Nd, поддерживаются LatinA–Z/a–z и полноширинные аналоги; их значения 10…35 должны быть меньше base. |
| Возврат | int0…base−1;false если нет подходящей цифры/основание вне 2…36;null при ошибке точки. Ноль проверяют строго, не через if(!$value). |
<?php
declare(strict_types=1);
echo IntlChar::digit("F", 16), "
";
Ожидаемый результат
15
Полноширинная F разрешена этим Unicode API. ASCII-only API может требовать её отклонить, а не принять молча.
<?php
declare(strict_types=1);
var_dump(IntlChar::digit("0", 2), IntlChar::digit("2", 2));
Ожидаемый результат
int(0)
bool(false)
Сначала основание формата, затем каждый знак. Это разбор одной цифры, не всей строкичисла.
Рядом по задаче: IntlChar::forDigit, IntlChar::charDigitValue, IntlChar::isxdigit.
IntlChar::forDigitСформировать один знак выбранной системы счисления при написании форматтера.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::forDigit(int $digit, int $base = 10): int| Аргумент или результат | Что означает на практике |
|---|---|
| digit | Integer значение одной цифры 0<=digit |
| base | 2…36, default10. |
| Возврат | Integer кодовая точка ASCII0–9/a–z. Для неверного digit/base возвращается 0 (U+0000), не PHPnull. Поэтому не выводите chr результата до проверки 0. |
<?php
declare(strict_types=1);
$point = IntlChar::forDigit(15, 16);
echo $point, " / ", IntlChar::chr($point), "
";
Ожидаемый результат
102 / f
forDigit возвращаетномер, chr создаёт UTF-8 строку. Для целого числа произвольной длины нужен отдельный алгоритм/base formatter.
<?php
declare(strict_types=1);
$point = IntlChar::forDigit(2, 2);
echo $point === 0 ? "Цифра не входит в основание
" : IntlChar::chr($point);
Ожидаемый результат
Цифра не входит в основание
Успешная цифра 0 имееткод 48, поэтому sentinel0 не конфликтует с обычным символом"0".
Рядом по задаче: IntlChar::digit, IntlChar::chr.
IntlChar::getNumericValueУзнать численный смысл символа, когда импорт содержит дробь или римское число.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getNumericValue(string|int $codepoint): ?float| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | float значения UCD, включая дробное/отрицательное; NO_NUMERIC_VALUE если численного смысла нет; null при отказе. Константа существует с PHP7.0.6. |
| Выбор | Не парсер валют/строк 123.45: одна точка может обозначать½илиⅬ. Символы с Numeric_Value шире десятичных Nd. |
<?php
declare(strict_types=1);
echo IntlChar::getNumericValue("½"), "
";
Ожидаемый результат
0.5
Одна кодовая точка имеет fraction значение; byte/decimal digit cast такого не делает.
<?php
declare(strict_types=1);
foreach (['0', 'x'] as $char) {
$value = IntlChar::getNumericValue($char);
if ($value === null) throw new RuntimeException('Неверная точка');
echo $value === (float) IntlChar::NO_NUMERIC_VALUE ? "Числа нет\n" : "Число: $value\n";
}
Ожидаемый результат
Число: 0
Числа нет
Сравниваем float со float sentinel. Число 0 не должно исчезать в ветке ложного значения.
Рядом по задаче: IntlChar::charDigitValue, IntlChar::digit.
IntlChar::hasBinaryPropertyПроверить конкретное свойство символа: является ли он буквой или изменяется при смене регистра.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::hasBinaryProperty(string|int $codepoint, int $property): ?bool| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| property | Один binary PROPERTY_* selector. Это отдельный вопрос, а не bitmask нескольких свойств. |
| Возврат | bool; false также для неподдержанного selector или отсутствующих данных. null означает ошибку codepoint. Неверное свойство не всегда вызывает исключение. |
<?php
declare(strict_types=1);
var_dump(IntlChar::hasBinaryProperty("Я", IntlChar::PROPERTY_ALPHABETIC));
Ожидаемый результат
bool(true)
Вопрос относится к UCD свойству; конкретный язык по этому признаку не определяется.
<?php
declare(strict_types=1);
foreach (['A', 'a', '7'] as $char) {
echo $char, ': ', IntlChar::hasBinaryProperty($char, IntlChar::PROPERTY_CHANGES_WHEN_LOWERCASED) ? 'change' : 'same', "\n";
}
Ожидаемый результат
A: change
a: same
7: same
Свойство объясняет преобразование; для всей строки нужно выбрать согласованный Unicode алгоритм.
Рядом по задаче: IntlChar::getIntPropertyValue, IntlChar::isUAlphabetic.
IntlChar::charAgeПроверить совместимость экспортируемого символа со старым получателем Unicode.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::charAge(string|int $codepoint): ?array| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Четыре integer компонента версии [major, minor, milli, micro]: первое назначение или обозначение точки, включая private use и noncharacter. Неназначенная точка имеет нулевую версию; null — ошибка входа. |
| Граница | Возраст Unicode не обещает, что шрифт содержит глиф или сервис реализует всю заявленную версию. |
<?php
declare(strict_types=1);
echo implode(".", IntlChar::charAge("A")), "
";
Ожидаемый результат
1.1.0.0
Это возраст точки в Unicode, а не версия ICU.
<?php
declare(strict_types=1);
$point = '😀';
$age = IntlChar::charAge($point);
if ($age === null) throw new RuntimeException('Неверная точка');
$supported = version_compare(implode('.', $age), '6.0.0.0', '<=');
echo $supported ? "Проходит версионный порог\n" : "Нужен более новый Unicode\n";
Ожидаемый результат
Нужен более новый Unicode
😀 назначен в Unicode6.1. Порог 6.0 — договор примера; замену или отказ экспорта согласуют с получателем.
Рядом по задаче: IntlChar::getUnicodeVersion, IntlChar::isdefined.
IntlChar::getUnicodeVersionЗафиксировать версию Unicode данных, чтобы объяснить разные результаты на двух серверах.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getUnicodeVersion(): array| Аргумент или результат | Что означает на практике |
|---|---|
| Аргументы | Нет. |
| Возврат | Четыре integer компонента версии UCD, используемой ICU. Это не PHP_VERSION и не INTL_ICU_VERSION. |
| Воспроизводимость | При обновлении ICU появляются новые назначенные точки и свойства. Зафиксируйте версию окружения важных тестов; одной версии PHP недостаточно. |
<?php
declare(strict_types=1);
echo implode(".", IntlChar::getUnicodeVersion()), "
";
Ожидаемый результат
16.0.0.0
Результат зафиксирован для проверенного стенда ICU77.1; у другой ICU версия Unicode может отличаться.
<?php
declare(strict_types=1);
$version = implode(".", IntlChar::getUnicodeVersion());
echo version_compare($version, "15.0.0.0", ">=") ? "Порог Unicode15 выполнен
" : "Данные старее требуемых
";
Ожидаемый результат
Порог Unicode15 выполнен
Это оценка версии данных, а не наличия каждой PHP константы: обёртка может не экспортировать новые ICU значения.
Рядом по задаче: IntlChar::charAge, IntlChar::hasBinaryProperty.
IntlChar::charTypeОбъяснить, к какой категории относится непривычный знак из импорта.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::charType(string|int $codepoint): ?int| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Integer одной General_Category, сопоставляемый с CHAR_CATEGORY_* или именем из getPropertyValueName. Категория 0 (Cn) — корректный результат неназначенной точки; null — ошибка входа. |
| Граница | General_Category классифицирует точки; script, block и bidi — независимые характеристики. |
<?php
declare(strict_types=1);
echo IntlChar::getPropertyValueName(IntlChar::PROPERTY_GENERAL_CATEGORY, IntlChar::charType("€")), "
";
Ожидаемый результат
Currency_Symbol
Евро относится к валютам, а не к пунктуации; диагностический отчёт даёт конкретную причину.
<?php
declare(strict_types=1);
foreach (['Я', '7', '!'] as $char) {
echo $char, ': ', IntlChar::getPropertyValueName(IntlChar::PROPERTY_GENERAL_CATEGORY, IntlChar::charType($char), IntlChar::SHORT_PROPERTY_NAME), "\n";
}
Ожидаемый результат
Я: Lu
7: Nd
!: Po
Короткие UCD имена полезны в логах и документации регулярных выражений. Бизнес-правило задаётся поверх классификации.
Рядом по задаче: IntlChar::isalpha, IntlChar::isdigit, IntlChar::getIntPropertyValue.
IntlChar::charDirectionПосмотреть базовый bidi класс символа в смешанном RTL/LTR тексте.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::charDirection(string|int $codepoint): ?int| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Integer CHAR_DIRECTION_* либо null. Некоторые неназначенные точки имеют R/AL согласно резервированию диапазонов. |
| Граница | Класс одной точки не определяет направление всего предложения. Для отображения нужен Unicode Bidirectional Algorithm; переворачивать массив букв вручную неправильно. |
<?php
declare(strict_types=1);
var_dump(IntlChar::charDirection("א") === IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT);
Ожидаемый результат
bool(true)
Это strong RTL символ; нейтральные пробелы и цифры имеют другие bidi классы.
<?php
declare(strict_types=1);
foreach (['A', '7', 'ا'] as $char) {
echo IntlChar::getPropertyValueName(IntlChar::PROPERTY_BIDI_CLASS, IntlChar::charDirection($char), IntlChar::SHORT_PROPERTY_NAME), "\n";
}
Ожидаемый результат
L
EN
AL
EN не становится R просто из-за соседства с арабским текстом. Итоговый порядок определяет полный bidi алгоритм.
Рядом по задаче: IntlChar::charMirror, IntlChar::getBidiPairedBracket, IntlChar::getIntPropertyValue.
IntlChar::getBlockCodeНайти именованный Unicode блок символа в диагностическом справочнике.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getBlockCode(string|int $codepoint): ?int| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Integer BLOCK_CODE_*. Для точки без назначенного блока — BLOCK_CODE_NO_BLOCK; для плохого codepoint — null. |
| Граница | Блок — диапазон кодов, не язык. Одна письменность может занимать много блоков; в одном блоке могут быть знаки разных языков. Script — отдельное свойство. |
<?php
declare(strict_types=1);
var_dump(IntlChar::getBlockCode("Ж") === IntlChar::BLOCK_CODE_CYRILLIC);
Ожидаемый результат
bool(true)
Принадлежность кириллице не означает автоматически русский язык.
<?php
declare(strict_types=1);
$block = IntlChar::getBlockCode("€");
echo IntlChar::getPropertyValueName(IntlChar::PROPERTY_BLOCK, $block), "
";
Ожидаемый результат
Currency_Symbols
Стандартное английское название точно идентифицирует блок; перевод интерфейса можно хранить отдельно.
Рядом по задаче: IntlChar::getIntPropertyValue, IntlChar::getPropertyValueName.
IntlChar::getCombiningClassОбъяснить порядок combining marks при нормализации Unicode.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getCombiningClass(string|int $codepoint): ?int| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Integer canonical combining class, обычно 0 у starter, либо значение порядка у комбинируемой точки; null при отказе. Поле допускает 0…255, именованные значения не обязательно идут подряд. |
| Граница | CCC0 не синоним буквы и не гарантия видимой ширины. Сортировка всей строки по CCC разрушит текст: полный алгоритм выполняет Normalizer. |
<?php
declare(strict_types=1);
echo IntlChar::getCombiningClass(0x0301), "
";
Ожидаемый результат
230
Acute accent имеет класс Above230. Это значение порядка нормализации, не координата экрана.
<?php
declare(strict_types=1);
foreach ([0x61, 0x0327, 0x0301] as $cp) printf("U+%04X: %d\n", $cp, IntlChar::getCombiningClass($cp));
Ожидаемый результат
U+0061: 0
U+0327: 202
U+0301: 230
У a, cedilla и acute разные классы. Каноническую строку формируют через Normalizer, а не общей сортировкой точек.
Рядом по задаче: IntlChar::charType, IntlChar::getIntPropertyValue.
IntlChar::getFC_NFKC_ClosureПосмотреть специальный mapping для алгоритмов, сочетающих case folding и compatibility normalization.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getFC_NFKC_Closure(string|int $codepoint): string|false|null| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| Возврат | Строка FC_NFKC_Closure, пустая строка при отсутствии специального замыкания, false/null при отказе. Для одной точки результат иногда содержит несколько символов. |
| Выбор | Низкоуровневое UCD свойство для разработчиков нормализаторов. Оно не заменяет Normalizer и строковый case folding. Пустой результат не означает, что исходную букву нужно удалить. |
<?php
declare(strict_types=1);
var_dump(IntlChar::getFC_NFKC_Closure("A"));
Ожидаемый результат
string(0) ""
A обрабатывается основным алгоритмом. Пустая строка означает отсутствие дополнительного mapping.
<?php
declare(strict_types=1);
$mapping = IntlChar::getFC_NFKC_Closure(0x2121);
echo "U+2121 closure: ", $mapping, "
";
Ожидаемый результат
U+2121 closure: tel
Compatibility symbol имеет mapping из трёх букв. Это показывает, почему simple foldCase одной точки не заменяет полный строковый алгоритм.
Рядом по задаче: IntlChar::foldCase, IntlChar::getIntPropertyValue.
IntlChar::getIntPropertyValueПолучить письменность, категорию, ширину или другое перечислимое свойство символа.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getIntPropertyValue(string|int $codepoint, int $property): ?int| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| property | PROPERTY_* selector для integer/enum/binary/mask. Имена свойств и названия результатов принадлежат разным группам констант. |
| Возврат | Integer enum,0/1 для binary либо bitmask.0 также возможен для неподдержанного selector или отсутствующих данных; null — ошибка codepoint. Для string/double свойств выбирают соответствующие методы, а не ждут строку или дробь от этого. |
<?php
declare(strict_types=1);
$script = IntlChar::getIntPropertyValue("Ж", IntlChar::PROPERTY_SCRIPT);
echo IntlChar::getPropertyValueName(IntlChar::PROPERTY_SCRIPT, $script), "
";
Ожидаемый результат
Cyrillic
Одна письменность используется разными языками. Script_Extensions — другое, более широкое свойство.
<?php
declare(strict_types=1);
var_dump(IntlChar::getIntPropertyValue("A", IntlChar::PROPERTY_EAST_ASIAN_WIDTH) === IntlChar::EA_FULLWIDTH);
Ожидаемый результат
bool(true)
Это свойство не измеряет пиксели или универсальную терминальную ширину: шрифт и контекст имеют значение.
Рядом по задаче: IntlChar::hasBinaryProperty, IntlChar::getPropertyValueName, IntlChar::getIntPropertyMaxValue.
IntlChar::getIntPropertyMinValueПолучить нижнюю границу значений integer свойства перед построением диагностического списка.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getIntPropertyMinValue(int $property): int| Аргумент или результат | Что означает на практике |
|---|---|
| property | Integer/enum/binary PROPERTY_* selector. |
| Возврат | Минимальное integer значение;0 при неподдержанном selector. По одному нулю нельзя отличить ошибочный selector от обычного минимума. |
<?php
declare(strict_types=1);
echo IntlChar::getIntPropertyMinValue(IntlChar::PROPERTY_ALPHABETIC), "
";
Ожидаемый результат
0
Binary false представлен нулём.
<?php
declare(strict_types=1);
$prop = IntlChar::PROPERTY_BIDI_PAIRED_BRACKET_TYPE;
echo IntlChar::getIntPropertyMinValue($prop), "..", IntlChar::getIntPropertyMaxValue($prop), "
";
Ожидаемый результат
0..2
У этого свойства есть None/Open/Close. Другие свойства могут иметь пропуски внутри диапазона; имя каждого кандидата проверяют отдельно.
Рядом по задаче: IntlChar::getIntPropertyMaxValue, IntlChar::getPropertyValueName.
IntlChar::getIntPropertyMaxValueУзнать верхнюю границу значений именно установленной Unicode базы, не зашивая старое число.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getIntPropertyMaxValue(int $property): int| Аргумент или результат | Что означает на практике |
|---|---|
| property | Integer/enum/binary PROPERTY_* selector. |
| Возврат | Максимальное значение; для binary1, для недопустимого selector-1. Это не COUNT, а включённая верхняя граница, меняющаяся вместе с ICU. |
| Граница | Не каждому номеру между min и max соответствует имя: например, CCC имеет пропуски. Размер списка интерфейса всё равно нужно ограничить. |
<?php
declare(strict_types=1);
echo IntlChar::getIntPropertyMaxValue(IntlChar::PROPERTY_ALPHABETIC), "
";
Ожидаемый результат
1
Binary данные имеют значения только 0 и 1.
<?php
declare(strict_types=1);
$max = IntlChar::getIntPropertyMaxValue(IntlChar::PROPERTY_INVALID_CODE);
echo $max < 0 ? "Не поддерживается
" : "Есть диапазон
";
Ожидаемый результат
Не поддерживается
У каждого метода свой sentinel: здесь-1, у hasBinaryProperty возможно false без отдельной ошибки.
Рядом по задаче: IntlChar::getIntPropertyMinValue, IntlChar::getIntPropertyValue.
IntlChar::getPropertyEnumПеревести имя Unicode свойства из настройки в числовой selector для следующей проверки.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getPropertyEnum(string $alias): int| Аргумент или результат | Что означает на практике |
|---|---|
| alias | Короткое или длинное имя UCD PropertyAliases. Loose matching игнорирует регистр, дефисы, подчёркивания и пробелы. Дополнительно поддержаны synthetic gcm / General_Category_Mask. |
| Возврат | Integer PROPERTY_* либо PROPERTY_INVALID_CODE. Проверьте sentinel и затем выберите метод, подходящий виду свойства. |
<?php
declare(strict_types=1);
var_dump(IntlChar::getPropertyEnum("gc") === IntlChar::PROPERTY_GENERAL_CATEGORY);
Ожидаемый результат
bool(true)
Получен selector General_Category, а не код конкретной категории Lu.
<?php
declare(strict_types=1);
$property = IntlChar::getPropertyEnum("catalog_rating");
echo $property === IntlChar::PROPERTY_INVALID_CODE ? "Такого свойства Unicode нет
" : "Свойство найдено
";
Ожидаемый результат
Такого свойства Unicode нет
Прикладной рейтинг каталога не является свойством UCD. Для него нужна собственная схема.
Рядом по задаче: IntlChar::getPropertyName, IntlChar::getPropertyValueEnum.
IntlChar::getPropertyNameПодписать выбранный Unicode selector в настройках или диагностике.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getPropertyName(int $property, int $type = IntlChar::LONG_PROPERTY_NAME): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| property | Известный PROPERTY_*; PROPERTY_INVALID_CODE не является рабочим свойством. |
| type | LONG_PROPERTY_NAME по умолчанию или SHORT_PROPERTY_NAME. Дополнительные aliases возможны как LONG+1 и далее. Отсутствие короткого имени не отменяет длинного. |
| Возврат | string либо false, если property/type не поддержан. Актуальная сигнатура не возвращает null. Для General_Category_Mask также поддержано короткое gcm. |
<?php
declare(strict_types=1);
echo IntlChar::getPropertyName(IntlChar::PROPERTY_BIDI_CLASS), "
";
Ожидаемый результат
Bidi_Class
Это имя свойства, а не название отдельного символа.
<?php
declare(strict_types=1);
$name = IntlChar::getPropertyName(IntlChar::PROPERTY_GENERAL_CATEGORY, IntlChar::SHORT_PROPERTY_NAME);
echo $name === false ? "Имени нет
" : $name . "
";
Ожидаемый результат
gc
Общий интерфейс должен проверять false: не каждый selector имеет все варианты имени.
Рядом по задаче: IntlChar::getPropertyEnum, IntlChar::getPropertyValueName.
IntlChar::getPropertyValueEnumПревратить название категории или блока в значение конкретного свойства.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getPropertyValueEnum(int $property, string $name): int| Аргумент или результат | Что означает на практике |
|---|---|
| property | Selector, например PROPERTY_GENERAL_CATEGORY или PROPERTY_BLOCK. |
| name | Alias значения по UCD PropertyValueAliases с loose matching. Имя имеет смысл только в рамках выбранного свойства. |
| Возврат | Integer или bitmask, PROPERTY_INVALID_CODE при отказе сопоставления. Общие L/LC/M/N/P/S/Z/C обозначают маски категорий и используются с GENERAL_CATEGORY_MASK, а не обычной GENERAL_CATEGORY. |
<?php
declare(strict_types=1);
var_dump(IntlChar::getPropertyValueEnum(IntlChar::PROPERTY_GENERAL_CATEGORY, "Ll") === IntlChar::CHAR_CATEGORY_LOWERCASE_LETTER);
Ожидаемый результат
bool(true)
Ll имеет числовое значение категории; его нельзя передавать вместо selector свойства.
<?php
declare(strict_types=1);
$letters = IntlChar::getPropertyValueEnum(IntlChar::PROPERTY_GENERAL_CATEGORY_MASK, 'L');
$categoryMask = IntlChar::getIntPropertyValue('Ж', IntlChar::PROPERTY_GENERAL_CATEGORY_MASK);
echo ($letters & $categoryMask) !== 0 ? "Категория входит в Letter\n" : "Другая категория\n";
Ожидаемый результат
Категория входит в Letter
Побитовое& сопоставляет две маски. Обычный integer код Lu сам по себе не является такой маской.
Рядом по задаче: IntlChar::getPropertyValueName, IntlChar::getIntPropertyValue, IntlChar::getPropertyEnum.
IntlChar::getPropertyValueNameПодписать числовой результат Unicode проверки читаемым названием.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::getPropertyValueName(int $property, int $value, int $type = IntlChar::LONG_PROPERTY_NAME): string|false| Аргумент или результат | Что означает на практике |
|---|---|
| property, value | Selector и код значения именно этого свойства. Для общих масок категорий нужен GENERAL_CATEGORY_MASK. |
| type | LONG_PROPERTY_NAME по умолчанию, SHORT_PROPERTY_NAME или дополнительные aliases. Отсутствующий SHORT не исключает LONG. |
| Возврат | string|false. Не каждый номер между min/max имеет имя, например у canonical combining classes. Для блока используйте фактический результат getBlockCode вместо догадки по числу. |
<?php
declare(strict_types=1);
echo IntlChar::getPropertyValueName(IntlChar::PROPERTY_GENERAL_CATEGORY, IntlChar::CHAR_CATEGORY_UPPERCASE_LETTER), "
";
Ожидаемый результат
Uppercase_Letter
Имя UCD лучше объясняет результат человеку, чем нерасшифрованный integer.
<?php
declare(strict_types=1);
$value = IntlChar::getPropertyValueEnum(IntlChar::PROPERTY_GENERAL_CATEGORY_MASK, "L");
echo IntlChar::getPropertyValueName(IntlChar::PROPERTY_GENERAL_CATEGORY_MASK, $value), "
";
Ожидаемый результат
Letter
Letter объединяет все буквенные категории. Это пункт фильтра, а не отдельная категория точки.
Рядом по задаче: IntlChar::getPropertyValueEnum, IntlChar::getPropertyName.
IntlChar::charNameПодписать странный символ в отчёте импорта, чтобы пользователь увидел, что именно мешает обработке.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::charName(string|int $codepoint, int $type = IntlChar::UNICODE_CHAR_NAME): ?string| Аргумент или результат | Что означает на практике |
|---|---|
| codepoint | Одна кодовая точка: integer U+номер (например 0x0410) либо строка UTF-8 ровно из одной точки ("А"). Это не байт, не графема и не слово. Пустая/повреждённая/многоточечная строка или int вне 0…0x10FFFF дают null и global intl error; при настроенном intl.use_exceptions возможен IntlException. Неподходящий PHP тип — TypeError. Целые surrogate значения D800…DFFF входят в диапазон API, но не являются Unicode scalar values для вывода UTF-8. |
| type | UNICODE_CHAR_NAME — современное имя; UNICODE_10_CHAR_NAME — старое, только если оно отличается и данные сохранились; EXTENDED_CHAR_NAME — также служебные обозначения безымянных точек; CHAR_NAME_ALIAS — корректирующий alias, если есть. CHAR_NAME_CHOICE_COUNT — верхняя служебная граница, не рабочий вариант имени. |
| Возврат | Строка официального Unicode имени; пустая строка, когда имени нет в выбранном наборе; null при ошибке. Это английское техническое имя, а не локализованная подпись интерфейса. |
<?php
declare(strict_types=1);
echo IntlChar::charName("€"), "
";
Ожидаемый результат
EURO SIGN
Теперь в диагностике можно назвать символ без гигантского собственного switch по всем кодам.
<?php
declare(strict_types=1);
$name = IntlChar::charName(0);
echo $name === null ? "Ошибка
" : ($name === "" ? "В этом наборе имени нет
" : $name . "
");
Ожидаемый результат
В этом наборе имени нет
Код 0 существует, но modern Unicode name пуст. Extended name можно использовать для технической диагностики.
Рядом по задаче: IntlChar::charFromName, IntlChar::enumCharNames, IntlChar::ord.
IntlChar::charFromNameНайти Unicode точку по её полному стандартному имени в редакторе символов.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::charFromName(string $name, int $type = IntlChar::UNICODE_CHAR_NAME): ?int| Аргумент или результат | Что означает на практике |
|---|---|
| name | Полное имя из выбранного набора, не частичный поисковый запрос и не русская подпись. Используйте каноническую форму Unicode имени. NUL в недоверенном имени следует отвергать, поскольку ICU получает C string. |
| type | UNICODE_CHAR_NAME — современное имя; UNICODE_10_CHAR_NAME — старое, только если оно отличается и данные сохранились; EXTENDED_CHAR_NAME — также служебные обозначения безымянных точек; CHAR_NAME_ALIAS — корректирующий alias, если есть. CHAR_NAME_CHOICE_COUNT — верхняя служебная граница, не рабочий вариант имени. |
| Возврат | Integer номер либо null, если имя не найдено/отказ ICU. Не вызывайте chr с null без проверки, иначе потеряется смысл ошибки. |
<?php
declare(strict_types=1);
$point = IntlChar::charFromName("EURO SIGN");
if ($point === null) throw new RuntimeException("Имя не найдено");
echo $point, " / ", IntlChar::chr($point), "
";
Ожидаемый результат
8364 / €
Поиск возвращает номер; chr нужен отдельно для отображения.
<?php
declare(strict_types=1);
$name = IntlChar::charName("Ж");
$point = IntlChar::charFromName($name);
echo IntlChar::chr($point), "
";
Ожидаемый результат
Ж
Для названной точки modern name даёт обратимое соответствие. Пустые имена/control требуют отдельной ветки.
Рядом по задаче: IntlChar::charName, IntlChar::chr.
IntlChar::enumCharNamesСоздать небольшой справочник символов выбранного диапазона с номерами и именами.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::enumCharNames(string|int $start, string|int $end, callable $callback, int $type = IntlChar::UNICODE_CHAR_NAME): bool| Аргумент или результат | Что означает на практике |
|---|---|
| start, end | Начало включительно, end исключительно. Оба — integer точки или строки из одной точки; ошибка входа даёт false. В PHP wrapper end тоже должен входить в 0…0x10FFFF, поэтому нельзя без проверки передать sentinel0x110000. |
| callback | Вызывается как callback(int $codepoint, int $nameChoice, string $name). PHP 8.5 wrapper игнорирует return callback: false не является командой остановить перечисление. |
| type | UNICODE_CHAR_NAME — современное имя; UNICODE_10_CHAR_NAME — старое, только если оно отличается и данные сохранились; EXTENDED_CHAR_NAME — также служебные обозначения безымянных точек; CHAR_NAME_ALIAS — корректирующий alias, если есть. CHAR_NAME_CHOICE_COUNT — верхняя служебная граница, не рабочий вариант имени. |
| Возврат | bool; с PHP 8.3 отказ false вместо прежнего null. Callback exception может прервать работу исключением. Перечисляются имена, поэтому unnamed точки могут пропускаться. |
<?php
declare(strict_types=1);
$ok = IntlChar::enumCharNames(0x31, 0x33, function (int $point, int $choice, string $name): void {
echo IntlChar::chr($point), ': ', $name, "\n";
});
if (!$ok) throw new RuntimeException(intl_get_error_message());
Ожидаемый результат
1: DIGIT ONE
2: DIGIT TWO
End0x33 не включён: цифра 3 не выводится. Внутри callback каждый раз приходит конкретная точка диапазона.
<?php
declare(strict_types=1);
$items = [];
IntlChar::enumCharNames(0x41, 0x44, function (int $point, int $choice, string $name) use (&$items): bool {
$items[] = IntlChar::chr($point);
return false;
});
echo implode('', $items), "\n";
Ожидаемый результат
ABC
Все три имени были перечислены. Это демонстрация PHP границы относительно ICU C callback, где bool имеет другой договор; не запускайте весь Unicode в надежде остановиться после первой строки.
Рядом по задаче: IntlChar::charName, IntlChar::enumCharTypes.
IntlChar::enumCharTypesСоставить компактные диапазоны категорий Unicode вместо отдельной записи на каждую точку.
PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl
static IntlChar::enumCharTypes(callable $callback): void| Аргумент или результат | Что означает на практике |
|---|---|
| callback | callback(int $start, int $end, int $type). Start включён, end исключён; соседние диапазоны имеют разные General_Category. Последний end может быть 0x110000. |
| Возврат | void. PHP callback return игнорируется, обычный false не останавливает обход. Категория представлена integer0…31, сравнивается с CHAR_CATEGORY_*. |
| Стоимость | Обход всей таблицы диапазонов. Подходит для заранее строимого индекса, а не повторения на каждую букву каждого HTTP запроса. Для одной точки дешевле charType. |
<?php
declare(strict_types=1);
$first = null;
IntlChar::enumCharTypes(function (int $start, int $end, int $type) use (&$first): void {
$first ??= [$start, $end, $type];
});
printf("[%d, %d): %s\n", $first[0], $first[1], IntlChar::getPropertyValueName(IntlChar::PROPERTY_GENERAL_CATEGORY, $first[2]));
Ожидаемый результат
[0, 32): Control
Диапазон содержит точки 0…31, но не 32. Сохранена одна запись, хотя callback посетил всю таблицу.
<?php
declare(strict_types=1);
$count = 0;
IntlChar::enumCharTypes(function (int $start, int $end, int $type) use (&$count): void {
if ($type === IntlChar::CHAR_CATEGORY_UPPERCASE_LETTER) {
$count += max(0, min($end, 0x5B) - max($start, 0x41));
}
});
echo $count, "\n";
Ожидаемый результат
26
Пересечение диапазонов [start,end) с [A,Z+1) считает число точек без создания массива на миллион элементов. Для простого подсчёта в строке всё равно нужен другой алгоритм.
Рядом по задаче: IntlChar::charType, IntlChar::enumCharNames.
intl_error_nameПревратить числовой статус ICU в имя для журнала и диагностики.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intl_error_name(int $errorCode): string| Аргумент или результат | Что означает на практике |
|---|---|
| errorCode | Целый UErrorCode, полученный от intl_get_error_code или конкретного объекта. |
| Возврат | string — символическое имя, например U_ILLEGAL_ARGUMENT_ERROR. Не переводит ошибку для пользователя и не исправляет её. |
| Применение | Сохраняйте число и имя в журнале; для решения, произошёл ли отказ, используйте intl_is_failure, а не поиск ERROR в строке. |
<?php
declare(strict_types=1);
echo intl_error_name(U_ILLEGAL_ARGUMENT_ERROR), "
";
Ожидаемый результат
U_ILLEGAL_ARGUMENT_ERROR
Константа в PHP уже имеет понятное имя, но реальный код может прийти числом от ICU.
<?php
declare(strict_types=1);
$result = Normalizer::normalize("\xFF");
$code = intl_get_error_code();
echo intl_error_name($code), "
";
Ожидаемый результат
U_INVALID_CHAR_FOUND
Байт FF сам по себе не является корректным UTF-8; JSON/HTTP импорт должен знать кодировку источника.
Рядом по задаче: intl_is_failure, Normalizer::normalize.
intl_get_error_codeПрочитать глобальный статус последней Intl-операции, особенно когда объект ещё не создан.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intl_get_error_code(): int| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | int UErrorCode. 0 — успех; отрицательные предупреждения обычно не отказ; положительные коды ошибок распознаёт intl_is_failure. |
| Когда читать | Сразу после результата операции. Следующий Intl-вызов может заменить глобальное состояние. У уже существующего объекта предпочтительна его собственная диагностика. |
<?php
declare(strict_types=1);
Normalizer::normalize("Cafe");
echo intl_get_error_code(), "
";
Ожидаемый результат
0
Успех не нужно угадывать по длине результата.
<?php
declare(strict_types=1);
$result = Normalizer::normalize("\xFF");
$code = intl_get_error_code();
var_dump($result === false, intl_is_failure($code));
Ожидаемый результат
bool(true)
bool(true)
Сохранили статус до запуска следующего преобразования.
Рядом по задаче: intl_get_error_message, intl_is_failure.
intl_get_error_messageПолучить объяснение глобальной ошибки для разработчика.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intl_get_error_message(): string| Аргумент или результат | Что означает на практике |
|---|---|
| Параметры | Нет. |
| Возврат | string, обычно включает имя ICU-статуса и пояснение PHP. Это диагностический текст, который может изменяться между версиями. |
| Практика | Пользователю показывайте понятное сообщение о неподдерживаемом вводе; техническую диагностику сохраняйте в журнале без секретных данных. Не ветвите бизнес-логику по точному тексту сообщения. |
<?php
declare(strict_types=1);
Normalizer::normalize("Cafe");
echo intl_get_error_message(), "
";
Ожидаемый результат
U_ZERO_ERROR
Нормальное состояние имеет собственное сообщение.
<?php
declare(strict_types=1);
$result = Normalizer::normalize("\xFF");
$message = intl_get_error_message();
echo str_contains($message, "U_INVALID_CHAR_FOUND") ? "invalid UTF-8 recorded
" : "other diagnostic
";
Ожидаемый результат
invalid UTF-8 recorded
Проверка подстроки здесь показывает состав диагностики; в приложении решение принимайте по числовому статусу.
Рядом по задаче: intl_error_name, intl_get_error_code.
intl_is_failureОтличить отказ ICU от успеха с информационным предупреждением.
Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl
intl_is_failure(int $errorCode): bool| Аргумент или результат | Что означает на практике |
|---|---|
| errorCode | Числовой UErrorCode. Маска IDNA errors и маска Spoofchecker сюда не подходят. |
| Возврат | bool: true при отказе, false при успехе либо предупреждении. |
| Нюанс | Предупреждение о fallback может быть нежелательно по бизнес-контракту, хотя технически операция успешна. Проверка такого требования — отдельная ветка политики приложения. |
<?php
declare(strict_types=1);
var_dump(intl_is_failure(U_ZERO_ERROR));
var_dump(intl_is_failure(U_USING_FALLBACK_WARNING));
var_dump(intl_is_failure(U_ILLEGAL_ARGUMENT_ERROR));
Ожидаемый результат
bool(false)
bool(false)
bool(true)
У ICU предупреждение не означает то же самое, что PHP E_WARNING.
<?php
declare(strict_types=1);
$result = Normalizer::normalize("\xFF");
if (intl_is_failure(intl_get_error_code())) { echo "text rejected
"; }
Ожидаемый результат
text rejected
Некорректный текст не надо тихо заменять пустым именем товара.
Рядом по задаче: intl_get_error_code, Spoofchecker::isSuspicious.
Источники и обсуждения
- PHP Manual: Intl
- ICU: границы текста
- ICU: сообщения и plural/select
- ICU: преобразования Unicode
- PHP 8.5.11: календарные операции
- PHP 8.5.11: Gregorian
- PHP 8.5.11: UConverter callbacks
- PHP 8.5.11: Spoofchecker masks
- PHP 8.5.11: break iterator methods
- PHP 8.5.11: code point iterator
- PHP 8.5.11: parts iterator
- ICU 77.1: SimpleTimeZone
- ICU 77.1: OlsonTimeZone
Код и руководство с собой
Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.
Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.
Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.


