Skip to content

ext/intl: Expose Spoofchecker restriction-level APIs on all supported ICU versions#22055

Closed
LamentXU123 wants to merge 3 commits into
php:PHP-8.4from
LamentXU123:bug-fix-15
Closed

ext/intl: Expose Spoofchecker restriction-level APIs on all supported ICU versions#22055
LamentXU123 wants to merge 3 commits into
php:PHP-8.4from
LamentXU123:bug-fix-15

Conversation

@LamentXU123

@LamentXU123 LamentXU123 commented May 15, 2026

Copy link
Copy Markdown
Contributor

Those constants (functions) are made out of the version guard of ICU >= 58 in this PR.

  • Spoofchecker::ASCII
  • Spoofchecker::HIGHLY_RESTRICTIVE
  • Spoofchecker::MODERATELY_RESTRICTIVE
  • Spoofchecker::MINIMALLY_RESTRICTIVE
  • Spoofchecker::UNRESTRICTIVE
  • Spoofchecker::SINGLE_SCRIPT_RESTRICTIVE
  • Spoofchecker::MIXED_NUMBERS
  • Spoofchecker::setRestrictionLevel()

Fixes #22053

@LamentXU123 LamentXU123 marked this pull request as ready for review May 16, 2026 05:47
<?php
$r = new ReflectionClass("Spoofchecker");

var_dump($r->getConstant("ASCII") !== false);

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Test asserts existence only; that's fine since spoofchecker_007.phpt covers behavior, but asserting the constants are distinct integers would also catch a future
fallback collision.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added. I don't sure if this time my test is a little bit too verbose

@devnexen devnexen closed this in 438ad64 May 17, 2026
pull Bot pushed a commit to ppker/php-src that referenced this pull request May 17, 2026
… ICU versions

Also fix the constant names referenced in the Spoofchecker::setAllowedChars()
error message (CASE_INSENSITIVE / ADD_CASE_MAPPINGS / SIMPLE_CASE_INSENSITIVE
rather than their USET_-prefixed counterparts).

Fix php#22053

close phpGH-22055
GrahamCampbell added a commit to GrahamCampbell/php-src that referenced this pull request Jun 7, 2026
PHP 8.4.22 fails to build the intl extension against ICU 50.x. The change that
landed for phpGH-22055 removed the U_ICU_VERSION_MAJOR_NUM >= 58 guards around the
Spoofchecker restriction-level constants (ASCII, HIGHLY_RESTRICTIVE,
MODERATELY_RESTRICTIVE, MINIMALLY_RESTRICTIVE, UNRESTRICTIVE,
SINGLE_SCRIPT_RESTRICTIVE and MIXED_NUMBERS) and the setRestrictionLevel()
method, so the extension references those ICU symbols unconditionally. That is
fine on master and PHP-8.5, where build/php.m4 requires icu-uc >= 57.1, but on
PHP-8.4 the minimum is still icu-uc >= 50.1 and the symbols do not exist that far
back. On a system with ICU 50.x such as Amazon Linux 2 (ICU 50.2, which
satisfies the 50.1 requirement) configure succeeds and the compile then fails
with USPOOF_ASCII, the other restriction-level constants and URestrictionLevel
undeclared.

The correct floor is ICU 53: these symbols, URestrictionLevel and
uspoof_setRestrictionLevel() exist since ICU 51, except
USPOOF_SINGLE_SCRIPT_RESTRICTIVE which was added in ICU 53 and is referenced both
as a constant and in the setRestrictionLevel() body. Guarding at ICU 53 restores
the build on every ICU version PHP-8.4 supports while keeping the
restriction-level API exposed on ICU 53 and later, preserving the intent of
phpGH-22055 (the previous >= 58 guard was too strict and hid the API on ICU 57.x).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants