Category
Language · php-src-strict · enum defaults (re-#9715 / #5885)
Problem
Zend allows enum cases as defaults when the parameter type is self (or the enum name) on enum methods/static methods. This compiler still rejects self $e = self::A at compile time with Cannot use object as default value for parameter … of type self, even though E $e = E::A on ordinary functions/classes already works (2026-07-22).
| Repro |
Zend 8.2+ |
VM (2026-07-22) |
enum E { case A; public static function f(self $e = self::A){ return $e->name; } } echo E::f(); |
A |
parseAndCompile failure: Cannot use object as default value for parameter $e of type self |
function f(E $e = E::A) / class C { function f(E $e = E::A) } |
OK |
OK |
php-src reference
PHP implementation target
lib/Compiler.php — when materializing parameter defaults, resolve self/static in enum scope to the enum class before the “object default” reject path (same path that already accepts E::A for named enum types)
- Keep invalid cross-type defaults as compile errors per Zend
- PHP-in-PHP; no new C
Repro
./script/docker-exec.sh -- bash -lc 'cat >/tmp/enum_self_default.php <<'"'"'P'"'"'
<?php
enum E {
case A;
case B;
public function other(self $e = self::A): string {
return $e->name;
}
public static function make(self $e = self::B): string {
return $e->name;
}
}
echo E::A->other(), "|", E::make(), "\n";
P
php /tmp/enum_self_default.php
php bin/vm.php /tmp/enum_self_default.php'
Done when
Related
Category
Language· php-src-strict · enum defaults (re-#9715 / #5885)Problem
Zend allows enum cases as defaults when the parameter type is
self(or the enum name) on enum methods/static methods. This compiler still rejectsself $e = self::Aat compile time withCannot use object as default value for parameter … of type self, even thoughE $e = E::Aon ordinary functions/classes already works (2026-07-22).enum E { case A; public static function f(self $e = self::A){ return $e->name; } } echo E::f();AparseAndCompile failure: Cannot use object as default value for parameter $e of type selffunction f(E $e = E::A)/class C { function f(E $e = E::A) }php-src reference
Zend/zend_compile.c— default value validation /selfresolution in enum scopeZend/zend_enum.c— enum case as constant expressionPHP implementation target
lib/Compiler.php— when materializing parameter defaults, resolveself/staticin enum scope to the enum class before the “object default” reject path (same path that already acceptsE::Afor named enum types)Repro
Done when
A|Bon VM (and JIT/AOT when in scope)E $e = E::Adefaults remain green.phptundertest/compliance/cases/language/Related