Я бы предложил изменить объявление функции следующим образом, чтобы вы могли делать то, что вы хотите:
function foo($blah, $x = null, $y = null) {
if (null === $x) {
$x = "some value";
}
if (null === $y) {
$y = "some other value";
}
code here!
}
Таким образом, вы можете сделать вызов наподобие foo('blah', null, 'non-default y value');
и заставить его работать так, как вы хотите, гдевторой параметр $x
по-прежнему получает значение по умолчанию.
При использовании этого метода передача нулевого значения означает, что вы хотите установить значение по умолчанию для одного параметра, когда вы хотите переопределить значение по умолчанию для параметра, который следует за ним..
Как указано в других ответах,
параметры по умолчанию работают только как последние аргументы функции.Если вы хотите объявить значения по умолчанию в определении функции, то невозможно пропустить один параметр и переопределить следующий за ним.
Если у меня есть метод, который может принимать переменное число параметров, ипараметры различных типов, я часто объявляю функцию, подобную ответу, показанному Райаном П.
Вот еще один пример (это не отвечает на ваш вопрос, но, надеюсь, информативно:
public function __construct($params = null)
{
if ($params instanceof SOMETHING) {
// single parameter, of object type SOMETHING
} else if (is_string($params)) {
// single argument given as string
} else if (is_array($params)) {
// params could be an array of properties like array('x' => 'x1', 'y' => 'y1')
} else if (func_num_args() == 3) {
$args = func_get_args();
// 3 parameters passed
} else if (func_num_args() == 5) {
$args = func_get_args();
// 5 parameters passed
} else {
throw new InvalidArgumentException("Could not figure out parameters!");
}
}