views:

144

answers:

3

I have a PHP function that requires can take 3 parameteres... I want to pass it a value for the 1st and 3rd parameters but I want the 2nd one to default...

How can I specify which ones I am passing, otherwise its interpreted as me passing values for the 1st and 2nd slots.

Thanks.

+4  A: 

You cannot "not pass" a parameter that's not at the end of the parameters list :

  • if you want to specify the 3rd parameter, you have to pass the 1st and 2nd ones
  • if you want to specify the 2nd parameter, you have to pass the 1st one -- but the 3rd can be left out, if optionnal.

In your case, you have to pass a value for the 2nd parameter -- the default one, ideally ; which, yes, requires your to know that default value.


A possible alternative would be not have your function take 3 parameters, but only one, an array :

function my_function(array $params = array()) {
    // if set, use $params['first']
    // if set, use $params['third']
    // ...
}

And call that function like this :

my_function(array(
    'first' => 'plop',
    'third' => 'glop'
));

This would allow you to :

  • accept any number of parameters
  • all of which could be optionnal

But :

  • your code would be less easy to understand, and the documentation would be less useful : no named parameters
  • your IDE would not be able to give you hints on which parameters the function accepts
Pascal MARTIN
Thanks! Sadly...
Ian Storm Taylor
Yep, I know ^^ That's why optionnal parameters should be at the right of the parameters list, and not in the middle ;-) *(but yes, if 2nd and 3rd parameters are both optionnal...)*
Pascal MARTIN
you could factor this with some clever uses of some php functions, but the ends seldom justify the means, see: http://www.php.net/manual/en/function.func-get-args.php
plod
A: 

Once you've defined a default parameter, all the parameters after that one cannot be required. You could do something like:

const MY_FUNCTION_DEFAULT = "default";

public function myFunction($one, $two = "default", $three = 3)
{
   if (is_null($two)) $two = self::MY_FUNCTION_DEFAULT;
   //...
}

// call
$this->myFunction(1, null, 3);

You might also define an empty parameter set and use func_get_args to pull in parameters and analyze those using instanceof or typeof/gettype for type checking if your function is simple enough.

Typeoneerror