Перейти к содержимому
Поиск
Php Разработка

PHP: полный мануал с примерами, функциями и ООП

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

Александр НекрасовИзменено:
Практический мануал PHP: от переменных и функций к объектной модели интернет-магазина
PHP 8.5.11149 глав4458 карточек справочника
Дерево руководства

Глава 95 · От первого форматирования к полному API

Intl: полный справочник языков, Unicode, чисел, дат и календарей

Все функции и классы интернационализации: locale, collation, нормализация, графемы, форматирование, календари, IDNA, кодировки и Unicode-свойства с постепенными примерами.

Первая задача: показать число по правилам читателя

В базе магазина хранится число 1234.5. Один посетитель ожидает 1,234.5, другой — 1.234,5. Это одно значение, но разные правила записи. Intl предоставляет готовые правила языков и регионов: числа, даты, алфавитный порядок, формы слов и обработку Unicode. Вам не нужно собирать сотни условий для каждого языка.

Данные и оформление — разные слои
  1. Внутри программы: число 1234.5
  2. Настройка читателя: de_DE
  3. NumberFormatter применяет правила ICU
  4. На экране строка 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_localestring, INI_ALL. Пустое исходное значение использует default ICU из окружения. После явной установки нельзя просто вернуть тот же исходный неявный режим пустой строкой. Для воспроизводимости передавайте locale объектам явно; ICU locales отличаются от системного setlocale.
intl.error_levelint, default 0, INI_ALL. Уровень PHP-сообщения при ошибке ICU, например E_WARNING; 0 отключает такие сообщения. Возвращаемые false/null и статусы ошибок от этого не становятся успехом.
intl.use_exceptionsbool/int, default 0, INI_ALL, с PECL 3.0.0a1. Многие ошибки становятся IntlException, иногда одновременно с сообщением уровня error_level. Контракт конкретного метода может предусматривать исключение и без этой опции.
Долгоживущий процессИзменение default locale/ini внутри задачи может влиять на последующие операции процесса. Явные настройки объектов и восстановление временных режимов уменьшают скрытую зависимость.
Сохранить и восстановить явную default localeСамостоятельный пример
<?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 должно идти перед A10Collator — языковые правила и numeric collation.
Показать цену/проценты или разобрать локализованное числоNumberFormatter — формат и parse; валюта задаётся отдельно.
Выбрать доступный перевод интерфейсаLocale — теги, lookup, Accept-Language; ResourceBundle — данные ресурсов.
Написать «1 товар / 2 товара / 5 товаров»MessageFormatter — plural/select без ручных веток для всех языков.
Показать список товаров естественной фразойIntlListFormatter — соединение частей с and/or/unit по локали.
Показать дату по языку и часовому поясуIntlDateFormatter, IntlDatePatternGenerator, IntlTimeZone.
Считать календарные дни, границы месяца и переходы DSTIntlCalendar, 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 = 0ON сравнивает вторичные акценты в обратном направлении для соответствующих правил; OFF обычный порядок.
Collator::ALTERNATE_HANDLING = 1NON_IGNORABLE учитывает пунктуацию, SHIFTED переносит часть различий на более слабый уровень.
Collator::CASE_FIRST = 2UPPER_FIRST/LOWER_FIRST/OFF задают приоритет регистра, когда он учитывается.
Collator::CASE_LEVEL = 3ON добавляет отдельный уровень регистра, например вместе с PRIMARY.
Collator::NORMALIZATION_MODE = 4ON включает проверку/обработку канонической эквивалентности.
Collator::STRENGTH = 5ID атрибута силы; значения PRIMARY..IDENTICAL.
Collator::HIRAGANA_QUATERNARY_MODE = 6Исторический атрибут различения Hiragana/Katakana на четвёртом уровне; deprecated в ICU, современные правила японской сортировки задаются данными локали, не этим переключателем.
Collator::NUMERIC_COLLATION = 7ON сравнивает последовательности цифр как числа.
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 = 0DecimalFormat по собственному шаблону.
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 = 132-битное целое.
NumberFormatter::TYPE_INT64 = 264-битное целое.
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 = Nonenull: использовать текущую локаль по умолчанию.
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.

ВозможностьКак использовать
Countablecount($bundle) считает текущую ветку.
IteratorAggregateforeach обходит текущую ветку; 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/endUTF-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 = 4UTF-8.
UTF16_BigEndian = 5UTF-16, старший байт первым.
UTF16_LittleEndian = 6UTF-16, младший байт первым.
UTF32_BigEndian = 7UTF-32, старший байт первым.
UTF32_LittleEndian = 8UTF-32, младший байт первым.
EBCDIC_STATEFUL = 9EBCDIC с состоянием.
ISO_2022 = 10ISO-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 = 23HZ-кодирование.
SCSU = 24Standard Compression Scheme for Unicode.
ISCII = 25Индийские наборы ISCII.
US_ASCII = 267-битный ASCII.
UTF7 = 27UTF-7; для нового веб-контента предпочитайте UTF-8.
BOCU1 = 28Binary Ordered Compression for Unicode.
UTF16 = 29UTF-16 с определением порядка байтов.
UTF32 = 30UTF-32 с определением порядка байтов.
CESU8 = 31CESU-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-80134

Именно байтовые позиции возвращает 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 = -123456789Sentinel отсутствующего 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 = 4Unicode признак тире/дефисоподобного знака. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_DEFAULT_IGNORABLE_CODE_POINT = 5Может игнорироваться отображением; это не команда удалять знак из данных. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_DEPRECATED = 6Unicode помечает применение точки как устаревшее. 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 = 13ASCII или полноширинная hexadecimal форма; не только ASCII. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_HYPHEN = 14Историческое свойство дефисных знаков. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_ID_CONTINUE = 15Unicode правило продолжения идентификатора. 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 = 31Unicode White_Space, отличное от нескольких исторических ICU space функций. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_XID_CONTINUE = 32ID_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 = 35Sentence_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 = 42Unicode 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 = 44ICU POSIX-like буквенно-числовое свойство. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_POSIX_BLANK = 45ICU горизонтальные промежутки. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_POSIX_GRAPH = 46ICU POSIX-like графические точки. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_POSIX_PRINT = 47ICU POSIX-like печатные точки. Selector свойства, не значение результата. Getter выбирают по binary/integer/mask/string/double виду.
IntlChar::PROPERTY_POSIX_XDIGIT = 48ICU 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 = 4096Bidi категория; результаты 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 = 16397Mapping парной скобки; 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 = -1Sentinel неразрешённого property/value alias; проверяется до следующего вызова.
IntlChar::CHAR_CATEGORY_UNASSIGNED = 0Cn: не назначена. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_GENERAL_OTHER_TYPES = 0Alias Cn/UNASSIGNED, не общее объединение всех C. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_UPPERCASE_LETTER = 1Lu: прописная буква. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_LOWERCASE_LETTER = 2Ll: строчная буква. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_TITLECASE_LETTER = 3Lt: отдельная titlecase буква. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_MODIFIER_LETTER = 4Lm: модифицирующая буква. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_OTHER_LETTER = 5Lo: другая буква. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_NON_SPACING_MARK = 6Mn: mark без собственного места. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_ENCLOSING_MARK = 7Me: охватывающий mark. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_COMBINING_SPACING_MARK = 8Mc: комбинируемый spacing mark. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_DECIMAL_DIGIT_NUMBER = 9Nd: десятичная цифра. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_LETTER_NUMBER = 10Nl: буквенный числовой знак. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_OTHER_NUMBER = 11No: иной числовой знак, например дробь. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_SPACE_SEPARATOR = 12Zs: пробельный разделитель. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_LINE_SEPARATOR = 13Zl: разделитель строк. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_PARAGRAPH_SEPARATOR = 14Zp: разделитель абзацев. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_CONTROL_CHAR = 15Cc: управляющая точка. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_FORMAT_CHAR = 16Cf: форматирующая точка. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_PRIVATE_USE_CHAR = 17Co: private use. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_SURROGATE = 18Cs: surrogate, не самостоятельное scalar value UTF-8. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_DASH_PUNCTUATION = 19Pd: тире/дефисная пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_START_PUNCTUATION = 20Ps: открывающая пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_END_PUNCTUATION = 21Pe: закрывающая пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_CONNECTOR_PUNCTUATION = 22Pc: соединительная пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_OTHER_PUNCTUATION = 23Po: другая пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_MATH_SYMBOL = 24Sm: математический символ. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_CURRENCY_SYMBOL = 25Sc: валютный знак. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_MODIFIER_SYMBOL = 26Sk: модифицирующий символ. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_OTHER_SYMBOL = 27So: другой символ. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_INITIAL_PUNCTUATION = 28Pi: начальная кавычечная пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_FINAL_PUNCTUATION = 29Pf: конечная кавычечная пунктуация. Результат charType / PROPERTY_GENERAL_CATEGORY.
IntlChar::CHAR_CATEGORY_CHAR_CATEGORY_COUNT = 30Служебная верхняя граница enum, не рабочее свойство или символ. Может меняться с ICU; не передавайте её как обычный вариант.
IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT = 0L, сильное направление слева направо. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT = 1R, сильное направление справа налево. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER = 2EN, европейская числовая форма. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_SEPARATOR = 3ES, разделитель европейских чисел. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_EUROPEAN_NUMBER_TERMINATOR = 4ET, примыкающий к европейскому числу знак. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_ARABIC_NUMBER = 5AN, арабская числовая форма. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_COMMON_NUMBER_SEPARATOR = 6CS, общий числовой разделитель. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_BLOCK_SEPARATOR = 7B, разделитель абзаца. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_SEGMENT_SEPARATOR = 8S, разделитель сегмента. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_WHITE_SPACE_NEUTRAL = 9WS, нейтральный пробел. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_OTHER_NEUTRAL = 10ON, другой нейтральный знак. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_EMBEDDING = 11LRE, вложенный LTR контекст. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_OVERRIDE = 12LRO, принудительный LTR контекст. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ARABIC = 13AL, арабский strong RTL. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_EMBEDDING = 14RLE, вложенный RTL контекст. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_OVERRIDE = 15RLO, принудительный RTL контекст. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_FORMAT = 16PDF, завершение embedding/override. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_DIR_NON_SPACING_MARK = 17NSM, nonspacing mark. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_BOUNDARY_NEUTRAL = 18BN, нейтральная граница. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_FIRST_STRONG_ISOLATE = 19FSI, направление изолята по первому strong символу. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_LEFT_TO_RIGHT_ISOLATE = 20LRI, LTR изолят. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_RIGHT_TO_LEFT_ISOLATE = 21RLI, RTL изолят. Значение charDirection / PROPERTY_BIDI_CLASS.
IntlChar::CHAR_DIRECTION_POP_DIRECTIONAL_ISOLATE = 22PDI, завершение изолята. Значение 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 = 1Joining_Group «Ain»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_ALAPH = 2Joining_Group «Alaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_ALEF = 3Joining_Group «Alef»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_BEH = 4Joining_Group «Beh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_BETH = 5Joining_Group «Beth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_DAL = 6Joining_Group «Dal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_DALATH_RISH = 7Joining_Group «Dalath Rish»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_E = 8Joining_Group «E»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_FEH = 9Joining_Group «Feh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_FINAL_SEMKATH = 10Joining_Group «Final Semkath»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_GAF = 11Joining_Group «Gaf»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_GAMAL = 12Joining_Group «Gamal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_HAH = 13Joining_Group «Hah»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_TEH_MARBUTA_GOAL = 14Joining_Group «Teh Marbuta Goal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_HAMZA_ON_HEH_GOAL = 14Joining_Group «Hamza On Heh Goal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_HE = 15Joining_Group «He»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_HEH = 16Joining_Group «Heh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_HEH_GOAL = 17Joining_Group «Heh Goal»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_HETH = 18Joining_Group «Heth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_KAF = 19Joining_Group «Kaf»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_KAPH = 20Joining_Group «Kaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_KNOTTED_HEH = 21Joining_Group «Knotted Heh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_LAM = 22Joining_Group «Lam»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_LAMADH = 23Joining_Group «Lamadh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MEEM = 24Joining_Group «Meem»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MIM = 25Joining_Group «Mim»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_NOON = 26Joining_Group «Noon»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_NUN = 27Joining_Group «Nun»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_PE = 28Joining_Group «Pe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_QAF = 29Joining_Group «Qaf»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_QAPH = 30Joining_Group «Qaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_REH = 31Joining_Group «Reh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_REVERSED_PE = 32Joining_Group «Reversed Pe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_SAD = 33Joining_Group «Sad»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_SADHE = 34Joining_Group «Sadhe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_SEEN = 35Joining_Group «Seen»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_SEMKATH = 36Joining_Group «Semkath»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_SHIN = 37Joining_Group «Shin»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_SWASH_KAF = 38Joining_Group «Swash Kaf»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_SYRIAC_WAW = 39Joining_Group «Syriac Waw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_TAH = 40Joining_Group «Tah»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_TAW = 41Joining_Group «Taw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_TEH_MARBUTA = 42Joining_Group «Teh Marbuta»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_TETH = 43Joining_Group «Teth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_WAW = 44Joining_Group «Waw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_YEH = 45Joining_Group «Yeh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_YEH_BARREE = 46Joining_Group «Yeh Barree»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_YEH_WITH_TAIL = 47Joining_Group «Yeh With Tail»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_YUDH = 48Joining_Group «Yudh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_YUDH_HE = 49Joining_Group «Yudh He»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_ZAIN = 50Joining_Group «Zain»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_FE = 51Joining_Group «Fe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_KHAPH = 52Joining_Group «Khaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_ZHAIN = 53Joining_Group «Zhain»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_BURUSHASKI_YEH_BARREE = 54Joining_Group «Burushaski Yeh Barree»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_FARSI_YEH = 55Joining_Group «Farsi Yeh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_NYA = 56Joining_Group «Nya»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_ROHINGYA_YEH = 57Joining_Group «Rohingya Yeh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_ALEPH = 58Joining_Group «Manichaean Aleph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_AYIN = 59Joining_Group «Manichaean Ayin»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_BETH = 60Joining_Group «Manichaean Beth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_DALETH = 61Joining_Group «Manichaean Daleth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_DHAMEDH = 62Joining_Group «Manichaean Dhamedh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_FIVE = 63Joining_Group «Manichaean Five»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_GIMEL = 64Joining_Group «Manichaean Gimel»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_HETH = 65Joining_Group «Manichaean Heth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_HUNDRED = 66Joining_Group «Manichaean Hundred»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_KAPH = 67Joining_Group «Manichaean Kaph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_LAMEDH = 68Joining_Group «Manichaean Lamedh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_MEM = 69Joining_Group «Manichaean Mem»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_NUN = 70Joining_Group «Manichaean Nun»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_ONE = 71Joining_Group «Manichaean One»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_PE = 72Joining_Group «Manichaean Pe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_QOPH = 73Joining_Group «Manichaean Qoph»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_RESH = 74Joining_Group «Manichaean Resh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_SADHE = 75Joining_Group «Manichaean Sadhe»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_SAMEKH = 76Joining_Group «Manichaean Samekh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_TAW = 77Joining_Group «Manichaean Taw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_TEN = 78Joining_Group «Manichaean Ten»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_TETH = 79Joining_Group «Manichaean Teth»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_THAMEDH = 80Joining_Group «Manichaean Thamedh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_TWENTY = 81Joining_Group «Manichaean Twenty»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_WAW = 82Joining_Group «Manichaean Waw»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_YODH = 83Joining_Group «Manichaean Yodh»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_MANICHAEAN_ZAYIN = 84Joining_Group «Manichaean Zayin»: группа формы соединения соответствующих букв. Значение PROPERTY_JOINING_GROUP, не направление текста и не язык.
IntlChar::JG_STRAIGHT_WAW = 85Joining_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 = 2Carriage Return. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::GCB_EXTEND = 3Продолжение текущей графемы. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::GCB_L = 4Hangul L. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::GCB_LF = 5Line Feed. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::GCB_LV = 6Hangul LV. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::GCB_LVT = 7Hangul LVT. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::GCB_T = 8Hangul T. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::GCB_V = 9Hangul V. Значение PROPERTY_GRAPHEME_CLUSTER_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::GCB_SPACING_MARK = 10Spacing 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 = 8Carriage Return. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::WB_EXTEND = 9Продолжающий компонент. Значение PROPERTY_WORD_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::WB_LF = 10Line 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 = 11Carriage Return. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::SB_EXTEND = 12Продолжающий компонент. Значение PROPERTY_SENTENCE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::SB_LF = 13Line 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 = 25Surrogate диапазон; не самостоятельный UTF-8 scalar. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_SPACE = 26Пробел. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_BREAK_SYMBOLS = 27Знак, допускающий указанную границу переноса. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_ZWSPACE = 28Zero Width Space. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_NEXT_LINE = 29Next Line. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_WORD_JOINER = 30Запрет разрыва между соседями. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_H2 = 31Hangul слог LV. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_H3 = 32Hangul слог LVT. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_JL = 33Hangul leading Jamo. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_JT = 34Hangul trailing Jamo. Значение PROPERTY_LINE_BREAK, не самостоятельное правило полного алгоритма.
IntlChar::LB_JV = 35Hangul 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 = 1Turkic вариант 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 = 19Escape-последовательность 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 = 66306RegexMatcher находится в неподходящем состоянии.
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 домен → ASCIIidn_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 требует существенно больше работы, чем сравнение равенства. Ограничивайте длину и число кандидатов перед нечётким поиском.
Обход всего UnicodeIntlChar::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: классы, методы и процедурные формы

