This patch allows get_declared_classes and get_declared_interfaces() functions to return the information in associative array with "internal" and "user" keys when passed the optional parameter. And makes them a bit more consistent with similar functions like get_defined_functions()..
Example: [EMAIL PROTECTED] php_5_2tst]$ sapi/cli/php -r 'class foobar {} print_r(get_declared_classes(true));'|less Array ( [internal] => Array ( [0] => stdClass [1] => Exception [2] => ErrorException [3] => __PHP_Incomplete_Class [4] => php_user_filter [5] => Directory [6] => DateTime [7] => DateTimeZone ) [user] => Array ( [0] => foobar ) ) --Jani
Index: zend_builtin_functions.c =================================================================== RCS file: /repository/ZendEngine2/zend_builtin_functions.c,v retrieving revision 1.277.2.12.2.16 diff -u -r1.277.2.12.2.16 zend_builtin_functions.c --- zend_builtin_functions.c 24 Feb 2007 02:17:23 -0000 1.277.2.12.2.16 +++ zend_builtin_functions.c 28 Mar 2007 12:19:54 -0000 @@ -1333,46 +1333,76 @@ zval *array = va_arg(args, zval *); zend_uint mask = va_arg(args, zend_uint); zend_uint comply = va_arg(args, zend_uint); - zend_uint comply_mask = (comply)? mask:0; + zend_uint comply_mask = (comply) ? mask : 0; zend_class_entry *ce = *pce; - if ((hash_key->nKeyLength==0 || hash_key->arKey[0]!=0) + if ((hash_key->nKeyLength == 0 || hash_key->arKey[0] != 0) && (comply_mask == (ce->ce_flags & mask))) { - add_next_index_stringl(array, ce->name, ce->name_length, 1); + + if (num_args == 3) { + add_next_index_stringl(array, ce->name, ce->name_length, 1); + } else if (num_args == 5) { + zval *internal_ar = va_arg(args, zval *), + *user_ar = va_arg(args, zval *); + + if (ce->type == ZEND_INTERNAL_CLASS) { + add_next_index_stringl(internal_ar, ce->name, ce->name_length, 1); + } else if (ce->type == ZEND_USER_CLASS) { + add_next_index_stringl(user_ar, ce->name, ce->name_length, 1); + } + } } return ZEND_HASH_APPLY_KEEP; } - -/* {{{ proto array get_declared_classes() - Returns an array of all declared classes. */ -ZEND_FUNCTION(get_declared_classes) +static void do_get_declared_classes_or_interfaces(INTERNAL_FUNCTION_PARAMETERS, zend_uint mask, zend_uint comply) { - zend_uint mask = ZEND_ACC_INTERFACE; - zend_uint comply = 0; + zend_bool return_assoc = 0; - if (ZEND_NUM_ARGS() != 0) { - ZEND_WRONG_PARAM_COUNT(); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|b", &return_assoc) == FAILURE) { + return; } - + array_init(return_value); - zend_hash_apply_with_arguments(EG(class_table), (apply_func_args_t) copy_class_or_interface_name, 3, return_value, mask, comply); + + if (return_assoc) + { + zval *internal; + zval *user; + + MAKE_STD_ZVAL(internal); + MAKE_STD_ZVAL(user); + + array_init(internal); + array_init(user); + + zend_hash_apply_with_arguments(EG(class_table), (apply_func_args_t) copy_class_or_interface_name, 5, return_value, mask, comply, internal, user); + zend_hash_add(Z_ARRVAL_P(return_value), "internal", sizeof("internal"), (void **) &internal, sizeof(zval *), NULL); + zend_hash_add(Z_ARRVAL_P(return_value), "user", sizeof("user"), (void **) &user, sizeof(zval *), NULL); + } else { + zend_hash_apply_with_arguments(EG(class_table), (apply_func_args_t) copy_class_or_interface_name, 3, return_value, mask, comply); + } } /* }}} */ -/* {{{ proto array get_declared_interfaces() - Returns an array of all declared interfaces. */ +/* {{{ proto array get_declared_classes([bool return_assoc]) + Returns an array of declared classes. */ +ZEND_FUNCTION(get_declared_classes) +{ + zend_uint mask = ZEND_ACC_INTERFACE; + zend_uint comply = 0; + + do_get_declared_classes_or_interfaces(INTERNAL_FUNCTION_PARAM_PASSTHRU, mask, comply); +} + +/* {{{ proto array get_declared_interfaces([bool assoc]) + Returns an array of declared interfaces. */ ZEND_FUNCTION(get_declared_interfaces) { zend_uint mask = ZEND_ACC_INTERFACE; zend_uint comply = 1; - if (ZEND_NUM_ARGS() != 0) { - ZEND_WRONG_PARAM_COUNT(); - } - - array_init(return_value); - zend_hash_apply_with_arguments(EG(class_table), (apply_func_args_t) copy_class_or_interface_name, 3, return_value, mask, comply); + do_get_declared_classes_or_interfaces(INTERNAL_FUNCTION_PARAM_PASSTHRU, mask, comply); } /* }}} */ Index: tests/017.phpt =================================================================== RCS file: /repository/ZendEngine2/tests/017.phpt,v retrieving revision 1.1.2.2 diff -u -r1.1.2.2 017.phpt --- tests/017.phpt 21 Nov 2006 11:11:39 -0000 1.1.2.2 +++ tests/017.phpt 28 Mar 2007 12:19:54 -0000 @@ -28,7 +28,11 @@ var_dump(gettype(get_defined_functions())); var_dump(count(get_defined_functions())); -var_dump(get_declared_interfaces(true)); +var_dump(get_declared_classes(true,true)); +var_dump(gettype(get_declared_classes())); +var_dump(count(get_declared_classes())); + +var_dump(get_declared_interfaces(true,true)); var_dump(gettype(get_declared_interfaces())); var_dump(count(get_declared_interfaces())); @@ -67,7 +71,12 @@ string(5) "array" int(%d) -Warning: Wrong parameter count for get_declared_interfaces() in %s on line %d +Warning: get_declared_classes() expects at most 1 parameter, 2 given in %s on line %d +NULL +string(5) "array" +int(%d) + +Warning: get_declared_interfaces() expects at most 1 parameter, 2 given in %s on line %d NULL string(5) "array" int(%d) @@ -80,3 +89,4 @@ string(5) "array" int(%d) Done +
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php