(Pierre)
- Fixed bug #50023 (pdo_mysql doesn't use PHP_MYSQL_UNIX_SOCK_ADDR). (Ilia)
+- Fixed bug #49719 (ReflectionClass::hasProperty returns true for a private
+ property in base class). (Felipe)
- Fixed bug #49142 (crash when exception thrown from __tostring()).
(David Soria Parra)
- Fixed bug #49990 (SNMP3 warning message about security level printed twice).
ZEND_METHOD(reflection_class, hasProperty)
{
reflection_object *intern;
+ zend_property_info *property_info;
zend_class_entry *ce;
char *name;
int name_len;
}
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)) {
--> 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)
--- /dev/null
+--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)