Сначала выберите класс по назначению. В таблице перечислены все собственные методы, включая фабрики и служебные операции; унаследованные методы связаны через родительский класс. Ниже отдельно перечислены все процедурные функции текущего расширения — пары методов и самостоятельные операции.

КлассВсе собственные методы
CollatorCollator::__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
NumberFormatterNumberFormatter::__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
IntlListFormatterIntlListFormatter::__construct, IntlListFormatter::format, IntlListFormatter::getErrorCode, IntlListFormatter::getErrorMessage
NormalizerNormalizer::normalize, Normalizer::isNormalized, Normalizer::getRawDecomposition
LocaleLocale::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
MessageFormatterMessageFormatter::__construct, MessageFormatter::create, MessageFormatter::format, MessageFormatter::formatMessage, MessageFormatter::parse, MessageFormatter::parseMessage, MessageFormatter::setPattern, MessageFormatter::getPattern, MessageFormatter::getLocale, MessageFormatter::getErrorCode, MessageFormatter::getErrorMessage
IntlDateFormatterIntlDateFormatter::__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
IntlDatePatternGeneratorIntlDatePatternGenerator::__construct, IntlDatePatternGenerator::create, IntlDatePatternGenerator::getBestPattern
ResourceBundleResourceBundle::__construct, ResourceBundle::create, ResourceBundle::get, ResourceBundle::count, ResourceBundle::getLocales, ResourceBundle::getErrorCode, ResourceBundle::getErrorMessage, ResourceBundle::getIterator
TransliteratorTransliterator::__construct, Transliterator::create, Transliterator::createFromRules, Transliterator::createInverse, Transliterator::listIDs, Transliterator::transliterate, Transliterator::getErrorCode, Transliterator::getErrorMessage
IntlTimeZoneIntlTimeZone::__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
IntlCalendarIntlCalendar::__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
IntlGregorianCalendarIntlGregorianCalendar::createFromDate, IntlGregorianCalendar::createFromDateTime, IntlGregorianCalendar::__construct, IntlGregorianCalendar::setGregorianChange, IntlGregorianCalendar::getGregorianChange, IntlGregorianCalendar::isLeapYear
SpoofcheckerSpoofchecker::__construct, Spoofchecker::isSuspicious, Spoofchecker::areConfusable, Spoofchecker::setAllowedLocales, Spoofchecker::setChecks, Spoofchecker::setRestrictionLevel, Spoofchecker::setAllowedChars
IntlExceptionУнаследованные методы описаны в карточке класса.
IntlIteratorIntlIterator::current, IntlIterator::key, IntlIterator::next, IntlIterator::rewind, IntlIterator::valid
IntlBreakIteratorIntlBreakIterator::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
IntlRuleBasedBreakIteratorIntlRuleBasedBreakIterator::__construct, IntlRuleBasedBreakIterator::getBinaryRules, IntlRuleBasedBreakIterator::getRules, IntlRuleBasedBreakIterator::getRuleStatus, IntlRuleBasedBreakIterator::getRuleStatusVec
IntlCodePointBreakIteratorIntlCodePointBreakIterator::getLastCodePoint
IntlPartsIteratorIntlPartsIterator::getBreakIterator, IntlPartsIterator::getRuleStatus
UConverterUConverter::__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
IntlCharIntlChar::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
Группа функцийОперации
collator_collator_create, collator_compare, collator_get_attribute, collator_set_attribute, collator_get_strength, collator_set_strength, collator_sort, collator_sort_with_sort_keys, collator_asort, collator_get_locale, collator_get_error_code, collator_get_error_message, collator_get_sort_key
numfmt_numfmt_create, numfmt_format, numfmt_parse, numfmt_format_currency, numfmt_parse_currency, numfmt_set_attribute, numfmt_get_attribute, numfmt_set_text_attribute, numfmt_get_text_attribute, numfmt_set_symbol, numfmt_get_symbol, numfmt_set_pattern, numfmt_get_pattern, numfmt_get_locale, numfmt_get_error_code, numfmt_get_error_message
normalizer_normalizer_normalize, normalizer_is_normalized, normalizer_get_raw_decomposition
locale_locale_get_default, locale_set_default, locale_get_primary_language, locale_get_script, locale_get_region, locale_get_keywords, locale_get_display_script, locale_get_display_region, locale_get_display_name, locale_get_display_language, locale_get_display_variant, locale_compose, locale_parse, locale_get_all_variants, locale_filter_matches, locale_canonicalize, locale_lookup, locale_accept_from_http, locale_is_right_to_left, locale_add_likely_subtags, locale_minimize_subtags
msgfmt_msgfmt_create, msgfmt_format, msgfmt_format_message, msgfmt_parse, msgfmt_parse_message, msgfmt_set_pattern, msgfmt_get_pattern, msgfmt_get_locale, msgfmt_get_error_code, msgfmt_get_error_message
datefmt_datefmt_create, datefmt_get_datetype, datefmt_get_timetype, datefmt_get_calendar, datefmt_set_calendar, datefmt_get_timezone_id, datefmt_get_calendar_object, datefmt_get_timezone, datefmt_set_timezone, datefmt_set_pattern, datefmt_get_pattern, datefmt_get_locale, datefmt_set_lenient, datefmt_is_lenient, datefmt_format, datefmt_format_object, datefmt_parse, datefmt_localtime, datefmt_get_error_code, datefmt_get_error_message
resourcebundle_resourcebundle_create, resourcebundle_get, resourcebundle_count, resourcebundle_locales, resourcebundle_get_error_code, resourcebundle_get_error_message
transliterator_transliterator_create, transliterator_create_from_rules, transliterator_list_ids, transliterator_create_inverse, transliterator_transliterate, transliterator_get_error_code, transliterator_get_error_message
grapheme_grapheme_strlen, grapheme_strpos, grapheme_stripos, grapheme_strrpos, grapheme_strripos, grapheme_substr, grapheme_strstr, grapheme_stristr, grapheme_str_split, grapheme_levenshtein, grapheme_extract
idn_idn_to_ascii, idn_to_utf8
intlcal_intlcal_create_instance, intlcal_get_keyword_values_for_locale, intlcal_get_now, intlcal_get_available_locales, intlcal_get, intlcal_get_time, intlcal_set_time, intlcal_add, intlcal_set_time_zone, intlcal_after, intlcal_before, intlcal_set, intlcal_roll, intlcal_clear, intlcal_field_difference, intlcal_get_actual_maximum, intlcal_get_actual_minimum, intlcal_get_day_of_week_type, intlcal_get_first_day_of_week, intlcal_get_least_maximum, intlcal_get_greatest_minimum, intlcal_get_locale, intlcal_get_maximum, intlcal_get_minimal_days_in_first_week, intlcal_set_minimal_days_in_first_week, intlcal_get_minimum, intlcal_get_time_zone, intlcal_get_type, intlcal_get_weekend_transition, intlcal_in_daylight_time, intlcal_is_lenient, intlcal_is_set, intlcal_is_equivalent_to, intlcal_is_weekend, intlcal_set_first_day_of_week, intlcal_set_lenient, intlcal_get_repeated_wall_time_option, intlcal_equals, intlcal_get_skipped_wall_time_option, intlcal_set_repeated_wall_time_option, intlcal_set_skipped_wall_time_option, intlcal_from_date_time, intlcal_to_date_time, intlcal_get_error_code, intlcal_get_error_message
intlgregcal_intlgregcal_create_instance, intlgregcal_set_gregorian_change, intlgregcal_get_gregorian_change, intlgregcal_is_leap_year
intltz_intltz_count_equivalent_ids, intltz_create_default, intltz_create_enumeration, intltz_create_time_zone, intltz_create_time_zone_id_enumeration, intltz_from_date_time_zone, intltz_get_canonical_id, intltz_get_display_name, intltz_get_dst_savings, intltz_get_equivalent_id, intltz_get_error_code, intltz_get_error_message, intltz_get_gmt, intltz_get_id, intltz_get_offset, intltz_get_raw_offset, intltz_get_region, intltz_get_tz_data_version, intltz_get_unknown, intltz_get_windows_id, intltz_get_id_for_windows_id, intltz_has_same_rules, intltz_to_date_time_zone, intltz_use_daylight_time, intltz_get_iana_id
intl_intl_get_error_code, intl_get_error_message, intl_is_failure, intl_error_name

Функции и методы этой темы

Откройте карточку, чтобы увидеть договор функции, примеры, ограничения и связанные инструменты.

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)Склеивает готовый список в видимую строку; стрелки здесь только разделители показа.
Шаг 1. Увидеть порядок каталогаСамостоятельный пример
<?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 или карточках товаров.

Шаг 2. Языковые правила отличаютсяСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Склеивает готовый список в видимую строку; стрелки здесь только разделители показа.
Шаг 1. Увидеть порядок каталогаСамостоятельный пример
<?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 или карточках товаров.

Шаг 2. Языковые правила отличаютсяСамостоятельный пример
<?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.

Дополнительные варианты и диагностика

Получить Collator фабрикойСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Склеивает готовый список в видимую строку; стрелки здесь только разделители показа.
Шаг 1. Увидеть порядок каталогаСамостоятельный пример
<?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 или карточках товаров.

Шаг 2. Языковые правила отличаютсяСамостоятельный пример
<?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.

Дополнительные варианты и диагностика

Получить Collator фабрикойСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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Отдельный отказ операции; перед обработкой внешнего текста его нужно отделить от нуля.
Шаг 1. Решить, какое название показать первымСамостоятельный пример
<?php
declare(strict_types=1);

