Hello Andi, it was Sebastians idea and he took the name from invokeArgs(). I don't care, so if you can sleep better with your proposal change both names and live with BC break.
marcus Wednesday, January 25, 2006, 3:46:16 AM, you wrote: > Might be nicer to call it newInstanceWithArgs() but it's a matter of > taste so I'll leave it up to you to decide if you think it's nicer or not :) > Andi > At 12:19 PM 1/24/2006, Marcus Boerger wrote: >>helly Tue Jan 24 20:19:49 2006 UTC >> >> Added files: >> /php-src/ext/reflection/tests 007.phpt >> >> Modified files: >> /php-src/ext/reflection php_reflection.c >> Log: >> - Implemented #36141 Add ReflectionClass::newInstanceArgs($args) >> >> >>http://cvs.php.net/viewcvs.cgi/php-src/ext/reflection/php_reflection.c?r1=1.200&r2=1.201&diff_format=u >>Index: php-src/ext/reflection/php_reflection.c >>diff -u php-src/ext/reflection/php_reflection.c:1.200 >>php-src/ext/reflection/php_reflection.c:1.201 >>--- php-src/ext/reflection/php_reflection.c:1.200 Tue Jan 17 >>12:18:52 2006 >>+++ php-src/ext/reflection/php_reflection.c Tue Jan 24 20:19:49 2006 >>@@ -20,7 +20,7 @@ >> +----------------------------------------------------------------------+ >> */ >> >>-/* $Id: php_reflection.c,v 1.200 2006/01/17 12:18:52 dmitry Exp $ */ >>+/* $Id: php_reflection.c,v 1.201 2006/01/24 20:19:49 helly Exp $ */ >> >> #ifdef HAVE_CONFIG_H >> #include "config.h" >>@@ -3193,8 +3193,6 @@ >> METHOD_NOTSTATIC(reflection_class_ptr); >> GET_REFLECTION_OBJECT_PTR(ce); >> >>- object_init_ex(return_value, ce); >>- >> /* Run the constructor if there is one */ >> if (ce->constructor) { >> zval ***params; >>@@ -3212,6 +3210,8 @@ >> RETURN_FALSE; >> } >> >>+ object_init_ex(return_value, ce); >>+ >> fci.size = sizeof(fci); >> fci.function_table = EG(function_table); >> fci.function_name = NULL; >>@@ -3237,6 +3237,79 @@ >> zval_ptr_dtor(&retval_ptr); >> } >> efree(params); >>+ } else if (!ZEND_NUM_ARGS()) { >>+ object_init_ex(return_value, ce); >>+ } else { >>+ >>zend_throw_exception_ex(U_CLASS_ENTRY(reflection_exception_ptr), 0 >>TSRMLS_CC, "Class %v does not have a constructor, so you cannot pass >>any constructor arguments", ce->name); >>+ } >>+} >>+/* }}} */ >>+ >>+/* {{{ proto public stdclass ReflectionClass::newInstanceArgs(array args) >>+ Returns an instance of this class */ >>+ZEND_METHOD(reflection_class, newInstanceArgs) >>+{ >>+ zval *retval_ptr; >>+ reflection_object *intern; >>+ zend_class_entry *ce; >>+ int argc; >>+ HashTable *args; >>+ >>+ >>+ METHOD_NOTSTATIC(reflection_class_ptr); >>+ GET_REFLECTION_OBJECT_PTR(ce); >>+ >>+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|h", >>&args) == FAILURE) { >>+ return; >>+ } >>+ argc = args->nNumOfElements; >>+ >>+ /* Run the constructor if there is one */ >>+ if (ce->constructor) { >>+ zval ***params; >>+ zend_fcall_info fci; >>+ zend_fcall_info_cache fcc; >>+ >>+ if (!(ce->constructor->common.fn_flags & ZEND_ACC_PUBLIC)) { >>+ >>zend_throw_exception_ex(U_CLASS_ENTRY(reflection_exception_ptr), 0 >>TSRMLS_CC, "Access to non-public constructor of class %v", ce->name); >>+ return; >>+ } >>+ >>+ params = safe_emalloc(sizeof(zval **), argc, 0); >>+ zend_hash_apply_with_argument(args, >>(apply_func_arg_t)_zval_array_to_c_array, ¶ms TSRMLS_CC); >>+ params -= argc; >>+ >>+ object_init_ex(return_value, ce); >>+ >>+ fci.size = sizeof(fci); >>+ fci.function_table = EG(function_table); >>+ fci.function_name = NULL; >>+ fci.symbol_table = NULL; >>+ fci.object_pp = &return_value; >>+ fci.retval_ptr_ptr = &retval_ptr; >>+ fci.param_count = argc; >>+ fci.params = params; >>+ fci.no_separation = 1; >>+ >>+ fcc.initialized = 1; >>+ fcc.function_handler = ce->constructor; >>+ fcc.calling_scope = EG(scope); >>+ fcc.object_pp = &return_value; >>+ >>+ if (zend_call_function(&fci, &fcc TSRMLS_CC) == FAILURE) { >>+ efree(params); >>+ zval_ptr_dtor(&retval_ptr); >>+ zend_error(E_WARNING, "Invocation of %v's >>constructor failed", ce->name); >>+ RETURN_NULL(); >>+ } >>+ if (retval_ptr) { >>+ zval_ptr_dtor(&retval_ptr); >>+ } >>+ efree(params); >>+ } else if (!ZEND_NUM_ARGS()) { >>+ object_init_ex(return_value, ce); >>+ } else { >>+ >>zend_throw_exception_ex(U_CLASS_ENTRY(reflection_exception_ptr), 0 >>TSRMLS_CC, "Class %v does not have a constructor, so you cannot pass >>any constructor arguments", ce->name); >> } >> } >> /* }}} */ >>@@ -4094,6 +4167,7 @@ >> ZEND_ME(reflection_class, getModifiers, NULL, 0) >> ZEND_ME(reflection_class, isInstance, NULL, 0) >> ZEND_ME(reflection_class, newInstance, NULL, 0) >>+ ZEND_ME(reflection_class, newInstanceArgs, NULL, 0) >> ZEND_ME(reflection_class, getParentClass, NULL, 0) >> ZEND_ME(reflection_class, isSubclassOf, NULL, 0) >> ZEND_ME(reflection_class, getStaticProperties, NULL, 0) >>@@ -4272,7 +4346,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.200 2006/01/17 12:18:52 dmitry Exp $"); >>+ php_info_print_table_row(2, "Version", "$Id: >>php_reflection.c,v 1.201 2006/01/24 20:19:49 helly Exp $"); >> >> php_info_print_table_end(); >> } /* }}} */ >> >>http://cvs.php.net/viewcvs.cgi/php-src/ext/reflection/tests/007.phpt?view=markup&rev=1.1 >>Index: php-src/ext/reflection/tests/007.phpt >>+++ php-src/ext/reflection/tests/007.phpt >>--TEST-- >>ReflectionClass::newInstance[Args] >>--FILE-- >><?php >> >>function test($class) >>{ >> echo "====>$class\n"; >> try >> { >> $ref = new ReflectionClass($class); >> } >> catch (ReflectionException $e) >> { >> var_dump($e->getMessage()); >> return; // only here >> } >> >> echo "====>newInstance()\n"; >> try >> { >> var_dump($ref->newInstance()); >> } >> catch (ReflectionException $e) >> { >> var_dump($e->getMessage()); >> } >> >> echo "====>newInstance(25)\n"; >> try >> { >> var_dump($ref->newInstance(25)); >> } >> catch (ReflectionException $e) >> { >> var_dump($e->getMessage()); >> } >> >> echo "====>newInstance(25, 42)\n"; >> try >> { >> var_dump($ref->newInstance(25, 42)); >> } >> catch (ReflectionException $e) >> { >> var_dump($e->getMessage()); >> } >> >> echo "\n"; >>} >> >>function __autoload($class) >>{ >> echo __FUNCTION__ . "($class)\n"; >>} >> >>test('Class_does_not_exist'); >> >>Class NoCtor >>{ >>} >> >>test('NoCtor'); >> >>Class WithCtor >>{ >> function __construct() >> { >> echo __METHOD__ . "()\n"; >> var_dump(func_get_args()); >> } >>} >> >>test('WithCtor'); >> >>Class WithCtorWithArgs >>{ >> function __construct($arg) >> { >> echo __METHOD__ . "($arg)\n"; >> var_dump(func_get_args()); >> } >>} >> >>test('WithCtorWithArgs'); >> >>?> >>===DONE=== >><?php exit(0); ?> >>--EXPECTF-- >> >>====>Class_does_not_exist >>__autoload(Class_does_not_exist) >>string(41) "Class Class_does_not_exist does not exist" >>====>NoCtor >>====>newInstance() >>object(NoCtor)#%d (0) { >>} >>====>newInstance(25) >>string(86) "Class NoCtor does not have a constructor, so you cannot >>pass any constructor arguments" >>====>newInstance(25, 42) >>string(86) "Class NoCtor does not have a constructor, so you cannot >>pass any constructor arguments" >> >>====>WithCtor >>====>newInstance() >>WithCtor::__construct() >>array(0) { >>} >>object(WithCtor)#%d (0) { >>} >>====>newInstance(25) >>WithCtor::__construct() >>array(1) { >> [0]=> >> int(25) >>} >>object(WithCtor)#%d (0) { >>} >>====>newInstance(25, 42) >>WithCtor::__construct() >>array(2) { >> [0]=> >> int(25) >> [1]=> >> int(42) >>} >>object(WithCtor)#%d (0) { >>} >> >>====>WithCtorWithArgs >>====>newInstance() >> >>Warning: Missing argument 1 for WithCtorWithArgs::__construct() in >>%s007.php on line %d >> >>Notice: Undefined variable: arg in %s007.php on line %d >>WithCtorWithArgs::__construct() >>array(0) { >>} >>object(WithCtorWithArgs)#%d (0) { >>} >>====>newInstance(25) >>WithCtorWithArgs::__construct(25) >>array(1) { >> [0]=> >> int(25) >>} >>object(WithCtorWithArgs)#%d (0) { >>} >>====>newInstance(25, 42) >>WithCtorWithArgs::__construct(25) >>array(2) { >> [0]=> >> int(25) >> [1]=> >> int(42) >>} >>object(WithCtorWithArgs)#%d (0) { >>} >> >>===DONE=== >> >>-- >>PHP CVS Mailing List (http://www.php.net/) >>To unsubscribe, visit: http://www.php.net/unsub.php Best regards, Marcus -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php