]> granicus.if.org Git - php/commitdiff
MFH: #39001 (ReflectionProperty returns incorrect declaring class for protected prope...
authorAntony Dovgal <tony2001@php.net>
Mon, 2 Oct 2006 12:16:35 +0000 (12:16 +0000)
committerAntony Dovgal <tony2001@php.net>
Mon, 2 Oct 2006 12:16:35 +0000 (12:16 +0000)
NEWS
ext/reflection/php_reflection.c
ext/reflection/tests/bug39001.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 7861123bf12c7482da2d5b146aaad6102d0bacb9..2182ee1a9f741a6e8382fda8621fedc38c20ae34 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@ PHP                                                                        NEWS
   working exactly like in php.ini; with FastCGI -d affects all requests).
   (Dmitry)
 - Fixed bug #39003 (__autoload() is called for type hinting). (Dmitry, Tony)
+- Fixed bug #39001 (ReflectionProperty returns incorrect declaring class for 
+  protected properties). (Tony)
 - Fixed bug #38993 (Fixed safe_mode/open_basedir checks for
   session.save_path, allowing them to account for extra parameters). (Ilia)
 - Fixed bug #38981 (using FTP URLs in get_headers() causes crash). (Tony)
index 65ad634949231671872e283454931f5e5efaa0c4..d7d17f7618b6ee1a8a58bf1fe6c3b4e48ccd2b6c 100644 (file)
@@ -4008,14 +4008,21 @@ ZEND_METHOD(reflection_property, getDeclaringClass)
        property_reference *ref;
        zend_class_entry *tmp_ce, *ce;
        zend_property_info *tmp_info;
+       char *prop_name, *class_name;
+       int prop_name_len;
 
        METHOD_NOTSTATIC_NUMPARAMS(reflection_property_ptr, 0);
        GET_REFLECTION_OBJECT_PTR(ref);
 
+       if (zend_unmangle_property_name(ref->prop->name, ref->prop->name_length, &class_name, &prop_name) != SUCCESS) {
+               RETURN_FALSE;
+       }
+
+       prop_name_len = strlen(prop_name);
        ce = tmp_ce = ref->ce;
-       while (tmp_ce && zend_hash_find(&tmp_ce->properties_info, ref->prop->name, ref->prop->name_length + 1, (void **) &tmp_info) == SUCCESS) {
+       while (tmp_ce && zend_hash_find(&tmp_ce->properties_info, prop_name, prop_name_len + 1, (void **) &tmp_info) == SUCCESS) {
                ce = tmp_ce;
-                tmp_ce = tmp_ce->parent;
+               tmp_ce = tmp_ce->parent;
        }
 
        zend_reflection_class_factory(ce, return_value TSRMLS_CC);
diff --git a/ext/reflection/tests/bug39001.phpt b/ext/reflection/tests/bug39001.phpt
new file mode 100644 (file)
index 0000000..1ed675f
--- /dev/null
@@ -0,0 +1,27 @@
+--TEST--
+Bug #39001 (ReflectionProperty returns incorrect declaring class for protected properties)
+--FILE--
+<?php
+
+class Meta {
+}
+
+class CParent extends Meta {
+       public $publicVar;
+       protected $protectedVar;
+}
+
+class Child extends CParent {
+}
+
+$r = new ReflectionClass('Child');
+
+var_dump($r->getProperty('publicVar')->getDeclaringClass()->getName());
+var_dump($r->getProperty('protectedVar')->getDeclaringClass()->getName());
+
+echo "Done\n";
+?>
+--EXPECTF--    
+string(7) "CParent"
+string(7) "CParent"
+Done