summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikic@php.net>2015-08-28 18:58:49 +0200
committerNikita Popov <nikic@php.net>2015-08-28 19:00:05 +0200
commitccec609b82b69ef96bc52f7c563c7eb8a68f99a0 (patch)
treea28a647f596f29cfdd64e8065b600f01599fe66b
parent7f2261d24a1304d144ad2ba60ad3fd70be923f35 (diff)
downloadphp-git-ccec609b82b69ef96bc52f7c563c7eb8a68f99a0.tar.gz
Fix bug #62441
These checks were introduced by 8646d9afce989718cde927c526684bbbc1c96e97 back when name resolution was working differently.
-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);