A while back, I wrote about using the JSONesque literal value parameters in Javascript, like jQuery does. This allows arguments to be passed: with names, in no particular order, all being optional. I set it up so that multiple arguments could be used as well, allowing for existing functions to still work or people who prefer that syntax to have it. I will now write about something similar for PHP.
In PHP, it is not quite as elegant, but almost. An array with key-value pairs is passed as the single argument for named argument mode. So you could call like this:
testFunction(array("arg1"=>"value1","arg3"=>"value3","argCallback"=>"testCallback"));
or with regular arguments:
testFunction("value1",null,"value3","testCallback");
The testFunction is defined like:
function testFunction($argArrayOr1=null, $arg2=null, $arg3=null, $argCallback=null){
$default1 = "the default";
if(func_num_args() == 1 && is_array($argArrayOr1)):
$var1 = ($argArrayOr1['arg1'])?$argArrayOr1['arg1']: $default1;
$var2 = ($argArrayOr1['arg2'])?$argArrayOr1['arg2']: null;
$var3 = ($argArrayOr1['arg3'])?$argArrayOr1['arg3']: null;
$varCallback = ($argArrayOr1['argCallback'])?$argArrayOr1['argCallback']: null;
else:
$var1 = ($argArrayOr1)?$argArrayOr1: $default1;
$var2 = ($arg2)?$arg2: null;
$var3 = ($arg3)?$arg3: null;
$varCallback = ($argCallback)?$argCallback: null;
endif;
// example handling of variables
echo "var1={$var1}<br /> var2={$var2}<br /> var3={$var3}<br /> ";
if(is_callable($varCallback))
$varCallback();
}
This one allows even a single regular parameter to be passed if it is not an array, or no parameters. It also still works with callbacks (see call_user_func). I define the defaults separately so they are in one place: they of course must be within the function so that argument can be left out in the array.
I haven’t done this in actual use yet, but probably will soon. I’ll probably just bypass the allowance for regular argument syntax. WordPress uses a GET-like syntax for some functions, which might be a bit more elegant, but I’m not sure how they do this, if there is a performance hit for parsing, if it can handle all argument types (like objects).