$collator = new Collator("en_US");
$order = $collator->compare("Apple", "Banana");
if ($order < 0) { echo "Сначала Apple, затем Banana.
"; }
Ожидаемый результат
Сначала Apple, затем Banana.

Метод не меняет строки, он сообщает отношение между ними.

Шаг 2. Поиск названия без регистра и акцентаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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Отдельный отказ операции; перед обработкой внешнего текста его нужно отделить от нуля.
Шаг 1. Решить, какое название показать первымСамостоятельный пример
<?php
declare(strict_types=1);

$collator = new Collator("en_US");
$order = $collator->compare("Apple", "Banana");
if ($order < 0) { echo "Сначала Apple, затем Banana.
"; }
Ожидаемый результат
Сначала Apple, затем Banana.

Метод не меняет строки, он сообщает отношение между ними.

Шаг 2. Поиск названия без регистра и акцентаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

Collator::sortУпорядочить список для интерфейса по языковому порядку.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

Collator::sort(array &$array, int $flags = Collator::SORT_REGULAR): bool
Аргумент или результатЧто означает на практике
arrayМассив передаётся по ссылке и меняется на месте. sort сбрасывает числовые/строковые ключи и переиндексирует список; asort сохраняет связь ключа с названием.
flagsflags: SORT_REGULAR(default) учитывает типы как обычное сравнение, SORT_STRING трактует значения строками, SORT_NUMERIC числами; для однородного списка названий явно SORT_STRING.
Возвратbool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов.

Начинаем с задачи и одного вызова

Нужно вывести список товаров по алфавиту. Получим конкретный порядок, который увидит покупатель.

Запись в примереЧто именно происходит
$names / $productsИсходный массив. Операция меняет его на месте.
sort / sortWithSortKeysПереиндексируют список с нуля; прежние ID нельзя считать сохранёнными.
asortСохраняет связь ключ → значение; подходит, когда ключ является ID товара.
Возвращаемый boolСообщает успех; список находится в переданном массиве, а не в этом bool.
Шаг 1. Список до и послеСамостоятельный пример
<?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

Строки не потеряны и не переведены: изменился только порядок вывода.

Шаг 2. Проверить, куда ведут IDСамостоятельный пример
<?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, иначе ссылка может открыть чужой товар.

Шаг 3. Номера полок внутри названийСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сохраняет связь ключа с названием.
flagsflags: SORT_REGULAR(default) учитывает типы как обычное сравнение, SORT_STRING трактует значения строками, SORT_NUMERIC числами; для однородного списка названий явно SORT_STRING.
Возвратbool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов.

Начинаем с задачи и одного вызова

Нужно вывести список товаров по алфавиту. Получим конкретный порядок, который увидит покупатель.

Запись в примереЧто именно происходит
$names / $productsИсходный массив. Операция меняет его на месте.
sort / sortWithSortKeysПереиндексируют список с нуля; прежние ID нельзя считать сохранёнными.
asortСохраняет связь ключ → значение; подходит, когда ключ является ID товара.
Возвращаемый boolСообщает успех; список находится в переданном массиве, а не в этом bool.
Шаг 1. Список до и послеСамостоятельный пример
<?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

Строки не потеряны и не переведены: изменился только порядок вывода.

Шаг 2. Проверить, куда ведут IDСамостоятельный пример
<?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, иначе ссылка может открыть чужой товар.

Шаг 3. Номера полок внутри названийСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сохраняет связь ключа с названием.
flagsflags: SORT_REGULAR(default) учитывает типы как обычное сравнение, SORT_STRING трактует значения строками, SORT_NUMERIC числами; для однородного списка названий явно SORT_STRING.
Возвратbool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов.

Начинаем с задачи и одного вызова

Нужно вывести список товаров по алфавиту и сохранить ID, по которым строятся ссылки на карточки.

Запись в примереЧто именно происходит
$names / $productsИсходный массив. Операция меняет его на месте.
sort / sortWithSortKeysПереиндексируют список с нуля; прежние ID нельзя считать сохранёнными.
asortСохраняет связь ключ → значение; подходит, когда ключ является ID товара.
Возвращаемый boolСообщает успех; список находится в переданном массиве, а не в этом bool.
Шаг 1. Список до и послеСамостоятельный пример
<?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

Строки не потеряны и не переведены: изменился только порядок вывода.

Шаг 2. Проверить, куда ведут IDСамостоятельный пример
<?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: сортировка не ломает ссылки на товары.

Шаг 3. Номера полок внутри названийСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сохраняет связь ключа с названием.
flagsflags: SORT_REGULAR(default) учитывает типы как обычное сравнение, SORT_STRING трактует значения строками, SORT_NUMERIC числами; для однородного списка названий явно SORT_STRING.
Возвратbool успеха; это не отсортированный массив. При смешении значений заранее выберите тип/нормализацию и не выдавайте языковое сравнение за произвольную сортировку объектов.

Начинаем с задачи и одного вызова

Нужно вывести список товаров по алфавиту и сохранить ID, по которым строятся ссылки на карточки.

Запись в примереЧто именно происходит
$names / $productsИсходный массив. Операция меняет его на месте.
sort / sortWithSortKeysПереиндексируют список с нуля; прежние ID нельзя считать сохранёнными.
asortСохраняет связь ключ → значение; подходит, когда ключ является ID товара.
Возвращаемый boolСообщает успех; список находится в переданном массиве, а не в этом bool.
Шаг 1. Список до и послеСамостоятельный пример
<?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

Строки не потеряны и не переведены: изменился только порядок вывода.

Шаг 2. Проверить, куда ведут IDСамостоятельный пример
<?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: сортировка не ломает ссылки на товары.

Шаг 3. Номера полок внутри названийСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Шаг 1. Список до и послеСамостоятельный пример
<?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

Строки не потеряны и не переведены: изменился только порядок вывода.

Шаг 2. Проверить, куда ведут IDСамостоятельный пример
<?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, иначе ссылка может открыть чужой товар.

Шаг 3. Номера полок внутри названийСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Шаг 1. Список до и послеСамостоятельный пример
<?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

Строки не потеряны и не переведены: изменился только порядок вывода.

Шаг 2. Проверить, куда ведут IDСамостоятельный пример
<?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, иначе ссылка может открыть чужой товар.

Шаг 3. Номера полок внутри названийСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

Collator::getSortKeyЗаранее получить двоичный ключ для многократного сравнения тех же названий.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

Collator::getSortKey(string $string): string|false
Аргумент или результатЧто означает на практике
stringUTF-8 строка и текущие правила Collator. Ключ может содержать нулевые/непечатные байты, поэтому это не текст для вывода.
Возвратstring|false. Ключи сравнивают бинарно; совместимы только при одинаковой локали, настройках и версии ICU. Не сохраняйте их навсегда без версии и плана перестроения.

Начинаем с задачи и одного вызова

При многократном сравнении одних названий можно заранее получить их двоичное представление для сортировки. Покупателю всё равно показывают исходные названия; ключ нужен только программе.

Запись в примереЧто именно происходит
$key = $collator->getSortKey($name)Возвращает бинарную строку, кодирующую порядок при текущей locale и настройках.
strcmp($leftKey, $rightKey)Бинарно сравнивает уже подготовленные ключи. Для исходных названий нужен compare.
Срок жизни ключаПри смене ICU, locale или strength ключи надо пересоздать; смешивать несовместимые наборы нельзя.
Шаг 1. От двух ключей к понятному порядкуСамостоятельный пример
<?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

Не печатаем бинарные байты как текст: полезный результат — установленный порядок названий.

Шаг 2. Сопоставить заранее подготовленное имяСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
stringUTF-8 строка и текущие правила Collator. Ключ может содержать нулевые/непечатные байты, поэтому это не текст для вывода.
Возвратstring|false. Ключи сравнивают бинарно; совместимы только при одинаковой локали, настройках и версии ICU. Не сохраняйте их навсегда без версии и плана перестроения.

Начинаем с задачи и одного вызова

При многократном сравнении одних названий можно заранее получить их двоичное представление для сортировки. Покупателю всё равно показывают исходные названия; ключ нужен только программе.

Запись в примереЧто именно происходит
$key = $collator->getSortKey($name)Возвращает бинарную строку, кодирующую порядок при текущей locale и настройках.
strcmp($leftKey, $rightKey)Бинарно сравнивает уже подготовленные ключи. Для исходных названий нужен compare.
Срок жизни ключаПри смене ICU, locale или strength ключи надо пересоздать; смешивать несовместимые наборы нельзя.
Шаг 1. От двух ключей к понятному порядкуСамостоятельный пример
<?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

Не печатаем бинарные байты как текст: полезный результат — установленный порядок названий.

Шаг 2. Сопоставить заранее подготовленное имяСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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; настройка меняет только сравнение.
Шаг 1. Найти название по упрощённому запросуСамостоятельный пример
<?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é

Пользователь получил нужное название, хотя не ввёл акцент и другой регистр.

Шаг 2. Проверить и сменить режимСамостоятельный пример
<?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.

PRIMARY для поиска названияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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; настройка меняет только сравнение.
Шаг 1. Найти название по упрощённому запросуСамостоятельный пример
<?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é

Пользователь получил нужное название, хотя не ввёл акцент и другой регистр.

Шаг 2. Проверить и сменить режимСамостоятельный пример
<?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.

PRIMARY для поиска названияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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; настройка меняет только сравнение.
Шаг 1. Найти название по упрощённому запросуСамостоятельный пример
<?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é

Пользователь получил нужное название, хотя не ввёл акцент и другой регистр.

Шаг 2. Проверить и сменить режимСамостоятельный пример
<?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.

PRIMARY для поиска названияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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; настройка меняет только сравнение.
Шаг 1. Найти название по упрощённому запросуСамостоятельный пример
<?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é

Пользователь получил нужное название, хотя не ввёл акцент и другой регистр.

Шаг 2. Проверить и сменить режимСамостоятельный пример
<?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.

PRIMARY для поиска названияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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(...)Читает действующую настройку, чтобы связать профиль с результатом списка.
Шаг 1. Видимый порядок номеровСамостоятельный пример
<?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

Строковый префикс сохранился; числа сравнились по величине.

Шаг 2. Объяснить разницу настроекСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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(...)Читает действующую настройку, чтобы связать профиль с результатом списка.
Шаг 1. Видимый порядок номеровСамостоятельный пример
<?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

Строковый префикс сохранился; числа сравнились по величине.

Шаг 2. Объяснить разницу настроекСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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(...)Читает действующую настройку, чтобы связать профиль с результатом списка.
Шаг 1. Видимый порядок номеровСамостоятельный пример
<?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

Строковый префикс сохранился; числа сравнились по величине.

Шаг 2. Объяснить разницу настроекСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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(...)Читает действующую настройку, чтобы связать профиль с результатом списка.
Шаг 1. Видимый порядок номеровСамостоятельный пример
<?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

Строковый префикс сохранился; числа сравнились по величине.

Шаг 2. Объяснить разницу настроекСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

Collator::getLocaleУзнать, какие данные локали ICU реально использовал после fallback.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

Collator::getLocale(int $type): string|false
Аргумент или результатЧто означает на практике
typeLocale::VALID_LOCALE — подходящая доступная локаль; Locale::ACTUAL_LOCALE — локаль конкретных использованных данных. Может отличаться от запрошенной, поскольку правила наследуются.
Возвратstring|false. Это диагностика fallback, а не способ узнать язык текста или заголовок Accept-Language.

Начинаем с задачи и одного вызова

При неожиданном порядке букв разработчик должен сопоставить запрошенный язык и фактические данные ICU. Проверка locale помогает воспроизвести проблему, но сама список не сортирует.

Запись в примереЧто именно происходит
VALID_LOCALEПоддержанная локаль, найденная для запроса.
ACTUAL_LOCALEЛокаль реально использованных данных; общие правила могут прийти из root.
Порядок рядом с IDДиагностика полезна, когда видно и профиль, и конкретный список, а не только слово ready.
Шаг 1. Шведские правила и результатСамостоятельный пример
<?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, а не потеря сортировки.

Шаг 2. Сохранить запрос отдельноСамостоятельный пример
<?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; в интерфейсе ориентируйтесь на свой список поддерживаемых языков.

Прочитать actual localeСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
typeLocale::VALID_LOCALE — подходящая доступная локаль; Locale::ACTUAL_LOCALE — локаль конкретных использованных данных. Может отличаться от запрошенной, поскольку правила наследуются.
Возвратstring|false. Это диагностика fallback, а не способ узнать язык текста или заголовок Accept-Language.

Начинаем с задачи и одного вызова

При неожиданном порядке букв разработчик должен сопоставить запрошенный язык и фактические данные ICU. Проверка locale помогает воспроизвести проблему, но сама список не сортирует.

Запись в примереЧто именно происходит
VALID_LOCALEПоддержанная локаль, найденная для запроса.
ACTUAL_LOCALEЛокаль реально использованных данных; общие правила могут прийти из root.
Порядок рядом с IDДиагностика полезна, когда видно и профиль, и конкретный список, а не только слово ready.
Шаг 1. Шведские правила и результатСамостоятельный пример
<?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, а не потеря сортировки.

Шаг 2. Сохранить запрос отдельноСамостоятельный пример
<?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; в интерфейсе ориентируйтесь на свой список поддерживаемых языков.

Прочитать actual localeСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Статус импортаВместо публикации повреждённого названия предлагаем исправить исходную кодировку.
Шаг 1. Не принять повреждённое имяСамостоятельный пример
<?php
declare(strict_types=1);

$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
if ($order === false) {
    echo "Каталог не отсортирован: исправьте кодировку названия.
";
}
Ожидаемый результат
Каталог не отсортирован: исправьте кодировку названия.

Результат false отделён от нуля и отрицательного порядка. Предыдущий корректный каталог можно оставить доступным до исправления импорта.

Шаг 2. Сохранить техническую причинуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Статус импортаВместо публикации повреждённого названия предлагаем исправить исходную кодировку.
Шаг 1. Не принять повреждённое имяСамостоятельный пример
<?php
declare(strict_types=1);

$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
if ($order === false) {
    echo "Каталог не отсортирован: исправьте кодировку названия.
";
}
Ожидаемый результат
Каталог не отсортирован: исправьте кодировку названия.

Результат false отделён от нуля и отрицательного порядка. Предыдущий корректный каталог можно оставить доступным до исправления импорта.

Шаг 2. Сохранить техническую причинуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Статус импортаВместо публикации повреждённого названия предлагаем исправить исходную кодировку.
Шаг 1. Не принять повреждённое имяСамостоятельный пример
<?php
declare(strict_types=1);

$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
if ($order === false) {
    echo "Каталог не отсортирован: исправьте кодировку названия.
";
}
Ожидаемый результат
Каталог не отсортирован: исправьте кодировку названия.

Результат false отделён от нуля и отрицательного порядка. Предыдущий корректный каталог можно оставить доступным до исправления импорта.

Шаг 2. Сохранить техническую причинуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Статус импортаВместо публикации повреждённого названия предлагаем исправить исходную кодировку.
Шаг 1. Не принять повреждённое имяСамостоятельный пример
<?php
declare(strict_types=1);

$collator = new Collator("en_US");
$order = $collator->compare("\xFF", "Apple");
if ($order === false) {
    echo "Каталог не отсортирован: исправьте кодировку названия.
";
}
Ожидаемый результат
Каталог не отсортирован: исправьте кодировку названия.

Результат false отделён от нуля и отрицательного порядка. Предыдущий корректный каталог можно оставить доступным до исправления импорта.

Шаг 2. Сохранить техническую причинуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,patternDECIMAL, 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 делает её видимой.
Шаг 1. Подготовить правила и показать одно числоСамостоятельный пример
<?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. Её можно поставить рядом с подписью количества или суммы в шаблоне страницы.

Шаг 2. Один инструмент для нескольких строк каталогаСамостоятельный пример
<?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

Объект создаётся один раз. Каждый вызов получает новое число, а правила остаются одинаковыми: каталог оформлен согласованно.

Шаг 3. Те же данные для другого читателяСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,patternDECIMAL, 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 делает её видимой.
Шаг 1. Подготовить правила и показать одно числоСамостоятельный пример
<?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. Её можно поставить рядом с подписью количества или суммы в шаблоне страницы.

Шаг 2. Один инструмент для нескольких строк каталогаСамостоятельный пример
<?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

Объект создаётся один раз. Каждый вызов получает новое число, а правила остаются одинаковыми: каталог оформлен согласованно.

Шаг 3. Те же данные для другого читателяСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,patternDECIMAL, 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 делает её видимой.
Шаг 1. Подготовить правила и показать одно числоСамостоятельный пример
<?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. Её можно поставить рядом с подписью количества или суммы в шаблоне страницы.

Шаг 2. Один инструмент для нескольких строк каталогаСамостоятельный пример
<?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

Объект создаётся один раз. Каждый вызов получает новое число, а правила остаются одинаковыми: каталог оформлен согласованно.

Шаг 3. Те же данные для другого читателяСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

NumberFormatter::formatПолучить строку для пользователя, сохранив число для вычислений отдельно.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

NumberFormatter::format(int|float $num, int $type = NumberFormatter::TYPE_DEFAULT): string|false
Аргумент или результатЧто означает на практике
numint|float; с strict_types передавайте именно числовой тип. Форматированная строка предназначена для отображения, не для SQL/API-числа.
typeTYPE_DEFAULT выбирает по значению, либо TYPE_INT32/INT64/DOUBLE. TYPE_CURRENCY здесь не поддержан: нужен formatCurrency.
Возвратstring либо false. Округление задаётся стилем/атрибутами; это не исправление точности двоичного float.

Начинаем с задачи и одного вызова

Значение для расчёта и надпись на странице — разные данные. Метод format превращает уже имеющееся число в строку для человека.

Запись в примереЧто именно происходит
$amount = 1234.5;Число остаётся доступно арифметике.
$text = $formatter->format($amount);Метод возвращает строку в text; сам ничего не выводит.
echo "Сумма: ", $text;Подставляем подготовленную строку в понятную подпись.
Шаг 1. От числа к подписиСамостоятельный пример
<?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, а не строку с разделителями.

Шаг 2. Сначала вычислить, потом оформитьСамостоятельный пример
<?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 превращён в надпись карточки заказа.

Шаг 3. Показать долю выполненной работыСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
numint|float; с strict_types передавайте именно числовой тип. Форматированная строка предназначена для отображения, не для SQL/API-числа.
typeTYPE_DEFAULT выбирает по значению, либо TYPE_INT32/INT64/DOUBLE. TYPE_CURRENCY здесь не поддержан: нужен formatCurrency.
Возвратstring либо false. Округление задаётся стилем/атрибутами; это не исправление точности двоичного float.

Начинаем с задачи и одного вызова

Значение для расчёта и надпись на странице — разные данные. Метод format превращает уже имеющееся число в строку для человека.

Запись в примереЧто именно происходит
$amount = 1234.5;Число остаётся доступно арифметике.
$text = $formatter->format($amount);Метод возвращает строку в text; сам ничего не выводит.
echo "Сумма: ", $text;Подставляем подготовленную строку в понятную подпись.
Шаг 1. От числа к подписиСамостоятельный пример
<?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, а не строку с разделителями.

Шаг 2. Сначала вычислить, потом оформитьСамостоятельный пример
<?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 превращён в надпись карточки заказа.

Шаг 3. Показать долю выполненной работыСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 в разных странах означает разные значения.
typeTYPE_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Выходная переменная по ссылке показывает, до какого места парсер дошёл. Для строгого поля нужен весь ввод, не только начало.
Шаг 1. Прочитать известную дробьСамостоятельный пример
<?php
declare(strict_types=1);

$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$width = $formatter->parse("12,5");
echo "Ширина для вычислений: ", $width, "
";
Ожидаемый результат
Ширина для вычислений: 12.5

Заранее корректное учебное значение становится числом. Следующий шаг показывает, как обращаться с полем, которое пользователь действительно может испортить.

Шаг 2. Проверить и использовать значениеСамостоятельный пример
<?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. После проверки число идёт в расчёт, затем результат снова оформляется для читателя.

Шаг 3. Не принять единицы измерения в числовом полеСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 в разных странах означает разные значения.
typeTYPE_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Выходная переменная по ссылке показывает, до какого места парсер дошёл. Для строгого поля нужен весь ввод, не только начало.
Шаг 1. Прочитать известную дробьСамостоятельный пример
<?php
declare(strict_types=1);

$formatter = new NumberFormatter("de_DE", NumberFormatter::DECIMAL);
$width = $formatter->parse("12,5");
echo "Ширина для вычислений: ", $width, "
";
Ожидаемый результат
Ширина для вычислений: 12.5

Заранее корректное учебное значение становится числом. Следующий шаг показывает, как обращаться с полем, которое пользователь действительно может испортить.

Шаг 2. Проверить и использовать значениеСамостоятельный пример
<?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. После проверки число идёт в расчёт, затем результат снова оформляется для читателя.

Шаг 3. Не принять единицы измерения в числовом полеСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Возвращает готовую строку; её используем только на границе интерфейса.
Шаг 1. Одна цена с валютойСамостоятельный пример
<?php
declare(strict_types=1);

$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
echo "Цена: ", $formatter->formatCurrency(12.5, "USD"), "
";
Ожидаемый результат
Цена: $12.50

Два дробных знака относятся к выбранному валютному представлению, а не меняют число 12.5.

Шаг 2. Сумма заказа из целых центовСамостоятельный пример
<?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".

Шаг 3. Валюта не определяется языкомСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Возвращает готовую строку; её используем только на границе интерфейса.
Шаг 1. Одна цена с валютойСамостоятельный пример
<?php
declare(strict_types=1);

$formatter = new NumberFormatter("en_US", NumberFormatter::CURRENCY);
echo "Цена: ", $formatter->formatCurrency(12.5, "USD"), "
";
Ожидаемый результат
Цена: $12.50

Два дробных знака относятся к выбранному валютному представлению, а не меняют число 12.5.

Шаг 2. Сумма заказа из целых центовСамостоятельный пример
<?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".

Шаг 3. Валюта не определяется языкомСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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"Наше правило импорта; парсер сам не знает валюту целевого счёта.
Шаг 1. Разделить сумму и валютуСамостоятельный пример
<?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.

Шаг 2. Принять запись только в валюте счётаСамостоятельный пример
<?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/минимальной единицы.

Шаг 3. Не перепутать одинаковые числа в разных валютахСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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"Наше правило импорта; парсер сам не знает валюту целевого счёта.
Шаг 1. Разделить сумму и валютуСамостоятельный пример
<?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.

Шаг 2. Принять запись только в валюте счётаСамостоятельный пример
<?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/минимальной единицы.

Шаг 3. Не перепутать одинаковые числа в разных валютахСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

NumberFormatter::setAttributeНастроить количество знаков, группировку или округление под договор отчёта.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

NumberFormatter::setAttribute(int $attribute, int|float $value): bool
Аргумент или результатЧто означает на практике
attributeID числового атрибута: 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 проверяют строго.
Шаг 1. Задать и прочитать два разрядаСамостоятельный пример
<?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. Данные веса остаются числом.

Шаг 2. Одинаковое оформление всей таблицыСамостоятельный пример
<?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 кг

Один профиль оформления применяется ко всем строкам. Если нужен иной профиль соседнего отчёта, создайте отдельный форматтер, чтобы не менять этот незаметно.

Шаг 3. Сделать округление отчёта явнымСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
attributeID числового атрибута: 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 проверяют строго.
Шаг 1. Задать и прочитать два разрядаСамостоятельный пример
<?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. Данные веса остаются числом.

Шаг 2. Одинаковое оформление всей таблицыСамостоятельный пример
<?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 кг

Один профиль оформления применяется ко всем строкам. Если нужен иной профиль соседнего отчёта, создайте отдельный форматтер, чтобы не менять этот незаметно.

Шаг 3. Сделать округление отчёта явнымСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

NumberFormatter::getAttributeНастроить количество знаков, группировку или округление под договор отчёта.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

NumberFormatter::getAttribute(int $attribute): int|float|false
Аргумент или результатЧто означает на практике
attributeID числового атрибута: 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 проверяют строго.
Шаг 1. Задать и прочитать два разрядаСамостоятельный пример
<?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. Данные веса остаются числом.

Шаг 2. Одинаковое оформление всей таблицыСамостоятельный пример
<?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 кг

Один профиль оформления применяется ко всем строкам. Если нужен иной профиль соседнего отчёта, создайте отдельный форматтер, чтобы не менять этот незаметно.

Шаг 3. Сделать округление отчёта явнымСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

numfmt_get_attributeНастроить количество знаков, группировку или округление под договор отчёта.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

numfmt_get_attribute(NumberFormatter $formatter, int $attribute): int|float|false

Процедурная форма NumberFormatter::getAttribute. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
attributeID числового атрибута: 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 проверяют строго.
Шаг 1. Задать и прочитать два разрядаСамостоятельный пример
<?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. Данные веса остаются числом.

Шаг 2. Одинаковое оформление всей таблицыСамостоятельный пример
<?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 кг

Один профиль оформления применяется ко всем строкам. Если нужен иной профиль соседнего отчёта, создайте отдельный форматтер, чтобы не менять этот незаметно.

Шаг 3. Сделать округление отчёта явнымСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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(...)Читает текст настройки, чтобы проверить профиль отчёта.
Шаг 1. Добавить единицуСамостоятельный пример
<?php
declare(strict_types=1);

$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Масса: ", $formatter->format(12.5), "
";
Ожидаемый результат
Масса: 12.5 кг

Строка для интерфейса уже содержит единицу; исходное число по-прежнему не содержит букв.

Шаг 2. Прочитать профиль и применить повторноСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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(...)Читает текст настройки, чтобы проверить профиль отчёта.
Шаг 1. Добавить единицуСамостоятельный пример
<?php
declare(strict_types=1);

$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Масса: ", $formatter->format(12.5), "
";
Ожидаемый результат
Масса: 12.5 кг

Строка для интерфейса уже содержит единицу; исходное число по-прежнему не содержит букв.

Шаг 2. Прочитать профиль и применить повторноСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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(...)Читает текст настройки, чтобы проверить профиль отчёта.
Шаг 1. Добавить единицуСамостоятельный пример
<?php
declare(strict_types=1);

$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Масса: ", $formatter->format(12.5), "
";
Ожидаемый результат
Масса: 12.5 кг

Строка для интерфейса уже содержит единицу; исходное число по-прежнему не содержит букв.

Шаг 2. Прочитать профиль и применить повторноСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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(...)Читает текст настройки, чтобы проверить профиль отчёта.
Шаг 1. Добавить единицуСамостоятельный пример
<?php
declare(strict_types=1);

$formatter = new NumberFormatter("en_US", NumberFormatter::DECIMAL);
$formatter->setTextAttribute(NumberFormatter::POSITIVE_SUFFIX, " кг");
echo "Масса: ", $formatter->format(12.5), "
";
Ожидаемый результат
Масса: 12.5 кг

Строка для интерфейса уже содержит единицу; исходное число по-прежнему не содержит букв.

Шаг 2. Прочитать профиль и применить повторноСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

NumberFormatter::setSymbolУправлять конкретным знаком представления числа для специального отчёта.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

NumberFormatter::setSymbol(int $symbol, string $value): bool
Аргумент или результатЧто означает на практике
symbol,valueID из *_SYMBOL, например DECIMAL_SEPARATOR_SYMBOL; setter получает строку. Это текст знака, а не стиль форматирования.
Возвратsetter bool, getter string|false. Rule-based не поддерживаются. Обычному интерфейсу чаще нужны символы из locale без ручной подмены.

Начинаем с задачи и одного вызова

Человек не знает, какой разделитель вводить в числовое поле. Getter поможет показать подсказку из правил выбранной локали; setter нужен только для явно нестандартного оформления отчёта.

Запись в примереЧто именно происходит
DECIMAL_SEPARATOR_SYMBOLИдентификатор знака между целой и дробной частью.
getSymbol(...)Возвращает сам знак, например запятую.
GROUPING_SEPARATOR_SYMBOLДругая настройка: разделитель групп тысяч, он не равен десятичному.
Шаг 1. Подсказка рядом с полемСамостоятельный пример
<?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

Подсказка и пример взяты из одного форматтера, поэтому не противоречат друг другу.

Шаг 2. Специальный формат технического отчётаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,valueID из *_SYMBOL, например DECIMAL_SEPARATOR_SYMBOL; setter получает строку. Это текст знака, а не стиль форматирования.
Возвратsetter bool, getter string|false. Rule-based не поддерживаются. Обычному интерфейсу чаще нужны символы из locale без ручной подмены.

Начинаем с задачи и одного вызова

Человек не знает, какой разделитель вводить в числовое поле. Getter поможет показать подсказку из правил выбранной локали; setter нужен только для явно нестандартного оформления отчёта.

Запись в примереЧто именно происходит
DECIMAL_SEPARATOR_SYMBOLИдентификатор знака между целой и дробной частью.
getSymbol(...)Возвращает сам знак, например запятую.
GROUPING_SEPARATOR_SYMBOLДругая настройка: разделитель групп тысяч, он не равен десятичному.
Шаг 1. Подсказка рядом с полемСамостоятельный пример
<?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

Подсказка и пример взяты из одного форматтера, поэтому не противоречат друг другу.

Шаг 2. Специальный формат технического отчётаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

NumberFormatter::getSymbolУправлять конкретным знаком представления числа для специального отчёта.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

NumberFormatter::getSymbol(int $symbol): string|false
Аргумент или результатЧто означает на практике
symbol,valueID из *_SYMBOL, например DECIMAL_SEPARATOR_SYMBOL; setter получает строку. Это текст знака, а не стиль форматирования.
Возвратsetter bool, getter string|false. Rule-based не поддерживаются. Обычному интерфейсу чаще нужны символы из locale без ручной подмены.

Начинаем с задачи и одного вызова

Человек не знает, какой разделитель вводить в числовое поле. Getter поможет показать подсказку из правил выбранной локали; setter нужен только для явно нестандартного оформления отчёта.

Запись в примереЧто именно происходит
DECIMAL_SEPARATOR_SYMBOLИдентификатор знака между целой и дробной частью.
getSymbol(...)Возвращает сам знак, например запятую.
GROUPING_SEPARATOR_SYMBOLДругая настройка: разделитель групп тысяч, он не равен десятичному.
Шаг 1. Подсказка рядом с полемСамостоятельный пример
<?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

Подсказка и пример взяты из одного форматтера, поэтому не противоречат друг другу.

Шаг 2. Специальный формат технического отчётаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

numfmt_get_symbolУправлять конкретным знаком представления числа для специального отчёта.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

numfmt_get_symbol(NumberFormatter $formatter, int $symbol): string|false

Процедурная форма NumberFormatter::getSymbol. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
symbol,valueID из *_SYMBOL, например DECIMAL_SEPARATOR_SYMBOL; setter получает строку. Это текст знака, а не стиль форматирования.
Возвратsetter bool, getter string|false. Rule-based не поддерживаются. Обычному интерфейсу чаще нужны символы из locale без ручной подмены.

Начинаем с задачи и одного вызова

Человек не знает, какой разделитель вводить в числовое поле. Getter поможет показать подсказку из правил выбранной локали; setter нужен только для явно нестандартного оформления отчёта.

Запись в примереЧто именно происходит
DECIMAL_SEPARATOR_SYMBOLИдентификатор знака между целой и дробной частью.
getSymbol(...)Возвращает сам знак, например запятую.
GROUPING_SEPARATOR_SYMBOLДругая настройка: разделитель групп тысяч, он не равен десятичному.
Шаг 1. Подсказка рядом с полемСамостоятельный пример
<?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

Подсказка и пример взяты из одного форматтера, поэтому не противоречат друг другу.

Шаг 2. Специальный формат технического отчётаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

NumberFormatter::setPatternОписать устойчивый шаблон отчёта и проверить, какое правило сейчас использует объект.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

NumberFormatter::setPattern(string $pattern): bool
Аргумент или результатЧто означает на практике
patternICU DecimalFormat: 0 — обязательная цифра, # — необязательная, точка — десятичная позиция, запятая — группировка, ; разделяет положительный и отрицательный шаблоны, % означает масштаб 100, ¤ — валюту, литералы заключают в одиночные кавычки. Это не printf и не PHP date.
ВозвратsetPattern bool, getPattern string|false. setPattern не применяется к rule-based форматтеру; getPattern для него возвращает представление правил. Не путайте символы шаблона с локализованными знаками вывода.

Начинаем с задачи и одного вызова

Отчёт требует обязательные копейки и скобки для отрицательного сальдо. Шаблон описывает вид записи; locale по-прежнему выбирает фактические разделители.

Запись в примереЧто именно происходит
#,##0.000 означает обязательную цифру; два нуля после точки требуют два дробных знака. # — необязательная цифра, запятая — группировка.
;(#,##0.00)После ; находится отдельное правило для отрицательного числа, здесь в скобках.
getPattern()Возвращает применённую грамматику ICU. Это не готовая строка с суммой.
Шаг 1. Превратить 12.5 в 12.50Самостоятельный пример
<?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 подставляет в них конкретное число.

Шаг 2. Сальдо в бухгалтерской таблицеСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

numfmt_set_patternОписать устойчивый шаблон отчёта и проверить, какое правило сейчас использует объект.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

numfmt_set_pattern(NumberFormatter $formatter, string $pattern): bool

Процедурная форма NumberFormatter::setPattern. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
patternICU DecimalFormat: 0 — обязательная цифра, # — необязательная, точка — десятичная позиция, запятая — группировка, ; разделяет положительный и отрицательный шаблоны, % означает масштаб 100, ¤ — валюту, литералы заключают в одиночные кавычки. Это не printf и не PHP date.
ВозвратsetPattern bool, getPattern string|false. setPattern не применяется к rule-based форматтеру; getPattern для него возвращает представление правил. Не путайте символы шаблона с локализованными знаками вывода.

Начинаем с задачи и одного вызова

Отчёт требует обязательные копейки и скобки для отрицательного сальдо. Шаблон описывает вид записи; locale по-прежнему выбирает фактические разделители.

Запись в примереЧто именно происходит
#,##0.000 означает обязательную цифру; два нуля после точки требуют два дробных знака. # — необязательная цифра, запятая — группировка.
;(#,##0.00)После ; находится отдельное правило для отрицательного числа, здесь в скобках.
getPattern()Возвращает применённую грамматику ICU. Это не готовая строка с суммой.
Шаг 1. Превратить 12.5 в 12.50Самостоятельный пример
<?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 подставляет в них конкретное число.

Шаг 2. Сальдо в бухгалтерской таблицеСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

NumberFormatter::getPatternОписать устойчивый шаблон отчёта и проверить, какое правило сейчас использует объект.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

NumberFormatter::getPattern(): string|false
Аргумент или результатЧто означает на практике
patternICU DecimalFormat: 0 — обязательная цифра, # — необязательная, точка — десятичная позиция, запятая — группировка, ; разделяет положительный и отрицательный шаблоны, % означает масштаб 100, ¤ — валюту, литералы заключают в одиночные кавычки. Это не printf и не PHP date.
ВозвратsetPattern bool, getPattern string|false. setPattern не применяется к rule-based форматтеру; getPattern для него возвращает представление правил. Не путайте символы шаблона с локализованными знаками вывода.

Начинаем с задачи и одного вызова

Отчёт требует обязательные копейки и скобки для отрицательного сальдо. Шаблон описывает вид записи; locale по-прежнему выбирает фактические разделители.

Запись в примереЧто именно происходит
#,##0.000 означает обязательную цифру; два нуля после точки требуют два дробных знака. # — необязательная цифра, запятая — группировка.
;(#,##0.00)После ; находится отдельное правило для отрицательного числа, здесь в скобках.
getPattern()Возвращает применённую грамматику ICU. Это не готовая строка с суммой.
Шаг 1. Превратить 12.5 в 12.50Самостоятельный пример
<?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 подставляет в них конкретное число.

Шаг 2. Сальдо в бухгалтерской таблицеСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

numfmt_get_patternОписать устойчивый шаблон отчёта и проверить, какое правило сейчас использует объект.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

numfmt_get_pattern(NumberFormatter $formatter): string|false

Процедурная форма NumberFormatter::getPattern. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
patternICU DecimalFormat: 0 — обязательная цифра, # — необязательная, точка — десятичная позиция, запятая — группировка, ; разделяет положительный и отрицательный шаблоны, % означает масштаб 100, ¤ — валюту, литералы заключают в одиночные кавычки. Это не printf и не PHP date.
ВозвратsetPattern bool, getPattern string|false. setPattern не применяется к rule-based форматтеру; getPattern для него возвращает представление правил. Не путайте символы шаблона с локализованными знаками вывода.

Начинаем с задачи и одного вызова

Отчёт требует обязательные копейки и скобки для отрицательного сальдо. Шаблон описывает вид записи; locale по-прежнему выбирает фактические разделители.

Запись в примереЧто именно происходит
#,##0.000 означает обязательную цифру; два нуля после точки требуют два дробных знака. # — необязательная цифра, запятая — группировка.
;(#,##0.00)После ; находится отдельное правило для отрицательного числа, здесь в скобках.
getPattern()Возвращает применённую грамматику ICU. Это не готовая строка с суммой.
Шаг 1. Превратить 12.5 в 12.50Самостоятельный пример
<?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 подставляет в них конкретное число.

Шаг 2. Сальдо в бухгалтерской таблицеСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

NumberFormatter::getLocaleПроверить локаль данных форматирования после ICU fallback.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

NumberFormatter::getLocale(int $type = ULOC_ACTUAL_LOCALE): string|false
Аргумент или результатЧто означает на практике
typeLocale::ACTUAL_LOCALE(default) либо VALID_LOCALE; actual может быть родительской локалью, потому что данные наследуются.
Возвратstring|false. Это locale форматтера, а не определение языка переданного числа.

Начинаем с задачи и одного вызова

При жалобе «разделители на сервере отличаются» важно узнать, какие правила действительно использует форматтер. Это диагностика конкретного объекта, а не попытка определить язык самого числа.

Запись в примереЧто именно происходит
getLocale(Locale::VALID_LOCALE)Возвращает поддержанную локаль, найденную для запроса.
getLocale(Locale::ACTUAL_LOCALE)Показывает источник реально использованных данных; может оказаться родительским/root.
Форматируемое числоОстаётся тем же; рядом показываем результат, чтобы связать диагностику с симптомом.
Шаг 1. Правила и видимая запись рядомСамостоятельный пример
<?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 может отличаться; выбранный язык пользователя храните отдельно.

Шаг 2. Сопоставить два профиляСамостоятельный пример
<?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; запрашиваемая локаль хранится в политике приложения.

Проверить valid localeСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
typeLocale::ACTUAL_LOCALE(default) либо VALID_LOCALE; actual может быть родительской локалью, потому что данные наследуются.
Возвратstring|false. Это locale форматтера, а не определение языка переданного числа.

Начинаем с задачи и одного вызова

При жалобе «разделители на сервере отличаются» важно узнать, какие правила действительно использует форматтер. Это диагностика конкретного объекта, а не попытка определить язык самого числа.

Запись в примереЧто именно происходит
getLocale(Locale::VALID_LOCALE)Возвращает поддержанную локаль, найденную для запроса.
getLocale(Locale::ACTUAL_LOCALE)Показывает источник реально использованных данных; может оказаться родительским/root.
Форматируемое числоОстаётся тем же; рядом показываем результат, чтобы связать диагностику с симптомом.
Шаг 1. Правила и видимая запись рядомСамостоятельный пример
<?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 может отличаться; выбранный язык пользователя храните отдельно.

Шаг 2. Сопоставить два профиляСамостоятельный пример
<?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; запрашиваемая локаль хранится в политике приложения.

Проверить valid localeСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Делает числовой код понятным в техническом журнале; пользователю лучше отдельная человеческая подсказка.
Шаг 1. Отказ поля и причинаСамостоятельный пример
<?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

Расчёт не выполняется. В примере диагностика видна рядом; на рабочем сайте подробности обычно уходят в закрытый журнал.

Шаг 2. Сохранить причину до следующей операцииСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Делает числовой код понятным в техническом журнале; пользователю лучше отдельная человеческая подсказка.
Шаг 1. Отказ поля и причинаСамостоятельный пример
<?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

Расчёт не выполняется. В примере диагностика видна рядом; на рабочем сайте подробности обычно уходят в закрытый журнал.

Шаг 2. Сохранить причину до следующей операцииСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Делает числовой код понятным в техническом журнале; пользователю лучше отдельная человеческая подсказка.
Шаг 1. Отказ поля и причинаСамостоятельный пример
<?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

Расчёт не выполняется. В примере диагностика видна рядом; на рабочем сайте подробности обычно уходят в закрытый журнал.

Шаг 2. Сохранить причину до следующей операцииСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Делает числовой код понятным в техническом журнале; пользователю лучше отдельная человеческая подсказка.
Шаг 1. Отказ поля и причинаСамостоятельный пример
<?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

Расчёт не выполняется. В примере диагностика видна рядом; на рабочем сайте подробности обычно уходят в закрытый журнал.

Шаг 2. Сохранить причину до следующей операцииСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, не удаляет опасные команды и не заменяет проверку ввода.
formNFC по умолчанию: каноническое составление. 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, не удаляет опасные команды и не заменяет проверку ввода.
formNFC по умолчанию: каноническое составление. 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Сообщить поставщику, какие имена нарушают договор NFCСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Сообщить поставщику, какие имена нарушают договор NFCСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,widthTYPE_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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_language. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_language. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_script. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_script. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_name. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::getDisplayLanguage.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_name. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::getDisplayLanguage.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_variant. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Первый аргумент — что называем, второй — на каком языке это назвать.

Вывести реальный список настроек: ID отдельно от подписиСамостоятельный пример
<?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 экранирован.

Результат PHP в браузере

Тот же механизм в процедурной форме: locale_get_display_variant. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::parseLocale, Locale::getDisplayName.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Массив здесь является словарём: имя ключа определяет смысл поля.

Заполнить поля редактора профиля из сохранённого IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Массив здесь является словарём: имя ключа определяет смысл поля.

Заполнить поля редактора профиля из сохранённого IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

Locale::getAllVariantsПолучить дополнительные варианты locale отдельно от языка и региона.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static Locale::getAllVariants(string $locale): ?array
Аргумент или результатЧто означает на практике
localeID вроде en_US_POSIX. Variant уточняет правила, а не означает произвольное пользовательское поле.
Возврат?array строк вариантов; документация допускает null при отсутствии/слишком длинном ID, runtime может возвращать пустой массив. Проверяйте отсутствие через пустой результат, не обращайтесь без проверки к [0].
Увидеть вариант POSIXСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

locale_get_all_variantsПолучить дополнительные варианты locale отдельно от языка и региона.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

locale_get_all_variants(string $locale): ?array

Процедурная форма Locale::getAllVariants. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
localeID вроде en_US_POSIX. Variant уточняет правила, а не означает произвольное пользовательское поле.
Возврат?array строк вариантов; документация допускает null при отсутствии/слишком длинном ID, runtime может возвращать пустой массив. Проверяйте отсутствие через пустой результат, не обращайтесь без проверки к [0].
Увидеть вариант POSIXСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Это не приблизительное сравнение человеческих названий.
canonicalizetrue сначала приводит входы к канонической форме.
Возврат?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Это не приблизительное сравнение человеческих названий.
canonicalizetrue сначала приводит входы к канонической форме.
Возврат?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

Locale::isRightToLeftВыбрать направление интерфейса для языка с письмом справа налево.

PHP 8.5+ · intl

static Locale::isRightToLeft(string $locale): bool
Аргумент или результатЧто означает на практике
localeID; пустая строка берёт 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)

Направление изменяет расположение интерфейса; сами строки метод не переставляет.

Выдать HTML с правильным направлением письмаСамостоятельный пример
<?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.

Результат PHP в браузере

שלום — ORD-42

Тот же механизм в процедурной форме: locale_is_right_to_left. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::getScript.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

locale_is_right_to_leftВыбрать направление интерфейса для языка с письмом справа налево.

PHP 8.5+ · intl

locale_is_right_to_left(string $locale): bool

Процедурная форма Locale::isRightToLeft. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
localeID; пустая строка берёт 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)

Направление изменяет расположение интерфейса; сами строки метод не переставляет.

Выдать HTML с правильным направлением письмаСамостоятельный пример
<?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.

Результат PHP в браузере

שלום — ORD-42

Тот же механизм в процедурной форме: locale_is_right_to_left. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: Locale::getScript.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,
)

Числовое поле стало элементом массива, а не строкой вместе с префиксом.

Прочитать старый отчёт и допустить к поиску только правильный IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,
)

Числовое поле стало элементом массива, а не строкой вместе с префиксом.

Прочитать старый отчёт и допустить к поиску только правильный IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,
)

Числовое поле стало элементом массива, а не строкой вместе с префиксом.

Прочитать старый отчёт и допустить к поиску только правильный IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,
)

