If your function is meant to accept a variable
number of arguments, the snippets just described are sometimes
suboptimal solutions. You have to create a line calling
zend_get_parameters_ex()
for every possible number of arguments, which is often
unsatisfying.
For this case, you can use the function
zend_get_parameters_array_ex()
, which accepts the number of parameters to retrieve and an
array in which to store them:
zval **parameter_array[4]; /* get the number of arguments */ argument_count = ZEND_NUM_ARGS(); /* see if it satisfies our minimal request (2 arguments) */ /* and our maximal acceptance (4 arguments) */ if(argument_count 2 || argument_count 5) WRONG_PARAM_COUNT; /* argument count is correct, now retrieve arguments */ if(zend_get_parameters_array_ex(argument_count, parameter_array) != SUCCESS) WRONG_PARAM_COUNT; |
A very clever implementation of this can be found
in the code handling PHP's
fsockopen()
located in
ext/standard/fsock.c
, as shown in
例32-1
. Don't worry if you don't know all the functions used in this
source yet; we'll get to them shortly.
fsockopen()
accepts two, three, four, or five parameters. After the
obligatory variable declarations, the function checks for the
correct range of arguments. Then it uses a fall-through
mechanism in a
switch()
statement to deal with all arguments. The
switch()
statement starts with the maximum number of arguments being
passed (five). After that, it automatically processes the case
of four arguments being passed, then three, by omitting the
otherwise obligatory
break
keyword in all stages. After having processed the last case, it
exits the
switch()
statement and does the minimal argument processing needed if
the function is invoked with only two arguments.
This multiple-stage type of processing, similar to
a stairway, allows convenient processing of a variable number
of arguments.