diff options
Diffstat (limited to 'ext/reflection')
| -rw-r--r-- | ext/reflection/php_reflection.c | 9 | ||||
| -rw-r--r-- | ext/reflection/tests/ReflectionClass_hasProperty_001.phpt | 2 | ||||
| -rw-r--r-- | ext/reflection/tests/bug49719.phpt | 44 |
3 files changed, 51 insertions, 4 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index a1ee0d6eb1..9589307f04 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3512,6 +3512,7 @@ ZEND_METHOD(reflection_class, getMethods) ZEND_METHOD(reflection_class, hasProperty) { reflection_object *intern; + zend_property_info *property_info; zend_class_entry *ce; char *name; int name_len; @@ -3523,11 +3524,13 @@ ZEND_METHOD(reflection_class, hasProperty) } GET_REFLECTION_OBJECT_PTR(ce); - if (zend_hash_exists(&ce->properties_info, name, name_len + 1)) { + if (zend_hash_find(&ce->properties_info, 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)) - { + if (intern->obj && Z_OBJ_HANDLER_P(intern->obj, has_property)) { MAKE_STD_ZVAL(property); ZVAL_STRINGL(property, name, name_len, 1); if (Z_OBJ_HANDLER_P(intern->obj, has_property)(intern->obj, property, 0 TSRMLS_CC)) { 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-- +<?php + +class A { + private $a; +} +class B extends A { + private $b; +} + +try { + $b = new B; + $ref = new ReflectionClass($b); + + var_dump(property_exists('b', 'a')); + var_dump(property_exists($b, 'a')); + var_dump($ref->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) |
