MFH: #39001 (ReflectionProperty returns incorrect declaring class for protected properties)

This commit is contained in:
Antony Dovgal 2006-10-02 12:16:35 +00:00
parent 2b1b2db8ec
commit c356ad3b65
3 changed files with 38 additions and 2 deletions

2
NEWS
View File

@ -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)

View 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);

View File

@ -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