関数宣言を次のように変更して、必要な操作を実行できるようにすることをお勧めします。
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');
2番目のパラメーターが$x
まだデフォルト値を取得するように、呼び出しを希望どおりに実行できます。
このメソッドでは、null値を渡すことは、その後に続くパラメーターのデフォルト値をオーバーライドするときに、1つのパラメーターのデフォルト値が必要であることを意味します。
他の回答で述べたように、
デフォルトのパラメーターは、関数の最後の引数としてのみ機能します。関数定義でデフォルト値を宣言したい場合、1つのパラメーターを省略して、それに続くパラメーターをオーバーライドする方法はありません。
さまざまな数のパラメーターとさまざまな型のパラメーターを受け入れることができるメソッドがある場合、Ryan Pが示した答えと同様の関数を宣言することがよくあります。
ここに別の例があります(これはあなたの質問には答えませんが、情報提供があれば幸いです:
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!");
}
}