]> granicus.if.org Git - php/commitdiff
MFH: Fixed bug #48336 (ReflectionProperty::getDeclaringClass() does not
authorArnaud Le Blanc <lbarnaud@php.net>
Thu, 21 May 2009 16:01:37 +0000 (16:01 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Thu, 21 May 2009 16:01:37 +0000 (16:01 +0000)
work with redeclared property)
(patch by Markus dot Lidel at shadowconnect dot com)

ext/reflection/php_reflection.c
ext/reflection/tests/bug48336.phpt [new file with mode: 0644]

index 5e14ec4fbec2ac11de2a8d4b3c2f9545f906f653..93fb1701fb46d7c291a2e4da7082f12cf7f8ca85 100644 (file)
@@ -4603,6 +4603,10 @@ ZEND_METHOD(reflection_property, getDeclaringClass)
                        break;
                }
                ce = tmp_ce;
+               if (tmp_ce == tmp_info->ce) {
+                       /* declared in this class, done */
+                       break;
+               }
                tmp_ce = tmp_ce->parent;
        }
 
diff --git a/ext/reflection/tests/bug48336.phpt b/ext/reflection/tests/bug48336.phpt
new file mode 100644 (file)
index 0000000..ee90675
--- /dev/null
@@ -0,0 +1,44 @@
+--TEST--
+Bug #48286 (ReflectionProperty::getDeclaringClass() does not work with redeclared properties)
+--FILE--
+<?php
+class A {
+}
+
+class B extends A {
+  static protected $prop;
+}
+
+class C extends B {
+  static protected $prop;
+}
+
+class D extends C {
+}
+
+class E extends D {
+}
+
+class F extends E {
+  static protected $prop;
+}
+
+$class = 'A';
+for($class = 'A'; $class <= 'F'; $class ++) {
+  print($class.' => ');
+  try {
+    $rp = new ReflectionProperty($class, 'prop');
+    print($rp->getDeclaringClass()->getName());
+  } catch(Exception $e) {
+    print('N/A');
+  }
+  print("\n");
+}
+?>
+--EXPECT--
+A => N/A
+B => B
+C => C
+D => C
+E => C
+F => F