Числовое поле стало элементом массива, а не строкой вместе с префиксом.

Прочитать старый отчёт и допустить к поиску только правильный IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
directionFORWARD по умолчанию; 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
directionFORWARD по умолчанию; 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
directionFORWARD или 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
directionFORWARD или 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 и не проверен на уникальность — это отдельные обязанности.

Преобразовать только часть после эмодзи по индексам UTF-16Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 и не проверен на уникальность — это отдельные обязанности.

Преобразовать только часть после эмодзи по индексам UTF-16Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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-файл с переводами.
fallbacktrue разрешает родительскую локаль. 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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-файл с переводами.
fallbacktrue разрешает родительскую локаль. 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 помогает выбрать один из действительно поддерживаемых языков.

Разрешить родительский fallback и обозначить его границуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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-файл с переводами.
fallbacktrue разрешает родительскую локаль. 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 помогает выбрать один из действительно поддерживаемых языков.

Разрешить родительский fallback и обозначить его границуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

ResourceBundle::getПройти к нужному элементу дерева ресурсов: по строковому имени или числовому индексу.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

ResourceBundle::get(string|int $index, bool $fallback = true): ResourceBundle|array|string|int|null
Аргумент или результатЧто означает на практике
indexstring|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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
indexstring|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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

ResourceBundle::getLocalesПолучить локали, для которых пакет действительно содержит ресурсы.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static ResourceBundle::getLocales(string $bundle): array|false
Аргумент или результатЧто означает на практике
bundleСтрока пути/имени пакета; пустая строка выбирает встроенный список ICU.
Возвратarray строк либо false. Это список ICU-пакета, а не перечень страниц сайта с готовым переводом. Состав меняется при обновлении данных.
Оставить в переключателе только языки с ресурсами 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

