diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/reflection/php_reflection.c | 13 | ||||
-rw-r--r-- | ext/reflection/tests/ReflectionProperty_getValue_error.phpt | 2 | ||||
-rw-r--r-- | ext/reflection/tests/bug72174.phpt | 36 |
3 files changed, 48 insertions, 3 deletions
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 2a7ff61957..38cfec6aa9 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5649,9 +5649,16 @@ ZEND_METHOD(reflection_property, getValue) } zend_unmangle_property_name_ex(ref->prop.name, &class_name, &prop_name, &prop_name_len); - member_p = zend_read_property(ref->ce, object, prop_name, prop_name_len, 1, &rv); - ZVAL_DEREF(member_p); - ZVAL_COPY(return_value, member_p); + member_p = zend_read_property(ref->ce, object, prop_name, prop_name_len, 0, &rv); + if (member_p != &rv) { + ZVAL_DEREF(member_p); + ZVAL_COPY(return_value, member_p); + } else { + if (Z_ISREF_P(member_p)) { + zend_unwrap_reference(member_p); + } + ZVAL_COPY_VALUE(return_value, member_p); + } } } /* }}} */ diff --git a/ext/reflection/tests/ReflectionProperty_getValue_error.phpt b/ext/reflection/tests/ReflectionProperty_getValue_error.phpt index c2152e9f87..62009d8bb9 100644 --- a/ext/reflection/tests/ReflectionProperty_getValue_error.phpt +++ b/ext/reflection/tests/ReflectionProperty_getValue_error.phpt @@ -78,4 +78,6 @@ Protected property: Cannot access non-public member TestClass::prot Instance without property: + +Notice: Undefined property: AnotherClass::$pub2 in %s on line %d NULL diff --git a/ext/reflection/tests/bug72174.phpt b/ext/reflection/tests/bug72174.phpt new file mode 100644 index 0000000000..94416d6153 --- /dev/null +++ b/ext/reflection/tests/bug72174.phpt @@ -0,0 +1,36 @@ +--TEST-- +Bug #72174: ReflectionProperty#getValue() causes __isset call +--FILE-- +<?php + +class Foo +{ + private $bar; + + public function __construct() + { + unset($this->bar); + } + + public function __isset($name) + { + var_dump(__METHOD__); + return true; + } + + public function __get($name) + { + var_dump(__METHOD__); + return $name; + } +} + +$instance = new Foo(); +$reflectionBar = (new ReflectionProperty(Foo::class, 'bar')); +$reflectionBar->setAccessible(true); +var_dump($reflectionBar->getValue($instance)); + +?> +--EXPECT-- +string(10) "Foo::__get" +string(3) "bar" |