One of the most important issues for language extensions
is accepting and dealing with data passed via arguments. Most
extensions are built to deal with specific input data (or
require parameters to perform their specific actions), and
function arguments are the only real way to exchange data
between the PHP level and the C level. Of course, there's
also the possibility of exchanging data using predefined
global values (which is also discussed later), but this
should be avoided by all means, as it's extremely bad
practice.
PHP doesn't make use of any formal function
declarations; this is why call syntax is always completely
dynamic and never checked for errors. Checking for correct
call syntax is left to the user code. For example, it's
possible to call a function using only one argument at one
time and four arguments the next time - both invocations are
syntactically absolutely correct.
Since PHP doesn't have formal function definitions
with support for call syntax checking, and since PHP
features variable arguments, sometimes you need to find out
with how many arguments your function has been called. You
can use the ZEND_NUM_ARGS macro in
this case. In previous versions of PHP, this macro
retrieved the number of arguments with which the function
has been called based on the function's hash table entry,
ht, which is passed in the INTERNAL_FUNCTION_PARAMETERS list. As
ht itself now contains the number of
arguments that have been passed to the function, ZEND_NUM_ARGS has been stripped down to a
dummy macro (see its definition in
zend_API.h). But it's still good practice to use it,
to remain compatible with future changes in the call
interface.
Note: The old PHP equivalent of this macro is
ARG_COUNT.
The following code checks for the correct number of
arguments:
if(ZEND_NUM_ARGS() != 2) WRONG_PARAM_COUNT; |
This macro prints a default error message and then
returns to the caller. Its definition can also be found in
zend_API.h and looks like
this:
ZEND_API void wrong_param_count(void); #define WRONG_PARAM_COUNT { wrong_param_count(); return; } |