resourcebundle_localesПолучить локали, для которых пакет действительно содержит ресурсы.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

resourcebundle_locales(string $bundle): array|false

Процедурная форма ResourceBundle::getLocales. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
bundleСтрока пути/имени пакета; пустая строка выбирает встроенный список ICU.
Возвратarray строк либо false. Это список ICU-пакета, а не перечень страниц сайта с готовым переводом. Состав меняется при обновлении данных.
Оставить в переключателе только языки с ресурсами 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Отсутствующий ресурс превращается в 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Отсутствующий ресурс превращается в 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Отсутствующий ресурс превращается в 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Отсутствующий ресурс превращается в 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 одну букву с акцентом.

Emoji вместе с модификаторомСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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Начало от нуля в графемах; отрицательное считается с конца.
lengthnull до конца; положительное — максимум графем; отрицательное исключает указанное число графем с конца. Если начало оказывается после обрезанного конца, результат пустой.
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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Результат PHP в браузере

👍🏽☕📦

Рядом по задаче: IntlBreakIterator::createCharacterInstance, grapheme_extract.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
beforeNeedlefalse: от первого совпадения включительно до конца; 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
beforeNeedlefalse: от первого совпадения включительно до конца; 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,typesize — предел. 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Одной замены достаточно для превращения слова; это мера похожести, а не понимание смысла.

Две Unicode-записи одной буквыСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, а не доверие к удалённому серверу.

Увидеть, почему режим 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,timeTypeFULL/LONG/MEDIUM/SHORT/NONE и поддержанные относительные стили. С PHP 8.1 оба необязательны, по умолчанию FULL.
timezoneID ICU, явное GMT-смещение, IntlTimeZone, DateTimeZone или null. null использует пояс переданного календаря, иначе date_default_timezone_get; locale не выбирает пояс автоматически.
calendarIntlCalendar, GREGORIAN/TRADITIONAL или null (GREGORIAN). Переданный объект клонируется; исходный календарь не меняется.
pattern?string — шаблон ICU; при заданном шаблоне он определяет представление. Буквы отличаются от PHP date(): yyyy-MM-dd, не Y-m-d.
ВозвратГотовый объект; фабрика — объект|null при ошибке. Календарная система, язык и часовой пояс — три разные настройки.

Начинаем с задачи и одного вызова

Заказ хранит момент создания, а покупатель хочет видеть понятную дату. Настроим язык, календарь, часовой пояс и вид записи отдельно: эти четыре настройки решают разные задачи.

Запись в примереЧто именно происходит
1709209800Unix timestamp: число секунд от начала 1970 года. Здесь это заранее известный момент заказа, 29.02.2024 12:30 UTC.
"en_GB"Язык и регион представления; не определяют часовой пояс автоматически.
NONE, NONEОтключаем готовые стили, потому что дальше передаём собственный шаблон.
"UTC", GREGORIANЯвно задаём часовой пояс и григорианский календарь.
"dd.MM.yyyy HH:mm"ICU-шаблон: день, месяц, календарный год, часы и минуты. Это не язык PHP date().
Шаг 1. Показать момент заказаСамостоятельный пример
<?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 добавил подпись. В базе остаётся исходный момент, чтобы позже показать его в другом поясе.

Шаг 2. Название месяца из языкаСамостоятельный пример
<?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, а не массив переведённых вручную месяцев.

Шаг 3. Показать время покупателяСамостоятельный пример
<?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 заказа остался тем же. Часовой пояс берут из настройки пользователя/заказа, не выводят из языка.

Дополнительные варианты и диагностика

Момент начала Unix-эпохиСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,timeTypeFULL/LONG/MEDIUM/SHORT/NONE и поддержанные относительные стили. С PHP 8.1 оба необязательны, по умолчанию FULL.
timezoneID ICU, явное GMT-смещение, IntlTimeZone, DateTimeZone или null. null использует пояс переданного календаря, иначе date_default_timezone_get; locale не выбирает пояс автоматически.
calendarIntlCalendar, GREGORIAN/TRADITIONAL или null (GREGORIAN). Переданный объект клонируется; исходный календарь не меняется.
pattern?string — шаблон ICU; при заданном шаблоне он определяет представление. Буквы отличаются от PHP date(): yyyy-MM-dd, не Y-m-d.
ВозвратГотовый объект; фабрика — объект|null при ошибке. Календарная система, язык и часовой пояс — три разные настройки.

Начинаем с задачи и одного вызова

Заказ хранит момент создания, а покупатель хочет видеть понятную дату. Настроим язык, календарь, часовой пояс и вид записи отдельно: эти четыре настройки решают разные задачи.

Запись в примереЧто именно происходит
1709209800Unix timestamp: число секунд от начала 1970 года. Здесь это заранее известный момент заказа, 29.02.2024 12:30 UTC.
"en_GB"Язык и регион представления; не определяют часовой пояс автоматически.
NONE, NONEОтключаем готовые стили, потому что дальше передаём собственный шаблон.
"UTC", GREGORIANЯвно задаём часовой пояс и григорианский календарь.
"dd.MM.yyyy HH:mm"ICU-шаблон: день, месяц, календарный год, часы и минуты. Это не язык PHP date().
Шаг 1. Показать момент заказаСамостоятельный пример
<?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 добавил подпись. В базе остаётся исходный момент, чтобы позже показать его в другом поясе.

Шаг 2. Название месяца из языкаСамостоятельный пример
<?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, а не массив переведённых вручную месяцев.

Шаг 3. Показать время покупателяСамостоятельный пример
<?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 заказа остался тем же. Часовой пояс берут из настройки пользователя/заказа, не выводят из языка.

Дополнительные варианты и диагностика

Момент начала Unix-эпохиСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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,timeTypeFULL/LONG/MEDIUM/SHORT/NONE и поддержанные относительные стили. С PHP 8.1 оба необязательны, по умолчанию FULL.
timezoneID ICU, явное GMT-смещение, IntlTimeZone, DateTimeZone или null. null использует пояс переданного календаря, иначе date_default_timezone_get; locale не выбирает пояс автоматически.
calendarIntlCalendar, GREGORIAN/TRADITIONAL или null (GREGORIAN). Переданный объект клонируется; исходный календарь не меняется.
pattern?string — шаблон ICU; при заданном шаблоне он определяет представление. Буквы отличаются от PHP date(): yyyy-MM-dd, не Y-m-d.
ВозвратГотовый объект; фабрика — объект|null при ошибке. Календарная система, язык и часовой пояс — три разные настройки.

Начинаем с задачи и одного вызова

Заказ хранит момент создания, а покупатель хочет видеть понятную дату. Настроим язык, календарь, часовой пояс и вид записи отдельно: эти четыре настройки решают разные задачи.

Запись в примереЧто именно происходит
1709209800Unix timestamp: число секунд от начала 1970 года. Здесь это заранее известный момент заказа, 29.02.2024 12:30 UTC.
"en_GB"Язык и регион представления; не определяют часовой пояс автоматически.
NONE, NONEОтключаем готовые стили, потому что дальше передаём собственный шаблон.
"UTC", GREGORIANЯвно задаём часовой пояс и григорианский календарь.
"dd.MM.yyyy HH:mm"ICU-шаблон: день, месяц, календарный год, часы и минуты. Это не язык PHP date().
Шаг 1. Показать момент заказаСамостоятельный пример
<?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 добавил подпись. В базе остаётся исходный момент, чтобы позже показать его в другом поясе.

Шаг 2. Название месяца из языкаСамостоятельный пример
<?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, а не массив переведённых вручную месяцев.

Шаг 3. Показать время покупателяСамостоятельный пример
<?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 заказа остался тем же. Часовой пояс берут из настройки пользователя/заказа, не выводят из языка.

Дополнительные варианты и диагностика

Момент начала Unix-эпохиСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlDateFormatter::formatПреобразовать момент или календарные поля в строку для человека.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlDateFormatter::format($datetime): string|false
Аргумент или результатЧто означает на практике
datetimeIntlCalendar, DateTimeInterface, число секунд Unix timestamp (возможна дробная часть) или массив структуры localtime. Строковый числовой ввод поддержан сигнатурой, но произвольный текст вроде tomorrow здесь не контракт.
Часовой поясПри передаче DateTime/IntlCalendar используется пояс форматтера, а не объекта! Для пояса самого объекта есть formatObject или явный setTimeZone.
Возвратstring|false. IntlCalendar::getTime возвращает миллисекунды; не передавайте их как секунды без деления на 1000. Для машинного API выбирайте согласованный ISO-формат, а не локализованную подпись.

Начинаем с задачи и одного вызова

Из момента хранения получить надпись на странице заказа. Сначала один вызов, затем разберём типичную ошибку: переданный DateTime имеет свой пояс, но форматтер применяет собственный.

Запись в примереЧто именно происходит
$formatter->format($createdAt)Метод получает момент в секундах и возвращает строку.
DateTimeImmutableОбъект момента и его часового пояса. Вызов format всё равно использует пояс форматтера.
Возвращённая строкаПодходит для человека. В API отправляют согласованный машинный формат, а не локализованную подпись.
Шаг 1. Подпись к заказуСамостоятельный пример
<?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 продолжает хранить число момента.

Шаг 2. Один момент в двух представленияхСамостоятельный пример
<?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. Это частая причина вопросов о «неправильной дате».

Дополнительные варианты и диагностика

