Category
Regression · php-src-strict · phantom builtin (Pillar 4)
Problem
mb_ucwords() was added as a “PHP 8.4” forward-profile API (#20799 / #21394 / compliance mb_ucwords_forward84.phpt). Zend php-src never ships mb_ucwords — probed 2026-07-20 against php:8.4-cli (8.4.23) and php:8.5-cli (8.5.8) with mbstring enabled: function_exists('mb_ucwords') === false. Title-case on Zend is mb_convert_case($s, MB_CASE_TITLE).
This reverses the wrong-direction “fix” that treated a missing phantom as a real parity gap.
| Repro |
Zend 8.4.23 / 8.5.8 + mbstring |
VM PHP_COMPILER_PROFILE=8.4 |
function_exists('mb_ucwords') |
false |
true ❌ |
mb_ucwords('hello world') |
undefined function |
Hello World |
Default / 8.2 profile already hides it (mb_ucwords_phantom.phpt green).
php-src reference
PHP implementation target
- Gate off / remove
ext/mbstring/mb_ucwords.php registration on all profiles (including 8.4 forward)
- Flip
test/compliance/cases/mbstring/mb_ucwords_forward84.phpt (+ related) to expect absence; keep phantom guard
- PHP-in-PHP only; no new C
Repro
./script/docker-exec.sh -- bash -lc 'export PHP_COMPILER_PROFILE=8.4
printf "%s\n" "<?php echo function_exists(\"mb_ucwords\") ? \"exists:yes\" : \"exists:no\";" > /tmp/mb_ucwords_phantom.php
php bin/vm.php /tmp/mb_ucwords_phantom.php
# expect exists:no; currently exists:yes
'
Done when
Related
Category
Regression· php-src-strict · phantom builtin (Pillar 4)Problem
mb_ucwords()was added as a “PHP 8.4” forward-profile API (#20799 / #21394 / compliancemb_ucwords_forward84.phpt). Zend php-src never shipsmb_ucwords— probed 2026-07-20 againstphp:8.4-cli(8.4.23) andphp:8.5-cli(8.5.8) withmbstringenabled:function_exists('mb_ucwords') === false. Title-case on Zend ismb_convert_case($s, MB_CASE_TITLE).This reverses the wrong-direction “fix” that treated a missing phantom as a real parity gap.
PHP_COMPILER_PROFILE=8.4function_exists('mb_ucwords')falsetrue❌mb_ucwords('hello world')Hello WorldDefault / 8.2 profile already hides it (
mb_ucwords_phantom.phptgreen).php-src reference
ext/mbstring/mbstring.c— nomb_ucwords; usemb_convert_case/MB_CASE_TITLEmb_convert_case()(same file)PHP implementation target
ext/mbstring/mb_ucwords.phpregistration on all profiles (including 8.4 forward)test/compliance/cases/mbstring/mb_ucwords_forward84.phpt(+ related) to expect absence; keep phantom guardRepro
Done when
PHP_COMPILER_PROFILE=8.4:function_exists('mb_ucwords') === false(match Zend)Related