]> granicus.if.org Git - php/commitdiff
Fix bug #62441
authorNikita Popov <nikic@php.net>
Fri, 28 Aug 2015 16:58:49 +0000 (18:58 +0200)
committerNikita Popov <nikic@php.net>
Fri, 28 Aug 2015 17:00:05 +0000 (19:00 +0200)
These checks were introduced by 8646d9afce989718cde927c526684bbbc1c96e97
back when name resolution was working differently.

Zend/tests/bug62441.phpt [new file with mode: 0644]
Zend/zend_inheritance.c

diff --git a/Zend/tests/bug62441.phpt b/Zend/tests/bug62441.phpt
new file mode 100644 (file)
index 0000000..3299f49
--- /dev/null
@@ -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
+
index 0d02bf7797cbb3d99d442d664bb0f22f037580a0..73b67f52169bc46e1b6a28e6bb5d458a2460c050 100644 (file)
@@ -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);