Форматировать Unix 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(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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

datefmt_formatПреобразовать момент или календарные поля в строку для человека.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

datefmt_format(IntlDateFormatter $formatter, $datetime): string|false

Процедурная форма IntlDateFormatter::format. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
datetimeIntlCalendar, DateTimeInterface, число секунд Unix timestamp (возможна дробная часть) или массив структуры localtime. Строковый числовой ввод поддержан сигнатурой, но произвольный текст вроде tomorrow здесь не контракт.
Часовой поясПри передаче DateTime/IntlCalendar используется пояс форматтера, а не объекта! Для пояса самого объекта есть formatObject или явный setTimeZone.
Возвратstring|false. IntlCalendar::getTime возвращает миллисекунды; не передавайте их как секунды без деления на 1000. Для машинного API выбирайте согласованный ISO-формат, а не локализованную подпись.

Начинаем с задачи и одного вызова

Из момента хранения получить надпись на странице заказа. Сначала один вызов, затем разберём типичную ошибку: переданный DateTime имеет свой пояс, но форматтер применяет собственный.

Запись в примереЧто именно происходит
$formatter->format($createdAt)Метод получает момент в секундах и возвращает строку.
DateTimeImmutableОбъект момента и его часового пояса. Вызов format всё равно использует пояс форматтера.
Возвращённая строкаПодходит для человека. В API отправляют согласованный машинный формат, а не локализованную подпись.
Шаг 1. Подпись к заказуСамостоятельный пример
<?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 продолжает хранить число момента.

Шаг 2. Один момент в двух представленияхСамостоятельный пример
<?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. Это частая причина вопросов о «неправильной дате».

Дополнительные варианты и диагностика

Форматировать Unix 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(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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlDateFormatter::formatObjectОдин раз отобразить объект даты в его собственном часовом поясе.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static IntlDateFormatter::formatObject($datetime, $format = null, ?string $locale = null): string|false
Аргумент или результатЧто означает на практике
datetimeIntlCalendar или DateTimeInterface. ID пояса должен поддерживаться ICU: используются данные ICU, а не непосредственно база часовых поясов PHP.
formatnull — 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: два стиля, дата и время.
Шаг 1. Сохранить часы встречиСамостоятельный пример
<?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 у существующего форматтера здесь нет отдельной ранее выбранной зоны.

Шаг 2. Дата для английского письмаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
datetimeIntlCalendar или DateTimeInterface. ID пояса должен поддерживаться ICU: используются данные ICU, а не непосредственно база часовых поясов PHP.
formatnull — 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: два стиля, дата и время.
Шаг 1. Сохранить часы встречиСамостоятельный пример
<?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 у существующего форматтера здесь нет отдельной ранее выбранной зоны.

Шаг 2. Дата для английского письмаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 шаблона.
Шаг 1. Стиль и подпись виджетаСамостоятельный пример
<?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

Человек видит конкретную подпись, а разработчик может объяснить, почему выбран именно такой объём даты/времени.

Шаг 2. Оставить только нужную частьСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 шаблона.
Шаг 1. Стиль и подпись виджетаСамостоятельный пример
<?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

Человек видит конкретную подпись, а разработчик может объяснить, почему выбран именно такой объём даты/времени.

Шаг 2. Оставить только нужную частьСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 шаблона.
Шаг 1. Стиль и подпись виджетаСамостоятельный пример
<?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

Человек видит конкретную подпись, а разработчик может объяснить, почему выбран именно такой объём даты/времени.

Шаг 2. Оставить только нужную частьСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 шаблона.
Шаг 1. Стиль и подпись виджетаСамостоятельный пример
<?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

Человек видит конкретную подпись, а разработчик может объяснить, почему выбран именно такой объём даты/времени.

Шаг 2. Оставить только нужную частьСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера.
Шаг 1. Понять выбранную системуСамостоятельный пример
<?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 называет календарную систему. Это не язык текста и не часовой пояс.

Шаг 2. Другой год у того же событияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера.
Шаг 1. Понять выбранную системуСамостоятельный пример
<?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 называет календарную систему. Это не язык текста и не часовой пояс.

Шаг 2. Другой год у того же событияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера.
Шаг 1. Понять выбранную системуСамостоятельный пример
<?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 называет календарную систему. Это не язык текста и не часовой пояс.

Шаг 2. Другой год у того же событияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера.
Шаг 1. Понять выбранную системуСамостоятельный пример
<?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 называет календарную систему. Это не язык текста и не часовой пояс.

Шаг 2. Другой год у того же событияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlDateFormatter::setCalendarПереключить календарную систему или передать заранее настроенный календарь.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlDateFormatter::setCalendar(IntlCalendar|int|null $calendar): bool
Аргумент или результатЧто означает на практике
calendarIntlCalendar, GREGORIAN/TRADITIONAL, либо null (GREGORIAN). Объект клонируется.
Часовой поясЕсли передаёте объект, форматтер получает и его пояс. Если передаёте константу/null, прежний пояс форматтера сохраняется.
Возвратbool. После смены календаря тот же timestamp может показывать другой год/месяц; не принимайте это за изменение самого момента.

Начинаем с задачи и одного вызова

Календарь определяет, как одному моменту соответствуют год, месяц и день. Это понадобится международному приложению: буддийский календарь показывает другой номер года, хотя событие остаётся тем же.

Запись в примереЧто именно происходит
GREGORIAN / TRADITIONALОбщий режим: григорианская система либо традиционная для locale.
getCalendarObject()Даёт копию внутреннего календаря, у которой можно прочитать конкретный тип. Случайное время этой копии не равно последнему format.
setCalendar($calendar)Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера.
Шаг 1. Понять выбранную системуСамостоятельный пример
<?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 называет календарную систему. Это не язык текста и не часовой пояс.

Шаг 2. Другой год у того же событияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

datefmt_set_calendarПереключить календарную систему или передать заранее настроенный календарь.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

datefmt_set_calendar(IntlDateFormatter $formatter, IntlCalendar|int|null $calendar): bool

Процедурная форма IntlDateFormatter::setCalendar. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
calendarIntlCalendar, GREGORIAN/TRADITIONAL, либо null (GREGORIAN). Объект клонируется.
Часовой поясЕсли передаёте объект, форматтер получает и его пояс. Если передаёте константу/null, прежний пояс форматтера сохраняется.
Возвратbool. После смены календаря тот же timestamp может показывать другой год/месяц; не принимайте это за изменение самого момента.

Начинаем с задачи и одного вызова

Календарь определяет, как одному моменту соответствуют год, месяц и день. Это понадобится международному приложению: буддийский календарь показывает другой номер года, хотя событие остаётся тем же.

Запись в примереЧто именно происходит
GREGORIAN / TRADITIONALОбщий режим: григорианская система либо традиционная для locale.
getCalendarObject()Даёт копию внутреннего календаря, у которой можно прочитать конкретный тип. Случайное время этой копии не равно последнему format.
setCalendar($calendar)Передаёт настроенную копию календаря; вместе с объектом может измениться и пояс форматтера.
Шаг 1. Понять выбранную системуСамостоятельный пример
<?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 называет календарную систему. Это не язык текста и не часовой пояс.

Шаг 2. Другой год у того же событияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 не меняется.
Шаг 1. Подписать время вместе с зонойСамостоятельный пример
<?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

Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.

Шаг 2. Настроить представление покупателяСамостоятельный пример
<?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. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.

Дополнительные варианты и диагностика

Прочитать 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->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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 не меняется.
Шаг 1. Подписать время вместе с зонойСамостоятельный пример
<?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

Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.

Шаг 2. Настроить представление покупателяСамостоятельный пример
<?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. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.

Дополнительные варианты и диагностика

Прочитать 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->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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 не меняется.
Шаг 1. Подписать время вместе с зонойСамостоятельный пример
<?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

Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.

Шаг 2. Настроить представление покупателяСамостоятельный пример
<?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. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.

Дополнительные варианты и диагностика

Прочитать 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->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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 не меняется.
Шаг 1. Подписать время вместе с зонойСамостоятельный пример
<?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

Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.

Шаг 2. Настроить представление покупателяСамостоятельный пример
<?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. Для покупателя и оператора можно иметь два форматтера с разными зонами, не копируя сам заказ.

Дополнительные варианты и диагностика

Прочитать 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->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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlDateFormatter::setTimeZoneПоказать тот же момент в часовом поясе получателя отчёта.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlDateFormatter::setTimeZone(IntlTimeZone|DateTimeZone|string|null $timezone): bool
Аргумент или результатЧто означает на практике
timezoneIntlTimeZone, 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 не меняется.
Шаг 1. Подписать время вместе с зонойСамостоятельный пример
<?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

Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.

Шаг 2. Настроить представление покупателяСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
timezoneIntlTimeZone, 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 не меняется.
Шаг 1. Подписать время вместе с зонойСамостоятельный пример
<?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

Без зоны два правильных времени могут выглядеть как ошибка. Здесь явно видно, чьи часы показаны.

Шаг 2. Настроить представление покупателяСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 и YYYYyyyy — календарный год; YYYY — недельный год, который на границе декабря/января бывает другим.
getPattern()Читает действующее правило, setPattern меняет его для последующих вызовов.
Шаг 1. Убрать время из карточкиСамостоятельный пример
<?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

Секунды/часы не исчезли из хранимого момента. Мы выбрали меньший объём подписи.

Шаг 2. Поймать неправильный год в декабреСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 и YYYYyyyy — календарный год; YYYY — недельный год, который на границе декабря/января бывает другим.
getPattern()Читает действующее правило, setPattern меняет его для последующих вызовов.
Шаг 1. Убрать время из карточкиСамостоятельный пример
<?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

Секунды/часы не исчезли из хранимого момента. Мы выбрали меньший объём подписи.

Шаг 2. Поймать неправильный год в декабреСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 и YYYYyyyy — календарный год; YYYY — недельный год, который на границе декабря/января бывает другим.
getPattern()Читает действующее правило, setPattern меняет его для последующих вызовов.
Шаг 1. Убрать время из карточкиСамостоятельный пример
<?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

Секунды/часы не исчезли из хранимого момента. Мы выбрали меньший объём подписи.

Шаг 2. Поймать неправильный год в декабреСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 и YYYYyyyy — календарный год; YYYY — недельный год, который на границе декабря/января бывает другим.
getPattern()Читает действующее правило, setPattern меняет его для последующих вызовов.
Шаг 1. Убрать время из карточкиСамостоятельный пример
<?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

Секунды/часы не исчезли из хранимого момента. Мы выбрали меньший объём подписи.

Шаг 2. Поймать неправильный год в декабреСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlDateFormatter::getLocaleПроверить, какая ICU-локаль реально предоставляет правила форматирования.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlDateFormatter::getLocale(int $type = ULOC_ACTUAL_LOCALE): string|false
Аргумент или результатЧто означает на практике
typeACTUAL_LOCALE по умолчанию либо VALID_LOCALE. ICU может наследовать данные родительской локали.
Возвратstring|false. Фактическая locale данных не обязана буквально совпадать с запрошенным ID и не сообщает часовой пояс.

Начинаем с задачи и одного вызова

Дата форматируется, но название месяца не соответствует языку письма. Проверим locale объекта и рядом покажем его фактический вывод.

Запись в примереЧто именно происходит
getLocale(VALID_LOCALE)Возвращает разрешённую ICU локаль после fallback.
ACTUAL_LOCALEИсточник реально используемых данных может быть родительским.
Locale и timezoneПервая выбирает слова/порядок полей, второй — местные часы. Они задаются независимо.
Шаг 1. Локаль рядом с результатомСамостоятельный пример
<?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-диагностике теперь видно, почему месяц английский.

Шаг 2. Одна дата в двух языковых версияхСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
typeACTUAL_LOCALE по умолчанию либо VALID_LOCALE. ICU может наследовать данные родительской локали.
Возвратstring|false. Фактическая locale данных не обязана буквально совпадать с запрошенным ID и не сообщает часовой пояс.

Начинаем с задачи и одного вызова

Дата форматируется, но название месяца не соответствует языку письма. Проверим locale объекта и рядом покажем его фактический вывод.

Запись в примереЧто именно происходит
getLocale(VALID_LOCALE)Возвращает разрешённую ICU локаль после fallback.
ACTUAL_LOCALEИсточник реально используемых данных может быть родительским.
Locale и timezoneПервая выбирает слова/порядок полей, второй — местные часы. Они задаются независимо.
Шаг 1. Локаль рядом с результатомСамостоятельный пример
<?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-диагностике теперь видно, почему месяц английский.

Шаг 2. Одна дата в двух языковых версияхСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlDateFormatter::setLenientНастроить строгость разбора даты, чтобы ввод не исправлялся незаметно для пользователя.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlDateFormatter::setLenient(bool $lenient): void
Аргумент или результатЧто означает на практике
lenientbool у setter; default true. Для формы с точной календарной датой обычно устанавливают false.
ВозвратsetLenient имеет актуальную сигнатуру void; не проверяйте его return как bool вопреки старому тексту документации. isLenient возвращает bool.
Границы проверкиСтрогий режим ограничивает календарные значения, но не заменяет проверку полного потребления строки, бизнес-диапазона и часового пояса.

Начинаем с задачи и одного вызова

В форме записи введено 30 февраля. Если библиотека сама превратит его в март, человек может записаться на неверный день. Для такой формы нужен строгий разбор.

Запись в примереЧто именно происходит
setLenient(false)Запрещает мягкую нормализацию невозможных календарных полей.
isLenient()Позволяет проверить режим парсера. Возвращаемое false здесь полезная настройка, не ошибка.
parse(...) === falseОтдельный отказ разобрать введённую дату. Нужно показать ошибку поля, а не считать это timestamp 0.
Шаг 1. Отклонить невозможную датуСамостоятельный пример
<?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 "Такой даты нет: проверьте день и месяц.
"; }
Ожидаемый результат
Такой даты нет: проверьте день и месяц.

Человек получает возможность исправить поле вместо автоматической записи на март.

Шаг 2. Принять существующий високосный деньСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

datefmt_set_lenientНастроить строгость разбора даты, чтобы ввод не исправлялся незаметно для пользователя.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

datefmt_set_lenient(IntlDateFormatter $formatter, bool $lenient): void

Процедурная форма IntlDateFormatter::setLenient. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
lenientbool у setter; default true. Для формы с точной календарной датой обычно устанавливают false.
ВозвратsetLenient имеет актуальную сигнатуру void; не проверяйте его return как bool вопреки старому тексту документации. isLenient возвращает bool.
Границы проверкиСтрогий режим ограничивает календарные значения, но не заменяет проверку полного потребления строки, бизнес-диапазона и часового пояса.

Начинаем с задачи и одного вызова

В форме записи введено 30 февраля. Если библиотека сама превратит его в март, человек может записаться на неверный день. Для такой формы нужен строгий разбор.

Запись в примереЧто именно происходит
setLenient(false)Запрещает мягкую нормализацию невозможных календарных полей.
isLenient()Позволяет проверить режим парсера. Возвращаемое false здесь полезная настройка, не ошибка.
parse(...) === falseОтдельный отказ разобрать введённую дату. Нужно показать ошибку поля, а не считать это timestamp 0.
Шаг 1. Отклонить невозможную датуСамостоятельный пример
<?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 "Такой даты нет: проверьте день и месяц.
"; }
Ожидаемый результат
Такой даты нет: проверьте день и месяц.

Человек получает возможность исправить поле вместо автоматической записи на март.

Шаг 2. Принять существующий високосный деньСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlDateFormatter::isLenientНастроить строгость разбора даты, чтобы ввод не исправлялся незаметно для пользователя.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlDateFormatter::isLenient(): bool
Аргумент или результатЧто означает на практике
lenientbool у setter; default true. Для формы с точной календарной датой обычно устанавливают false.
ВозвратsetLenient имеет актуальную сигнатуру void; не проверяйте его return как bool вопреки старому тексту документации. isLenient возвращает bool.
Границы проверкиСтрогий режим ограничивает календарные значения, но не заменяет проверку полного потребления строки, бизнес-диапазона и часового пояса.

Начинаем с задачи и одного вызова

В форме записи введено 30 февраля. Если библиотека сама превратит его в март, человек может записаться на неверный день. Для такой формы нужен строгий разбор.

Запись в примереЧто именно происходит
setLenient(false)Запрещает мягкую нормализацию невозможных календарных полей.
isLenient()Позволяет проверить режим парсера. Возвращаемое false здесь полезная настройка, не ошибка.
parse(...) === falseОтдельный отказ разобрать введённую дату. Нужно показать ошибку поля, а не считать это timestamp 0.
Шаг 1. Отклонить невозможную датуСамостоятельный пример
<?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 "Такой даты нет: проверьте день и месяц.
"; }
Ожидаемый результат
Такой даты нет: проверьте день и месяц.

Человек получает возможность исправить поле вместо автоматической записи на март.

Шаг 2. Принять существующий високосный деньСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

datefmt_is_lenientНастроить строгость разбора даты, чтобы ввод не исправлялся незаметно для пользователя.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

datefmt_is_lenient(IntlDateFormatter $formatter): bool

Процедурная форма IntlDateFormatter::isLenient. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
lenientbool у setter; default true. Для формы с точной календарной датой обычно устанавливают false.
ВозвратsetLenient имеет актуальную сигнатуру void; не проверяйте его return как bool вопреки старому тексту документации. isLenient возвращает bool.
Границы проверкиСтрогий режим ограничивает календарные значения, но не заменяет проверку полного потребления строки, бизнес-диапазона и часового пояса.

Начинаем с задачи и одного вызова

В форме записи введено 30 февраля. Если библиотека сама превратит его в март, человек может записаться на неверный день. Для такой формы нужен строгий разбор.

Запись в примереЧто именно происходит
setLenient(false)Запрещает мягкую нормализацию невозможных календарных полей.
isLenient()Позволяет проверить режим парсера. Возвращаемое false здесь полезная настройка, не ошибка.
parse(...) === falseОтдельный отказ разобрать введённую дату. Нужно показать ошибку поля, а не считать это timestamp 0.
Шаг 1. Отклонить невозможную датуСамостоятельный пример
<?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 "Такой даты нет: проверьте день и месяц.
"; }
Ожидаемый результат
Такой даты нет: проверьте день и месяц.

Человек получает возможность исправить поле вместо автоматической записи на март.

Шаг 2. Принять существующий високосный деньСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Шаг 1. Получить момент и снова показать датуСамостоятельный пример
<?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

Число можно сохранить и сравнивать с другими моментами. Обратный вывод делает смысл числа понятным человеку.

Шаг 2. Не пропустить чужой текст после датыСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Шаг 1. Получить момент и снова показать датуСамостоятельный пример
<?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

Число можно сохранить и сравнивать с другими моментами. Обратный вывод делает смысл числа понятным человеку.

Шаг 2. Не пропустить чужой текст после датыСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Шаг 1. Получить момент и снова показать датуСамостоятельный пример
<?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

Число можно сохранить и сравнивать с другими моментами. Обратный вывод делает смысл числа понятным человеку.

Шаг 2. Не пропустить чужой текст после датыСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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День месяца, часы и минуты. Они читаются из массива по ключам.
Шаг 1. Заполнить отдельные поля формыСамостоятельный пример
<?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.

Шаг 2. Выделить время слотаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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День месяца, часы и минуты. Они читаются из массива по ключам.
Шаг 1. Заполнить отдельные поля формыСамостоятельный пример
<?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.

Шаг 2. Выделить время слотаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Отдельным успешным вызовом готовим понятный пример формата для пользователя.
Шаг 1. Сообщение поля при отказеСамостоятельный пример
<?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 года. Пользователь понимает, как исправить поле.

Шаг 2. Сначала сохранить причину, затем готовить подсказкуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Отдельным успешным вызовом готовим понятный пример формата для пользователя.
Шаг 1. Сообщение поля при отказеСамостоятельный пример
<?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 года. Пользователь понимает, как исправить поле.

Шаг 2. Сначала сохранить причину, затем готовить подсказкуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Отдельным успешным вызовом готовим понятный пример формата для пользователя.
Шаг 1. Сообщение поля при отказеСамостоятельный пример
<?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 года. Пользователь понимает, как исправить поле.

Шаг 2. Сначала сохранить причину, затем готовить подсказкуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)Отдельным успешным вызовом готовим понятный пример формата для пользователя.
Шаг 1. Сообщение поля при отказеСамостоятельный пример
<?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 года. Пользователь понимает, как исправить поле.

Шаг 2. Сначала сохранить причину, затем готовить подсказкуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, не саму дату.
Шаг 1. Попросить три поляСамостоятельный пример
<?php
declare(strict_types=1);

$generator = new IntlDatePatternGenerator("en_US");
$pattern = $generator->getBestPattern("yMd");
echo "Правило для США: ", $pattern, "
";
Ожидаемый результат
Правило для США: M/d/y

Запрос перечислял y, M, d, но естественный американский порядок начинается с месяца.

Шаг 2. Получить видимую дату по выбранному правилуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, не саму дату.
Шаг 1. Попросить три поляСамостоятельный пример
<?php
declare(strict_types=1);

$generator = new IntlDatePatternGenerator("en_US");
$pattern = $generator->getBestPattern("yMd");
echo "Правило для США: ", $pattern, "
";
Ожидаемый результат
Правило для США: M/d/y

Запрос перечислял y, M, d, но естественный американский порядок начинается с месяца.

Шаг 2. Получить видимую дату по выбранному правилуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, не саму дату.
Шаг 1. Попросить три поляСамостоятельный пример
<?php
declare(strict_types=1);

$generator = new IntlDatePatternGenerator("en_US");
$pattern = $generator->getBestPattern("yMd");
echo "Правило для США: ", $pattern, "
";
Ожидаемый результат
Правило для США: M/d/y

Запрос перечислял y, M, d, но естественный американский порядок начинается с месяца.

Шаг 2. Получить видимую дату по выбранному правилуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlTimeZone::getGMTПолучить эталонный пояс с нулевым смещением.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static IntlTimeZone::getGMT(): IntlTimeZone
Аргумент или результатЧто означает на практике
АргументыНет.
ВозвратIntlTimeZone. GMT не использует сезонное время.
Прочитать IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

intltz_get_gmtПолучить эталонный пояс с нулевым смещением.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

intltz_get_gmt(): IntlTimeZone

Процедурная форма IntlTimeZone::getGMT. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
АргументыНет.
ВозвратIntlTimeZone. GMT не использует сезонное время.
Прочитать IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlTimeZone::getUnknownПолучить специальное значение неизвестного пояса для диагностики.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static IntlTimeZone::getUnknown(): IntlTimeZone
Аргумент или результатЧто означает на практике
АргументыНет.
ВозвратIntlTimeZone. Etc/Unknown не должен молча означать, что пользователь выбрал UTC, даже если числовое смещение равно нулю.
Прочитать IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

intltz_get_unknownПолучить специальное значение неизвестного пояса для диагностики.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

intltz_get_unknown(): IntlTimeZone

Процедурная форма IntlTimeZone::getUnknown. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
АргументыНет.
ВозвратIntlTimeZone. Etc/Unknown не должен молча означать, что пользователь выбрал UTC, даже если числовое смещение равно нулю.
Прочитать IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlTimeZone::createEnumerationПолучить список поясов для выбора или найти пояса указанного региона/базового смещения.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static IntlTimeZone::createEnumeration(string|int|null $countryOrRawOffset = null): IntlIterator|false
Аргумент или результатЧто означает на практике
countryOrRawOffsetnull — все 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)

