2

Required ParameterPHP関数のシグネチャで正確なタイプのaを探しています

NULLのみでパラメーターを初期化すると、オプションになりますか?すなわち

function foo($optional=NULL, $OptionalOrRequired="Optional Or Required", $required){}

2番目の引数について混乱していますが、必須またはオプションのパラメーターに含まれていますか?

アップデート

reflection関数のすべての必要なパラメーターを取得するために使用しています

public function getPlayer($params=3, $c){}
// results
$reflection->getNumberOfParameters()            ->   2
$reflection->getNumberOfRequiredParameters()    ->   2 // it should be one

public function getPlayer($params=3, $c, $x=NULL)
// results
$reflection->getNumberOfParameters()            ->   3
$reflection->getNumberOfRequiredParameters()    ->   2

デフォルトが必要になる前に来るという1つの答えが得られたので、これがリフレクション関数が必要なパラメーターに対して間違ったカウントを返す理由ですか?

ありがとう

4

3 に答える 3

3

「オプションの」引数は、デフォルト値を持つ単なる引数であり、その値が、、、文字列(など)であるかどうかnullfalse関係ありません。関数の引数にデフォルト値がある場合、それはオプションです。

ただし、必須パラメータの前にオプションのパラメータを配置することは意味がありませんnull。必須の引数に「到達」するために、前の引数に値を指定する必要があるためです。つまり、最後の引数より前のすべての引数は「必須」引数は事実上必須です。

いくつかの例:

// Bad
function bad($optional = 'literally anything', $required) {}

bad('required arg');              // This breaks - 'missing argument 2'
bad('something', 'required arg'); // This works - both parameters are needed

// Good
function($required, $optional = 'literally anything') {}

good('required arg');              // This works just fine, last argument has a default
good('required arg', 'something'); // Also works fine, overrides 'literally anything'

REの更新:リフレクション

上記のように、必須パラメーターの前に「オプション」パラメーターを配置すると、メソッドのシグネチャを満たすために値を指定する必要があるため、その「オプション」パラメーターが実質的に必須になります。

たとえば、最初の引数にデフォルトがあり、2番目の引数にデフォルトがない場合(bad上記の関数のように)、2番目の引数を渡す必要があるため、最初の引数も渡す必要があるため、両方が「必須」です。デフォルト値の後続の引数がある場合でも、最初の2つの引数のみが必要です。

于 2012-05-30T10:18:52.220 に答える
1

PHPでは、必須パラメーターをオプションパラメーターの後に置くことはできません。オプションのパラメータは、常に必要なパラメータ(存在する場合)に従う必要があります。デフォルト値が提供されているパラメーター(例$param = 'default')はオプションであり、デフォルト値がないパラメーターは必須です。

于 2012-05-30T10:08:30.930 に答える
-1

私のコメントに加えて。

function test($required, $optional = null)
{

}

test(); // throws an error stating $required is missing
test('a'); // sets $required to 'a' and $optional is null
test('a', 'b'); // sets $required to 'a' and $optional to 'b'
于 2012-05-30T10:08:37.793 に答える