helly Tue Feb 21 00:37:39 2006 UTC Added files: /php-src/ext/reflection/tests 008.phpt
Modified files: /php-src/ext/reflection php_reflection.c Log: - Add ReflectionProperty::getDefaultValue() http://cvs.php.net/viewcvs.cgi/php-src/ext/reflection/php_reflection.c?r1=1.211&r2=1.212&diff_format=u Index: php-src/ext/reflection/php_reflection.c diff -u php-src/ext/reflection/php_reflection.c:1.211 php-src/ext/reflection/php_reflection.c:1.212 --- php-src/ext/reflection/php_reflection.c:1.211 Mon Feb 20 23:31:29 2006 +++ php-src/ext/reflection/php_reflection.c Tue Feb 21 00:37:39 2006 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_reflection.c,v 1.211 2006/02/20 23:31:29 johannes Exp $ */ +/* $Id: php_reflection.c,v 1.212 2006/02/21 00:37:39 helly Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -1106,15 +1106,17 @@ zval *classname; property_reference *reference; char *class_name, *prop_name; + zend_uchar utype = UG(unicode) ? IS_UNICODE : IS_STRING; - zend_u_unmangle_property_name(UG(unicode)?IS_UNICODE:IS_STRING, prop->name, &class_name, &prop_name); - + zend_u_unmangle_property_name(utype, prop->name, &class_name, &prop_name); + if (!(prop->flags & ZEND_ACC_PRIVATE)) { /* we have to seach the class hierarchy for this (implicit) public or protected property */ zend_class_entry *tmp_ce = ce; zend_property_info *tmp_info; + int prop_name_len = UG(unicode) ? u_strlen((UChar*)prop_name) : strlen(prop_name); - while (tmp_ce && zend_hash_find(&tmp_ce->properties_info, prop_name, strlen(prop_name) + 1, (void **) &tmp_info) != SUCCESS) { + while (tmp_ce && zend_u_hash_find(&tmp_ce->properties_info, utype, prop_name, prop_name_len + 1, (void **) &tmp_info) != SUCCESS) { ce = tmp_ce; prop = tmp_info; tmp_ce = tmp_ce->parent; @@ -3716,6 +3718,36 @@ } /* }}} */ +/* {{{ proto public mixed ReflectionProperty::getDefaultValue() + Returns the default value of the property. */ +ZEND_METHOD(reflection_property, getDefaultValue) +{ + reflection_object *intern; + property_reference *ref; + HashTable *prop_defaults; + zval **zdef, *zv; + zend_uchar utype = UG(unicode) ? IS_UNICODE : IS_STRING; + + METHOD_NOTSTATIC_NUMPARAMS(reflection_property_ptr, 0); + GET_REFLECTION_OBJECT_PTR(ref); + + if (ref->prop->flags & ZEND_ACC_STATIC) { + prop_defaults = &ref->ce->default_static_members; + } else { + prop_defaults = &ref->ce->default_properties; + } + + if (zend_u_hash_quick_find(prop_defaults, utype, ref->prop->name, ref->prop->name_length+1, ref->prop->h, (void**)&zdef) == SUCCESS) { + ALLOC_ZVAL(zv); + *zv = **zdef; + zval_copy_ctor(zv); + INIT_PZVAL(zv); + zval_update_constant(&zv, (void*)1 TSRMLS_CC); + RETURN_ZVAL(zv, 1, 1); + } +} +/* }}} */ + /* {{{ proto public int ReflectionProperty::getModifiers() Returns a bitfield of the access modifiers for this property */ ZEND_METHOD(reflection_property, getModifiers) @@ -4287,6 +4319,7 @@ ZEND_ME(reflection_property, isStatic, NULL, 0) ZEND_ME(reflection_property, isDefault, NULL, 0) ZEND_ME(reflection_property, getModifiers, NULL, 0) + ZEND_ME(reflection_property, getDefaultValue, NULL, 0) ZEND_ME(reflection_property, getDeclaringClass, NULL, 0) ZEND_ME(reflection_property, getDocComment, NULL, 0) {NULL, NULL, NULL} @@ -4433,7 +4466,7 @@ php_info_print_table_start(); php_info_print_table_header(2, "Reflection", "enabled"); - php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.211 2006/02/20 23:31:29 johannes Exp $"); + php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.212 2006/02/21 00:37:39 helly Exp $"); php_info_print_table_end(); } /* }}} */ http://cvs.php.net/viewcvs.cgi/php-src/ext/reflection/tests/008.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/008.phpt +++ php-src/ext/reflection/tests/008.phpt --TEST-- ReflectionProperty::getDefaultValue() --FILE-- <?php class root { public $rPub = "rPub"; public $xPub = "xPub"; protected $rPro = "rPro"; protected $xPro = "xPub"; private $rPri = "rPri"; private $xPri = "xPri"; static public $stat = "rStat"; } class derived extends root { public $dPub = "dPub"; public $xPub = "nPub"; protected $dPro = "dPro"; protected $xPro = "nPub"; private $dPri = "dPri"; private $xPri = "nPri"; } function show_prop($p) { echo "{$p->class}::{$p->name} = " . $p->getDefaultValue() . "\n"; } function show_class($c) { echo "===$c===\n"; $r = new ReflectionClass($c); foreach($r->getProperties() as $p) { show_prop($p); } } show_class("root"); show_class("derived"); ?> ===DONE=== <?php exit(0); ?> --EXPECTF-- ===root=== root::rPub = rPub root::xPub = xPub root::rPro = rPro root::xPro = xPub root::rPri = rPri root::xPri = xPri root::stat = rStat ===derived=== derived::dPub = dPub derived::xPub = nPub derived::dPro = dPro derived::xPro = nPub derived::dPri = dPri derived::xPri = nPri derived::rPub = rPub derived::rPro = rPro derived::stat = rStat ===DONE=== -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php