Для небольшого списка формы массив удобен; для большого обхода можно оставить итератор.

Найти пояса базового UTC+1Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

intltz_create_enumerationПолучить список поясов для выбора или найти пояса указанного региона/базового смещения.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

intltz_create_enumeration(string|int|null $countryOrRawOffset = null): IntlIterator|false

Процедурная форма IntlTimeZone::createEnumeration. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
countryOrRawOffsetnull — все 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)

Для небольшого списка формы массив удобен; для большого обхода можно оставить итератор.

Найти пояса базового UTC+1Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlTimeZone::createTimeZoneIDEnumerationСобрать список канонических поясов без лишних исторических алиасов и ограничить его регионом/смещением.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static IntlTimeZone::createTimeZoneIDEnumeration(int $type, ?string $region = null, ?int $rawOffset = null): IntlIterator|false
Аргумент или результатЧто означает на практике
typeTYPE_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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
typeTYPE_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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 может не преобразоваться.
Перенести UTCСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 может не преобразоваться.
Перенести UTCСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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-объектСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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-объектСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)

Для хранения нового выбора удобнее каноническое имя.

Проверить пояс из формы и сохранить канонический системный IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)

Для хранения нового выбора удобнее каноническое имя.

Проверить пояс из формы и сохранить канонический системный IDСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlTimeZone::getIanaIDПолучить предпочтительное имя IANA для совместимого обмена настройками часового пояса.

PHP 8.4; ICU 74+ · intl

static IntlTimeZone::getIanaID(string $timezoneId): string|false
Аргумент или результатЧто означает на практике
timezoneIdID или алиас, например US/Eastern.
Возвратstring|false. Требует ICU 74+. Для старых окружений проверяйте наличие метода/версии; не подменяйте молча произвольной строковой заменой.
Современное имя вместо алиасаСамостоятельный пример
<?php
declare(strict_types=1);

echo IntlTimeZone::getIanaID("US/Eastern"), "
";
Ожидаемый результат
America/New_York

Используется при переносе настроек между сервисами с IANA-идентификаторами.

Системное имя GMTСамостоятельный пример
<?php
declare(strict_types=1);

echo intltz_get_iana_id("GMT"), "
";
Ожидаемый результат
Etc/GMT

Имена сохраняют соглашения конкретной базы; это не вычисление offset.

Тот же механизм в процедурной форме: intltz_get_iana_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: IntlTimeZone::getCanonicalID.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

intltz_get_iana_idПолучить предпочтительное имя IANA для совместимого обмена настройками часового пояса.

PHP 8.4; ICU 74+ · intl

intltz_get_iana_id(string $timezoneId): string|false

Процедурная форма IntlTimeZone::getIanaID. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
timezoneIdID или алиас, например US/Eastern.
Возвратstring|false. Требует ICU 74+. Для старых окружений проверяйте наличие метода/версии; не подменяйте молча произвольной строковой заменой.
Современное имя вместо алиасаСамостоятельный пример
<?php
declare(strict_types=1);

echo IntlTimeZone::getIanaID("US/Eastern"), "
";
Ожидаемый результат
America/New_York

Используется при переносе настроек между сервисами с IANA-идентификаторами.

Системное имя GMTСамостоятельный пример
<?php
declare(strict_types=1);

echo intltz_get_iana_id("GMT"), "
";
Ожидаемый результат
Etc/GMT

Имена сохраняют соглашения конкретной базы; это не вычисление offset.

Тот же механизм в процедурной форме: intltz_get_iana_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: IntlTimeZone::getCanonicalID.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Неизвестный ID не образует группуСамостоятельный пример
<?php
declare(strict_types=1);

echo intltz_count_equivalent_ids("No/Such_Zone"), "
";
Ожидаемый результат
0

Пустой результат не является пригодным поясом для отчёта.

Тот же механизм в процедурной форме: intltz_count_equivalent_ids. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: IntlTimeZone::getCanonicalID.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Неизвестный ID не образует группуСамостоятельный пример
<?php
declare(strict_types=1);

echo intltz_count_equivalent_ids("No/Such_Zone"), "
";
Ожидаемый результат
0

Пустой результат не является пригодным поясом для отчёта.

Тот же механизм в процедурной форме: intltz_count_equivalent_ids. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: IntlTimeZone::getCanonicalID.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Неизвестный ID не образует группуСамостоятельный пример
<?php
declare(strict_types=1);

var_dump(intltz_get_equivalent_id("No/Such_Zone", 0));
Ожидаемый результат
string(0) ""

Пустой результат не является пригодным поясом для отчёта.

Тот же механизм в процедурной форме: intltz_get_equivalent_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: IntlTimeZone::getCanonicalID.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Неизвестный ID не образует группуСамостоятельный пример
<?php
declare(strict_types=1);

var_dump(intltz_get_equivalent_id("No/Such_Zone", 0));
Ожидаемый результат
string(0) ""

Пустой результат не является пригодным поясом для отчёта.

Тот же механизм в процедурной форме: intltz_get_equivalent_id. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: IntlTimeZone::getCanonicalID.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlTimeZone::getIDПрочитать идентификатор пояса, который хранится в объекте.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlTimeZone::getID(): string|false
Аргумент или результатЧто означает на практике
Возвратstring|false. Может сохраняться алиас или custom ID; для нормализации нужен getCanonicalID.
ПрименениеХранение/диагностика настройки. Для подписи человеку используйте getDisplayName, но сохраняйте ID отдельно от локализованного названия.
Прочитать UTCСамостоятельный пример
<?php
declare(strict_types=1);

$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getID(), "
";
Ожидаемый результат
UTC

ID не зависит от языка интерфейса.

Прочитать custom offsetСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 отдельно от локализованного названия.
Прочитать UTCСамостоятельный пример
<?php
declare(strict_types=1);

$zone = IntlTimeZone::createTimeZone("UTC");
echo $zone->getID(), "
";
Ожидаемый результат
UTC

ID не зависит от языка интерфейса.

Прочитать custom offsetСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Подписать GMT смещениемСамостоятельный пример
<?php
declare(strict_types=1);

$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo $zone->getDisplayName(false, IntlTimeZone::DISPLAY_LONG_GMT, "en"), "
";
Ожидаемый результат
GMT+03:00

Явный стиль показывает смещение, а не неопределённое сокращение.

Отделить ID от названияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Подписать GMT смещениемСамостоятельный пример
<?php
declare(strict_types=1);

$zone = IntlTimeZone::createTimeZone("GMT+03:00");
echo $zone->getDisplayName(false, IntlTimeZone::DISPLAY_LONG_GMT, "en"), "
";
Ожидаемый результат
GMT+03:00

Явный стиль показывает смещение, а не неопределённое сокращение.

Отделить ID от названияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlTimeZone::getOffsetВычислить базовый и сезонный сдвиг для конкретного момента, например при показе событий разных городов.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlTimeZone::getOffset(float $timestamp, bool $local, &$rawOffset, &$dstOffset): bool
Аргумент или результатЧто означает на практике
timestampfloat: миллисекунды с Unix-эпохи! Для time()/DateTime timestamp умножайте секунды на 1000.
localfalse: вход обозначает 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 в эту историческую дату.

Объяснить в журнале, почему у события получился UTC+2Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
timestampfloat: миллисекунды с Unix-эпохи! Для time()/DateTime timestamp умножайте секунды на 1000.
localfalse: вход обозначает 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 в эту историческую дату.

Объяснить в журнале, почему у события получился UTC+2Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlTimeZone::hasSameRulesСравнить два пояса по смещению и правилам, не требуя одинаковых ID.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlTimeZone::hasSameRules(IntlTimeZone $other): bool
Аргумент или результатЧто означает на практике
otherВторой IntlTimeZone.
Возвратbool. Одинаковые правила не означают одинаковое географическое имя или одинаковый выбор пользователя. Это проверка правил ICU, а не строкового равенства.
Равный offset не гарантирует равные внутренние правилаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, а не строкового равенства.
Равный offset не гарантирует равные внутренние правилаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Регион помогает группировать настройки, но не заполнять адрес доставки без согласия.

UTC не относится к одной странеСамостоятельный пример
<?php
declare(strict_types=1);

echo intltz_get_region("Etc/UTC"), "
";
Ожидаемый результат
001

Глобальное значение нужно обрабатывать отдельно от кодов стран.

Тот же механизм в процедурной форме: intltz_get_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: IntlTimeZone::createEnumeration.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Регион помогает группировать настройки, но не заполнять адрес доставки без согласия.

UTC не относится к одной странеСамостоятельный пример
<?php
declare(strict_types=1);

echo intltz_get_region("Etc/UTC"), "
";
Ожидаемый результат
001

Глобальное значение нужно обрабатывать отдельно от кодов стран.

Тот же механизм в процедурной форме: intltz_get_region. Объект передаётся первым аргументом, если операция относится к уже созданному объекту.

Рядом по задаче: IntlTimeZone::createEnumeration.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)

Не фиксируем конкретный выпуск: он зависит от окружения.

Раздельно учитывать ICU и TZDBСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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)

Не фиксируем конкретный выпуск: он зависит от окружения.

Раздельно учитывать ICU и TZDBСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, но обозначает зону с её правилами, а не запрет сезонного времени.

Перенести пояс из настроек Windows в IANA-ID веб-сервисаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, но обозначает зону с её правилами, а не запрет сезонного времени.

Перенести пояс из настроек Windows в IANA-ID веб-сервисаСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::createInstanceСоздать календарь с выбранными поясом и языковыми правилами для отчёта или расписания.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static IntlCalendar::createInstance(IntlTimeZone|DateTimeZone|string|null $timezone = null, ?string $locale = null): ?IntlCalendar
Аргумент или результатЧто означает на практике
timezoneIntlTimeZone, 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
timezoneIntlTimeZone, 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 timestampСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 timestampСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 timestampСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 timestampСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 или форматтер.

Не путать 12- и 24-часовые поляСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 или форматтер.

Не путать 12- и 24-часовые поляСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::clearСнять установленные поля перед построением новой даты, чтобы не унаследовать случайное время создания.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlCalendar::clear(?int $field = null): true
Аргумент или результатЧто означает на практике
fieldnull очищает все поля; 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

intlcal_clearСнять установленные поля перед построением новой даты, чтобы не унаследовать случайное время создания.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

intlcal_clear(IntlCalendar $calendar, ?int $field = null): true

Процедурная форма IntlCalendar::clear. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
fieldnull очищает все поля; 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::isSetУзнать, задано ли поле явно/при вычислении, прежде чем решать приоритет календарных полей.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlCalendar::isSet(int $field): bool
Аргумент или результатЧто означает на практике
fieldКонстанта поля.
Возвратbool; unset не равно числовому нулю. Позднее заданные поля имеют преимущество над прежними, очищенные — низший приоритет.
Поле после clearСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 не равно числовому нулю. Позднее заданные поля имеют преимущество над прежними, очищенные — низший приоритет.
Поле после clearСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::fromDateTimeПеренести обычный объект PHP-даты в ICU-календарь.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static IntlCalendar::fromDateTime(DateTime|string $datetime, ?string $locale = null): ?IntlCalendar
Аргумент или результатЧто означает на практике
datetimeDateTime либо строка для конструктора DateTime; в этой сигнатуре не произвольный DateTimeInterface. Строковый синтаксис может выбросить исключение DateTime.
locale?string выбирает календарные языковые правила.
ВозвратIntlCalendar|null. Сохраняются момент и аналогичный пояс, но его правила уже из ICU. Для очень далёких дат возможна потеря точности.
Перенести DateTimeСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
datetimeDateTime либо строка для конструктора DateTime; в этой сигнатуре не произвольный DateTimeInterface. Строковый синтаксис может выбросить исключение DateTime.
locale?string выбирает календарные языковые правила.
ВозвратIntlCalendar|null. Сохраняются момент и аналогичный пояс, но его правила уже из ICU. Для очень далёких дат возможна потеря точности.
Перенести DateTimeСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сохраняет сам момент, но пересчитывает местные поля. Это не перенос события на новые настенные часы.
Прочитать UTCСамостоятельный пример
<?php
declare(strict_types=1);

$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC

Пояс — отдельный объект с правилами переходов.

Тот же момент в UTC+3Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сохраняет сам момент, но пересчитывает местные поля. Это не перенос события на новые настенные часы.
Прочитать UTCСамостоятельный пример
<?php
declare(strict_types=1);

$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC

Пояс — отдельный объект с правилами переходов.

Тот же момент в UTC+3Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сохраняет сам момент, но пересчитывает местные поля. Это не перенос события на новые настенные часы.
Прочитать UTCСамостоятельный пример
<?php
declare(strict_types=1);

$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC

Пояс — отдельный объект с правилами переходов.

Тот же момент в UTC+3Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сохраняет сам момент, но пересчитывает местные поля. Это не перенос события на новые настенные часы.
Прочитать UTCСамостоятельный пример
<?php
declare(strict_types=1);

