From: Felipe Pena Date: Sun, 1 Nov 2009 15:12:34 +0000 (+0000) Subject: - Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private property... X-Git-Tag: php-5.4.0alpha1~191^2~2447 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c768256cae2d08066955b079b615d82c54479a2f;p=php - Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class) --- diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 5abb9e9749..5043d81107 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3673,6 +3673,7 @@ ZEND_METHOD(reflection_class, getMethods) ZEND_METHOD(reflection_class, hasProperty) { reflection_object *intern; + zend_property_info *property_info; zend_class_entry *ce; zstr name; int name_len; @@ -3685,7 +3686,10 @@ ZEND_METHOD(reflection_class, hasProperty) } GET_REFLECTION_OBJECT_PTR(ce); - if (zend_u_hash_exists(&ce->properties_info, name_type, name, name_len + 1)) { + if (zend_u_hash_find(&ce->properties_info, name_type, name, name_len+1, (void **) &property_info) == SUCCESS) { + if (property_info->flags & ZEND_ACC_SHADOW) { + RETURN_FALSE; + } RETURN_TRUE; } else { if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property)) diff --git a/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt b/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt index 94f739c33c..88c4cd509a 100644 --- a/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt +++ b/ext/reflection/tests/ReflectionClass_hasProperty_001.phpt @@ -69,7 +69,7 @@ Reflecting on class privf: --> Check for doesntExist: bool(false) Reflecting on class subprivf: --> Check for s: bool(true) - --> Check for a: bool(true) + --> Check for a: bool(false) --> Check for A: bool(false) --> Check for doesntExist: bool(false) diff --git a/ext/reflection/tests/bug49719.phpt b/ext/reflection/tests/bug49719.phpt new file mode 100644 index 0000000000..215140a45a --- /dev/null +++ b/ext/reflection/tests/bug49719.phpt @@ -0,0 +1,44 @@ +--TEST-- +Bug #49719 (ReflectionClass::hasProperty returns true for a private property in base class) +--FILE-- +hasProperty('a')); + var_dump($ref->getProperty('a')); +} catch (Exception $e) { + var_dump($e->getMessage()); +} + +class A2 { + private $a = 1; +} + +class B2 extends A2 { + private $a = 2; +} + +$b2 = new ReflectionClass('B2'); +$prop = $b2->getProperty('a'); +$prop->setAccessible(true); +var_dump($prop->getValue(new b2)); + +?> +--EXPECTF-- +bool(false) +bool(false) +bool(false) +%string|unicode%(25) "Property a does not exist" +int(2)