scope->ce_flags |= ZEND_ACC_EXPLICIT_ABSTRACT_CLASS;
}
}
- if (ptr->flags & ZEND_ACC_STATIC) {
+ if (ptr->flags & ZEND_ACC_STATIC && (!scope || (scope->ce_flags & ZEND_ACC_INTERFACE))) {
zend_error(error_type, "Static function %s%s%s() cannot be abstract", scope ? scope->name : "", scope ? "::" : "", ptr->fname);
}
} else {
} else {
fn_flags = 0;
}
- if ((fn_flags & ZEND_ACC_STATIC) && (fn_flags & ZEND_ACC_ABSTRACT)) {
+ if ((fn_flags & ZEND_ACC_STATIC) && (fn_flags & ZEND_ACC_ABSTRACT) && !(CG(active_class_entry)->ce_flags & ZEND_ACC_INTERFACE)) {
zend_error(E_COMPILE_ERROR, "Static function %v%s%R() cannot be abstract", is_method ? CG(active_class_entry)->name : "", is_method ? "::" : "", Z_TYPE(function_name->u.constant), Z_UNIVAL(function_name->u.constant));
}
--TEST--
-ZE2 A static abstrcat method may not be called
---SKIPIF--
-<?php if (version_compare(zend_version(), '2.0.0-dev', '<')) die('skip ZendEngine 2 needed'); ?>
+ZE2 A static abstrcat methods
--FILE--
<?php
-abstract class fail {
- abstract static function show();
+interface showable
+{
+ static function show();
}
-class pass extends fail {
+class pass implements showable
+{
static function show() {
echo "Call to function show()\n";
}
}
pass::show();
+
+eval('
+class fail
+{
+ abstract static function func();
+}
+');
+
fail::show();
echo "Done\n"; // shouldn't be displayed
--EXPECTF--
Call to function show()
-Fatal error: Cannot call abstract method fail::show() in %s on line %d
+Fatal error: Static function fail::func() cannot be abstract in %s on line %d