derick Fri Feb 15 12:37:38 2008 UTC Added files: /php-src/ext/reflection/tests reflectionProperty_setAccesible.phpt
Modified files: /php-src/ext/reflection php_reflection.c Log: - Add the ReflectionProperty::setAccesible() method that allows non-public property's values to be read through ::getValue(). http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/php_reflection.c?r1=1.292&r2=1.293&diff_format=u Index: php-src/ext/reflection/php_reflection.c diff -u php-src/ext/reflection/php_reflection.c:1.292 php-src/ext/reflection/php_reflection.c:1.293 --- php-src/ext/reflection/php_reflection.c:1.292 Wed Jan 30 12:50:49 2008 +++ php-src/ext/reflection/php_reflection.c Fri Feb 15 12:37:37 2008 @@ -20,7 +20,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: php_reflection.c,v 1.292 2008/01/30 12:50:49 tony2001 Exp $ */ +/* $Id: php_reflection.c,v 1.293 2008/02/15 12:37:37 derick Exp $ */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -175,6 +175,7 @@ typedef struct _property_reference { zend_class_entry *ce; zend_property_info prop; + unsigned int ignore_visibility:1; } property_reference; /* Struct for parameters */ @@ -1196,6 +1197,7 @@ reference = (property_reference*) emalloc(sizeof(property_reference)); reference->ce = ce; reference->prop = *prop; + reference->ignore_visibility = 0; intern->ptr = reference; intern->free_ptr = 1; intern->ce = ce; @@ -3939,6 +3941,7 @@ reference = (property_reference*) emalloc(sizeof(property_reference)); reference->ce = ce; reference->prop = *property_info; + reference->ignore_visibility = 0; intern->ptr = reference; intern->free_ptr = 1; intern->ce = ce; @@ -4078,7 +4081,7 @@ METHOD_NOTSTATIC(reflection_property_ptr); GET_REFLECTION_OBJECT_PTR(ref); - if (!(ref->prop.flags & ZEND_ACC_PUBLIC)) { + if (!(ref->prop.flags & ZEND_ACC_PUBLIC) && ref->ignore_visibility == 0) { _default_get_entry(getThis(), "name", sizeof("name"), &name TSRMLS_CC); zend_throw_exception_ex(reflection_exception_ptr, 0 TSRMLS_CC, "Cannot access non-public member %v::%v", intern->ce->name, Z_UNIVAL(name)); @@ -4226,6 +4229,24 @@ } /* }}} */ +/* {{{ proto public int ReflectionProperty::setAccesible() U + Sets whether non-public properties can be requested */ +ZEND_METHOD(reflection_property, setAccesible) +{ + reflection_object *intern; + property_reference *ref; + zend_bool visible; + + METHOD_NOTSTATIC_NUMPARAMS(reflection_property_ptr, 1); + GET_REFLECTION_OBJECT_PTR(ref); + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "b", &visible) == FAILURE) { + return; + } + ref->ignore_visibility = visible; +} +/* }}} */ + /* {{{ proto public static mixed ReflectionExtension::export(string name [, bool return]) throws ReflectionException U Exports a reflection object. Returns the output if TRUE is specified for return, printing it otherwise. */ ZEND_METHOD(reflection_extension, export) @@ -4837,6 +4858,11 @@ ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() +static +ZEND_BEGIN_ARG_INFO(arginfo_reflection_property_setAccesible, 0) + ZEND_ARG_INFO(0, value) +ZEND_END_ARG_INFO() + static const zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection, __clone, NULL, ZEND_ACC_PRIVATE|ZEND_ACC_FINAL) ZEND_ME(reflection_property, export, arginfo_reflection_property_export, ZEND_ACC_STATIC|ZEND_ACC_PUBLIC) @@ -4854,6 +4880,7 @@ ZEND_ME(reflection_property, getDefaultValue, NULL, 0) ZEND_ME(reflection_property, getDeclaringClass, NULL, 0) ZEND_ME(reflection_property, getDocComment, NULL, 0) + ZEND_ME(reflection_property, setAccesible, arginfo_reflection_property_setAccesible, 0) {NULL, NULL, NULL} }; @@ -5032,7 +5059,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.292 2008/01/30 12:50:49 tony2001 Exp $"); + php_info_print_table_row(2, "Version", "$Id: php_reflection.c,v 1.293 2008/02/15 12:37:37 derick Exp $"); php_info_print_table_end(); } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/ext/reflection/tests/reflectionProperty_setAccesible.phpt?view=markup&rev=1.1 Index: php-src/ext/reflection/tests/reflectionProperty_setAccesible.phpt +++ php-src/ext/reflection/tests/reflectionProperty_setAccesible.phpt --TEST-- Test ReflectionProperty::setAccesible(). --SKIPIF-- <?php extension_loaded('reflection') or die('skip'); ?> --FILE-- <?php class TestClass { public $pub; public $pub2 = 5; static public $stat = "static property"; protected $prot = 4; private $priv = "keepOut"; } class AnotherClass { } $instance = new TestClass(); echo "\nProtected property:\n"; $propInfo = new ReflectionProperty('TestClass', 'prot'); try { var_dump($propInfo->getValue($instance)); } catch(Exception $exc) { echo $exc->getMessage(), "\n"; } $propInfo->setAccesible(true); var_dump($propInfo->getValue($instance)); $propInfo->setAccesible(false); try { var_dump($propInfo->getValue($instance)); } catch(Exception $exc) { echo $exc->getMessage(), "\n"; } ?> --EXPECTF-- Protected property: Cannot access non-public member TestClass::prot int(4) Cannot access non-public member TestClass::prot -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php