Closed
Description
Description
The following code:
<?php
interface A {
public function a(): void;
}
enum B implements A {
}
Resulted in this output:
PHP Fatal error: Class E contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (I::a) in Command line code on line 1
But I expected this output instead:
PHP Fatal error: Enum E contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (I::a) in Command line code on line 1
Patch:
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 3ef291c315..04d5728ef1 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -4789,6 +4789,8 @@ ZEND_API ZEND_COLD const char *zend_get_object_type(const zend_class_entry *ce)
return "trait";
} else if (ce->ce_flags & ZEND_ACC_INTERFACE) {
return "interface";
+ } else if (ce->ce_flags & ZEND_ACC_ENUM) {
+ return "enum";
} else {
return "class";
}
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 82af3d8afa..002da24383 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -2324,9 +2324,13 @@ void zend_verify_abstract_class(zend_class_entry *ce) /* {{{ */
} ZEND_HASH_FOREACH_END();
if (ai.cnt) {
+ char* kind = strdup(zend_get_object_type(ce));
+ kind[0] = toupper(kind[0]);
+
zend_error_noreturn(E_ERROR, !is_explicit_abstract
- ? "Class %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining methods (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")"
- : "Class %s must implement %d abstract private method%s (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")",
+ ? "%s %s contains %d abstract method%s and must therefore be declared abstract or implement the remaining methods (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")"
+ : "%s %s must implement %d abstract private method%s (" MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT MAX_ABSTRACT_INFO_FMT ")",
+ kind,
ZSTR_VAL(ce->name), ai.cnt,
ai.cnt > 1 ? "s" : "",
DISPLAY_ABSTRACT_FN(0),
PHP Version
8.1.*
Operating System
Irrelevant