summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
Diffstat (limited to 'ext')
-rw-r--r--ext/reflection/php_reflection.c13
-rw-r--r--ext/reflection/tests/ReflectionProperty_getValue_error.phpt2
-rw-r--r--ext/reflection/tests/bug72174.phpt36
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"