$calendar = IntlCalendar::createInstance("UTC", "en_US@calendar=gregorian");
$calendar->clear();
$calendar->setTime(0.0);
echo $calendar->getTimeZone()->getID(), "
";
Ожидаемый результат
UTC

Пояс — отдельный объект с правилами переходов.

Тот же момент в UTC+3Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 дня.

1 января может принадлежать прошлому недельному годуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 дня.

1 января может принадлежать прошлому недельному годуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 дня.

1 января может принадлежать прошлому недельному годуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 дня.

1 января может принадлежать прошлому недельному годуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сообщает время границы.
Граница примененияЭто обычные выходные по локали, а не производственный календарь праздников, график сотрудника или юридический календарь страны.
Суббота en_USСамостоятельный пример
<?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.

Понедельник 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сообщает время границы.
Граница примененияЭто обычные выходные по локали, а не производственный календарь праздников, график сотрудника или юридический календарь страны.
Суббота en_USСамостоятельный пример
<?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.

Понедельник 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::getWeekendTransitionПолучить время внутри дня, когда по правилам локали начинаются или заканчиваются выходные.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlCalendar::getWeekendTransition(int $dayOfWeek): int|false
Аргумент или результатЧто означает на практике
dayOfWeekDOW_*; сначала 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
dayOfWeekDOW_*; сначала 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::isWeekendПроверить конкретный момент на попадание в обычный выходной выбранной локали.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlCalendar::isWeekend(?float $timestamp = null): bool
Аргумент или результатЧто означает на практике
timestamp?float миллисекунд Unix-эпохи; null использует момент текущего объекта.
Возвратbool; false может означать ошибку, если календарь в некорректном состоянии. Для производственных праздников нужен отдельный источник данных.
Суббота в en_USСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 может означать ошибку, если календарь в некорректном состоянии. Для производственных праздников нужен отдельный источник данных.
Суббота в en_USСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::isLenientУправлять тем, нормализуются ли выходящие за диапазон календарные поля или вызывают ошибку.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlCalendar::isLenient(): bool
Аргумент или результатЧто означает на практике
lenientbool у 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)

Настройка не проверяет ещё не введённые поля заранее.

Отвергнуть невозможное 30 февраляСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

intlcal_is_lenientУправлять тем, нормализуются ли выходящие за диапазон календарные поля или вызывают ошибку.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

intlcal_is_lenient(IntlCalendar $calendar): bool

Процедурная форма IntlCalendar::isLenient. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
lenientbool у 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)

Настройка не проверяет ещё не введённые поля заранее.

Отвергнуть невозможное 30 февраляСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::setLenientУправлять тем, нормализуются ли выходящие за диапазон календарные поля или вызывают ошибку.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlCalendar::setLenient(bool $lenient): true
Аргумент или результатЧто означает на практике
lenientbool у 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)

Настройка не проверяет ещё не введённые поля заранее.

Отвергнуть невозможное 30 февраляСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

intlcal_set_lenientУправлять тем, нормализуются ли выходящие за диапазон календарные поля или вызывают ошибку.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

intlcal_set_lenient(IntlCalendar $calendar, bool $lenient): true

Процедурная форма IntlCalendar::setLenient. Сигнатура ниже показывает явный аргумент объекта; примеры сопоставляют оба стиля.

Аргумент или результатЧто означает на практике
lenientbool у 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)

Настройка не проверяет ещё не введённые поля заранее.

Отвергнуть невозможное 30 февраляСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCalendar::inDaylightTimeПроверить, активна ли сезонная поправка именно в момент этого календаря.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlCalendar::inDaylightTime(): bool
Аргумент или результатЧто означает на практике
Возвратbool; false может также означать ошибку вычисления. Это проверка конкретного момента, в отличие от общего useDaylightTime у пояса.
UTC не использует DSTСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 у пояса.
UTC не использует DSTСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 возвращает её в григорианской системе.

Объяснить пользователю, почему 29 февраля допустимо не во всяком годуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 возвращает её в григорианской системе.

Объяснить пользователю, почему 29 февраля допустимо не во всяком годуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 не угадывает кодировку и не переводит слова.

UTF-8 можно оставить без измененияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
reversefalse: 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.

Сохранить CSV для получателя, которому нужен Latin-1Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 удобнее объект. Это не потоковый декодер произвольно разрезанных посередине символа чанков.
Разобрать UTF-16BE выгрузку, где между буквами видны нулевые байтыСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сопоставляет код именованной константе и выбирает текст для человека. По одному типу нельзя узнать язык, допустимость произвольной строки или безопасную границу разрезания потока; используйте декодер. Числа констант не нужно зашивать в свой код.

Проверить ASCII конвертерСамостоятельный пример
<?php
declare(strict_types=1);

$converter = new UConverter("US-ASCII", "US-ASCII");
var_dump($converter->getSourceType() === UConverter::US_ASCII);
Ожидаемый результат
bool(true)

Категория не даёт права заменять неизвестные символы без проверки результата.

Рядом по задаче: UConverter::getAvailable.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 сопоставляет код именованной константе и выбирает текст для человека. По одному типу нельзя узнать язык, допустимость произвольной строки или безопасную границу разрезания потока; используйте декодер. Числа констант не нужно зашивать в свой код.

Проверить ASCII конвертерСамостоятельный пример
<?php
declare(strict_types=1);

$converter = new UConverter("US-ASCII", "US-ASCII");
var_dump($converter->getDestinationType() === UConverter::US_ASCII);
Ожидаемый результат
bool(true)

Категория не даёт права заменять неизвестные символы без проверки результата.

Рядом по задаче: UConverter::getAvailable.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

UConverter::getAvailableПроверить набор кодировок конкретной ICU-сборки перед настройкой интеграции.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

static UConverter::getAvailable(): array
Аргумент или результатЧто означает на практике
АргументыНет.
Возвратarray имён доступных конвертеров. Это не полный список всех алиасов: их даёт getAliases. Не фиксируйте число элементов как неизменную характеристику PHP.
UTF-8 доступенСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Важно показать границы: не каждой служебной функции нужно выдумывать роль в каждой форме сайта.

IANA — отдельная схема имёнСамостоятельный пример
<?php
declare(strict_types=1);

$standards = UConverter::getStandards();
var_dump(is_array($standards) && in_array("IANA", $standards, true));
Ожидаемый результат
bool(true)

Наличие схемы не означает, что произвольная строка из заголовка является корректной кодировкой.

Рядом по задаче: UConverter::getAliases.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

UConverter::toUCallbackОпределить политику повреждённых исходных байтов при декодировании.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

UConverter::toUCallback(int $reason, string $source, string $codeUnits, &$error): array|string|int|null
Аргумент или результатЧто означает на практике
reasonREASON_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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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
Аргумент или результатЧто означает на практике
reasonREASON_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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Эвристика не гарантирует визуальную идентичность во всех шрифтах. Для большого каталога не сравнивайте каждую новую строку без индекса/ограничения со всеми историческими значениями.
Защитить зарезервированное имя support от похожего написанияСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 уместен для технического кода с такой спецификацией, но не для произвольного имени человека. Международному продукту нужен профиль, допускающий реальные языки аудитории.
Ограничить машинный код 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

Spoofchecker::setAllowedCharsЗадать точную грамматику допустимых символов для служебного имени.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

Spoofchecker::setAllowedChars(string $pattern, int $patternOptions = 0): void
Аргумент или результатЧто означает на практике
patternUnicodeSet в квадратных скобках, например [a-z0-9]. Это похожая на regex символьная группа, но не полный PCRE с /.../ и якорями.
patternOptions0; либо IGNORE_SPACE отдельно или вместе ровно с одной из CASE_INSENSITIVE, ADD_CASE_MAPPINGS, SIMPLE_CASE_INSENSITIVE. Нельзя передать CASE_INSENSITIVE отдельно или смешать все варианты.
Возврат / ошибкиvoid; неверный pattern или комбинация flags вызывает ValueError. SIMPLE_CASE_INSENSITIVE зависит от достаточно нового ICU.
ПрактикаОграничение набора не проверяет длину, порядок символов и уникальность. Эти правила проверяются отдельно.
Разрешить underscore именно там, где он нужен договоруСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 по тому же объекту.
Один шаг на тексте A я BСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 по тому же объекту.
Один шаг на тексте A я BСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 по тому же объекту.
Один шаг на тексте A я BСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 по тому же объекту.
Один шаг на тексте A я BСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 по тому же объекту.
Один шаг на тексте A я BСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 по тому же объекту.
Один шаг на тексте A я BСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 по тому же объекту.
Один шаг на тексте A я BСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.11Reflection/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 используется только для регистра.

Результат PHP в браузере
Кофе, чай и какао

Рядом по задаче: IntlPartsIterator::getRuleStatus, IntlPartsIterator::getBreakIterator.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Материализация удобна для небольшой строки; на больших текстах обход экономит память.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlBreakIterator::getLocaleУзнать, какие локальные правила фактически выбрал ICU.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlBreakIterator::getLocale(int $type): string|false
Аргумент или результатЧто означает на практике
typeLocale::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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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}; — цифры; .; пропускает остальные точки по одному.
compiledfalse для текстовых правил; 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlCodePointBreakIterator::getLastCodePointУзнать кодовую точку, через которую только что прошёл курсор.

Intl: доступность зависит от операции; примеры проверены на PHP 8.5.11 / ICU 77.1 · intl

IntlCodePointBreakIterator::getLastCodePoint(): int
Аргумент или результатЧто означает на практике
ПараметрыНет. Сначала next/previous; current сам не проходит символ.
Возвратint Unicode code point; при отсутствии доступной точки используется служебное отрицательное значение. Это не символ-строка и не позиция UTF-8.
ОграничениеКодовая точка не равна графеме: буква и комбинируемый знак могут приходить по отдельности.
Числовое значение AСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, а не пустую строку.
Вывести известную Unicode точкуСамостоятельный пример
<?php
declare(strict_types=1);

echo IntlChar::chr(0x20AC), "
";
Ожидаемый результат
€

В отличие от обычного chr, число обозначает Unicode кодовую точку, не один байт 0…255.

Сгенерировать символ из проверенного scalar valueСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
optionsFOLD_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 значению; это не перевод и не транслитерация.

Явно выбрать правило для IСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
Арабская цифра превращается в integerСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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).
Прочитать hex цифруСамостоятельный пример
<?php
declare(strict_types=1);

echo IntlChar::digit("F", 16), "
";
Ожидаемый результат
15

Полноширинная F разрешена этим Unicode API. ASCII-only API может требовать её отклонить, а не принять молча.

Ноль успешен, цифра 2 недопустима для binaryСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlChar::forDigitСформировать один знак выбранной системы счисления при написании форматтера.

PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl

static IntlChar::forDigit(int $digit, int $base = 10): int
Аргумент или результатЧто означает на практике
digitInteger значение одной цифры 0<=digit
base2…36, default10.
ВозвратInteger кодовая точка ASCII0–9/a–z. Для неверного digit/base возвращается 0 (U+0000), не PHPnull. Поэтому не выводите chr результата до проверки 0.
Превратить значение 15 в букву fСамостоятельный пример
<?php
declare(strict_types=1);

$point = IntlChar::forDigit(15, 16);
echo $point, " / ", IntlChar::chr($point), "
";
Ожидаемый результат
102 / f

forDigit возвращаетномер, chr создаёт UTF-8 строку. Для целого числа произвольной длины нужен отдельный алгоритм/base formatter.

Не вставить NUL при недопустимой цифреСамостоятельный пример
<?php
declare(strict_types=1);

$point = IntlChar::forDigit(2, 2);
echo $point === 0 ? "Цифра не входит в основание
" : IntlChar::chr($point);
Ожидаемый результат
Цифра не входит в основание

Успешная цифра 0 имееткод 48, поэтому sentinel0 не конфликтует с обычным символом"0".

Рядом по задаче: IntlChar::digit, IntlChar::chr.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Неверное свойство не всегда вызывает исключение.
Проверить Alphabetic у кириллической буквыСамостоятельный пример
<?php
declare(strict_types=1);

var_dump(IntlChar::hasBinaryProperty("Я", IntlChar::PROPERTY_ALPHABETIC));
Ожидаемый результат
bool(true)

Вопрос относится к UCD свойству; конкретный язык по этому признаку не определяется.

Показать, какие точки изменит lowercaseСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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; переворачивать массив букв вручную неправильно.
Сопоставить еврейскую букву с RTL классомСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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. Пустой результат не означает, что исходную букву нужно удалить.
У обычной буквы нет дополнительного closureСамостоятельный пример
<?php
declare(strict_types=1);

var_dump(IntlChar::getFC_NFKC_Closure("A"));
Ожидаемый результат
string(0) ""

A обрабатывается основным алгоритмом. Пустая строка означает отсутствие дополнительного mapping.

Посмотреть 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
propertyPROPERTY_* 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 — другое, более широкое свойство.

Прочитать East Asian Width полноширинной буквыСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlChar::getIntPropertyMinValueПолучить нижнюю границу значений integer свойства перед построением диагностического списка.

PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl

static IntlChar::getIntPropertyMinValue(int $property): int
Аргумент или результатЧто означает на практике
propertyInteger/enum/binary PROPERTY_* selector.
ВозвратМинимальное integer значение;0 при неподдержанном selector. По одному нулю нельзя отличить ошибочный selector от обычного минимума.
Получить минимум binary свойстваСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlChar::getIntPropertyMaxValueУзнать верхнюю границу значений именно установленной Unicode базы, не зашивая старое число.

PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl

static IntlChar::getIntPropertyMaxValue(int $property): int
Аргумент или результатЧто означает на практике
propertyInteger/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.

Отвергнуть неизвестный selector до перебораСамостоятельный пример
<?php
declare(strict_types=1);

$max = IntlChar::getIntPropertyMaxValue(IntlChar::PROPERTY_INVALID_CODE);
echo $max < 0 ? "Не поддерживается
" : "Есть диапазон
";
Ожидаемый результат
Не поддерживается

У каждого метода свой sentinel: здесь-1, у hasBinaryProperty возможно false без отдельной ошибки.

Рядом по задаче: IntlChar::getIntPropertyMinValue, IntlChar::getIntPropertyValue.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Не принять опечатку за property0Самостоятельный пример
<?php
declare(strict_types=1);

$property = IntlChar::getPropertyEnum("catalog_rating");
echo $property === IntlChar::PROPERTY_INVALID_CODE ? "Такого свойства Unicode нет
" : "Свойство найдено
";
Ожидаемый результат
Такого свойства Unicode нет

Прикладной рейтинг каталога не является свойством UCD. Для него нужна собственная схема.

Рядом по задаче: IntlChar::getPropertyName, IntlChar::getPropertyValueEnum.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 не является рабочим свойством.
typeLONG_PROPERTY_NAME по умолчанию или SHORT_PROPERTY_NAME. Дополнительные aliases возможны как LONG+1 и далее. Отсутствие короткого имени не отменяет длинного.
Возвратstring либо false, если property/type не поддержан. Актуальная сигнатура не возвращает null. Для General_Category_Mask также поддержано короткое gcm.
Получить имя bidi свойстваСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlChar::getPropertyValueEnumПревратить название категории или блока в значение конкретного свойства.

PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl

static IntlChar::getPropertyValueEnum(int $property, string $name): int
Аргумент или результатЧто означает на практике
propertySelector, например PROPERTY_GENERAL_CATEGORY или PROPERTY_BLOCK.
nameAlias значения по 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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, valueSelector и код значения именно этого свойства. Для общих масок категорий нужен GENERAL_CATEGORY_MASK.
typeLONG_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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
typeUNICODE_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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.
typeUNICODE_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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 не является командой остановить перечисление.
typeUNICODE_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 каждый раз приходит конкретная точка диапазона.

Сразу ограничить диапазон, а не рассчитывать на returnfalseСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

IntlChar::enumCharTypesСоставить компактные диапазоны категорий Unicode вместо отдельной записи на каждую точку.

PHP 7+; примеры PHP 8.5 / ICU 77.1, Unicode 16.0 · intl

static IntlChar::enumCharTypes(callable $callback): void
Аргумент или результатЧто означает на практике
callbackcallback(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 посетил всю таблицу.

Посчитать покрытие только ASCII прописных буквСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Сохранить диагноз неверного UTF-8Самостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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

Успех не нужно угадывать по длине результата.

Не принять false за пустую строкуСамостоятельный пример
<?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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

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 может быть нежелательно по бизнес-контракту, хотя технически операция успешна. Проверка такого требования — отдельная ветка политики приложения.
Успех, 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.

Локаль, ICU и первые примеры · Ошибки и воспроизводимость.

Источники и обсуждения

Код и руководство с собой

Скачайте самостоятельные примеры с исходными данными, инструкциями и ожидаемыми результатами. Примеры HTTP и фрагменты для проекта помечены отдельно: им нужно указанное окружение.

Код не исполняется на сайте. Скачайте нужный пример и запускайте его в своём локальном окружении.

Материалы сверены 2026-10-12. Примеры и объяснения написаны для этого руководства; источники и обсуждения доступны в каждой главе.