summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/bug62441.phpt20
-rw-r--r--Zend/zend_inheritance.c6
2 files changed, 21 insertions, 5 deletions
diff --git a/Zend/tests/bug62441.phpt b/Zend/tests/bug62441.phpt
new file mode 100644
index 0000000000..3299f4967d
--- /dev/null
+++ b/Zend/tests/bug62441.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #62441: Incorrect strong typing in namespaced child classes
+--FILE--
+<?php
+namespace {
+ interface Iface {
+ function method(stdClass $o);
+ }
+}
+namespace ns {
+ class Foo implements \Iface {
+ function method(stdClass $o) { }
+ }
+
+ (new Foo)->method(new \stdClass);
+}
+?>
+--EXPECTF--
+Fatal error: Declaration of ns\Foo::method(ns\stdClass $o) must be compatible with Iface::method(stdClass $o) in %s on line %d
+
diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c
index 0d02bf7797..73b67f5216 100644
--- a/Zend/zend_inheritance.c
+++ b/Zend/zend_inheritance.c
@@ -213,15 +213,11 @@ static int zend_do_perform_type_hint_check(const zend_function *fe, zend_arg_inf
}
if (strcasecmp(ZSTR_VAL(fe_class_name), ZSTR_VAL(proto_class_name)) != 0) {
- const char *colon;
-
if (fe->common.type != ZEND_USER_FUNCTION) {
zend_string_release(proto_class_name);
zend_string_release(fe_class_name);
return 0;
- } else if (strchr(ZSTR_VAL(proto_class_name), '\\') != NULL ||
- (colon = zend_memrchr(ZSTR_VAL(fe_class_name), '\\', ZSTR_LEN(fe_class_name))) == NULL ||
- strcasecmp(colon+1, ZSTR_VAL(proto_class_name)) != 0) {
+ } else {
zend_class_entry *fe_ce, *proto_ce;
fe_ce = zend_lookup_class(fe_class_name);