summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--ext/reflection/php_reflection.c13
-rw-r--r--ext/reflection/tests/bug53366.phpt25
3 files changed, 38 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 20dc231c81..ed83ed21ec 100644
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,8 @@
EXTR_OVERWRITE. (jorto at redhat dot com)
- Fixed crashes on invalid parameters in intl extension (Stas, Maksymilian
Arciemowicz)
+- Fixed bug #53366 (Reflection doesnt get dynamic property value from
+ getProperty()). (Felipe)
- Fixed bug #53362 (Segmentation fault when extending SplFixedArray). (Felipe)
- Fixed bug #50987 (unaligned memory access in phar.c).
(geissert at debian dot org, Ilia)
diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c
index 7b130f8fd3..46e49ccd0c 100644
--- a/ext/reflection/php_reflection.c
+++ b/ext/reflection/php_reflection.c
@@ -190,7 +190,8 @@ typedef enum {
REF_TYPE_OTHER, /* Must be 0 */
REF_TYPE_FUNCTION,
REF_TYPE_PARAMETER,
- REF_TYPE_PROPERTY
+ REF_TYPE_PROPERTY,
+ REF_TYPE_DYNAMIC_PROPERTY
} reflection_type_t;
/* Struct for reflection objects */
@@ -272,6 +273,7 @@ static void reflection_free_objects_storage(void *object TSRMLS_DC)
{
reflection_object *intern = (reflection_object *) object;
parameter_reference *reference;
+ property_reference *prop_reference;
if (intern->ptr) {
switch (intern->ref_type) {
@@ -286,6 +288,11 @@ static void reflection_free_objects_storage(void *object TSRMLS_DC)
case REF_TYPE_PROPERTY:
efree(intern->ptr);
break;
+ case REF_TYPE_DYNAMIC_PROPERTY:
+ prop_reference = (property_reference*)intern->ptr;
+ efree(prop_reference->prop.name);
+ efree(intern->ptr);
+ break;
case REF_TYPE_OTHER:
break;
}
@@ -3583,13 +3590,15 @@ ZEND_METHOD(reflection_class, getProperty)
if (zend_hash_exists(Z_OBJ_HT_P(intern->obj)->get_properties(intern->obj TSRMLS_CC), name, name_len+1)) {
zend_property_info property_info_tmp;
property_info_tmp.flags = ZEND_ACC_IMPLICIT_PUBLIC;
- property_info_tmp.name = name;
+ property_info_tmp.name = estrndup(name, name_len);
property_info_tmp.name_length = name_len;
property_info_tmp.h = zend_get_hash_value(name, name_len+1);
property_info_tmp.doc_comment = NULL;
property_info_tmp.ce = ce;
reflection_property_factory(ce, &property_info_tmp, return_value TSRMLS_CC);
+ intern = (reflection_object *) zend_object_store_get_object(return_value TSRMLS_CC);
+ intern->ref_type = REF_TYPE_DYNAMIC_PROPERTY;
return;
}
}
diff --git a/ext/reflection/tests/bug53366.phpt b/ext/reflection/tests/bug53366.phpt
new file mode 100644
index 0000000000..5fb119d820
--- /dev/null
+++ b/ext/reflection/tests/bug53366.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug #53366 (Reflection doesnt get dynamic property value from getProperty())
+--FILE--
+<?php
+
+class UserClass {
+}
+
+$myClass = new UserClass;
+$myClass->id = 1000;
+
+$reflect = new ReflectionObject($myClass);
+
+var_dump($reflect->getProperty('id'));
+var_dump($reflect->getProperty('id')->getValue($myClass));
+
+?>
+--EXPECTF--
+object(ReflectionProperty)#%d (2) {
+ ["name"]=>
+ string(2) "id"
+ ["class"]=>
+ string(9) "UserClass"
+}
+int(1000)