Category
Language · php-src-strict · profile gate · pillar 4
Problem
#29084 / #29106 made class_alias() of internal classes succeed to match Zend 8.3+. On Zend 8.1/8.2, the same call still throws ValueError: class_alias(): Argument #1 ($class) must be a user-defined class name, internal class name given.
With PHP_COMPILER_PROFILE=8.2 (and 8.1), VM/JIT still return true for stdClass / Exception / Traversable aliases — no profile gate.
Verified 2026-08-08 on master @ 98b7c4dc4b vs php:8.2-cli (8.2.32) and php:8.4-cli (8.4.24).
| Repro |
Zend 8.2.32 |
Zend 8.4.24 |
VM/JIT PROFILE=8.2 |
VM PROFILE=8.4 |
class_alias(stdClass::class, 'A') |
ValueError |
true |
true ❌ |
true OK |
class_alias(Exception::class, 'E') |
ValueError |
true |
true ❌ |
true OK |
class_alias(User::class, 'U') (user) |
true |
true |
true OK |
true OK |
php-src reference
- php/php-src
Zend/zend_builtin_functions.c (PHP-8.2) — zend_argument_value_error(1, \"must be a user-defined class name, internal class name given\") for internal ce
- Behavior change: restriction lifted in 8.3+ (no ValueError for fresh alias of internal class)
PHP implementation target
Repro
./script/docker-exec.sh -- bash -lc 'source script/php-env.sh
cat > /tmp/class_alias_internal_82.php << \"PHP\"
<?php
error_reporting(E_ALL);
try {
var_export(class_alias(stdClass::class, \"AliasStd_\" . bin2hex(random_bytes(3))));
} catch (Throwable $e) {
echo get_class($e), \":\", $e->getMessage();
}
echo \"\n\";
PHP
PHP_COMPILER_PROFILE=8.2 php bin/vm.php /tmp/class_alias_internal_82.php
PHP_COMPILER_PROFILE=8.2 php bin/jit.php /tmp/class_alias_internal_82.php
# expect ValueError matching php:8.2-cli
'
Done when
Category
Language· php-src-strict · profile gate · pillar 4Problem
#29084 / #29106 made
class_alias()of internal classes succeed to match Zend 8.3+. On Zend 8.1/8.2, the same call still throwsValueError: class_alias(): Argument #1 ($class) must be a user-defined class name, internal class name given.With
PHP_COMPILER_PROFILE=8.2(and 8.1), VM/JIT still returntrueforstdClass/Exception/Traversablealiases — no profile gate.Verified 2026-08-08 on master @
98b7c4dc4bvsphp:8.2-cli(8.2.32) andphp:8.4-cli(8.4.24).class_alias(stdClass::class, 'A')ValueErrortruetrue❌trueOKclass_alias(Exception::class, 'E')ValueErrortruetrue❌trueOKclass_alias(User::class, 'U')(user)truetruetrueOKtrueOKphp-src reference
Zend/zend_builtin_functions.c(PHP-8.2) —zend_argument_value_error(1, \"must be a user-defined class name, internal class name given\")for internalcePHP implementation target
lib// VM + JITclass_aliaspath — whenPHP_COMPILER_PROFILE≤ 8.2, reject internal class/interface operands with Zend'sValueErrormessage; keep Regression: class_alias() rejects internal classes with ValueError — Zend allows stdClass/Exception aliases (re-#18290, Zend/zend_builtin_functions.c) #29084 allow path for PROFILE ≥ 8.3falsepath unchangedRepro
Done when
ValueErrorfor internal class/interface operands (stdClass,Exception,Traversable, …)truefor fresh internal aliases (no Regression: class_alias() rejects internal classes with ValueError — Zend allows stdClass/Exception aliases (re-#18290, Zend/zend_builtin_functions.c) #29084 regression)class_aliasstill succeeds on all profiles.phptundertest/compliance/cases/with PROFILE SKIPIF