3

私は最近、多くの Objective-C プログラミングを行っていますが、PHP に戻ってきたので、正直に言うと、名前付きパラメーターが恋しいです (最初は嫌いでしたが、今では大好きです。 )。

とにかく、PHP では、パラメーターに名前を付ける擬似的な方法として関数に配列を渡す人を時々見かけますが (順序を気にする必要がないという利点もあります)、それによって関数の記述が非常に複雑になることがあります。また、名前付きパラメーターを使用して関数を呼び出したい場合もありますが、そうしない方が簡単で高速な場合もあります。

誰もが単にこのようなことをしますか:

function calculateArea( $width, $height ) {
    // do calculations here...
}

// and then call the function like so:
calculateArea( $width = 10, $height = 5 );

少なくとも私のバージョンの PHP では問題なく動作するようです。他の人がこの手法を名前付きパラメーターの回避策として使用するかどうか疑問に思っています。また、これを行うべきではない説得力のある理由を誰かが知っているかどうかも疑問に思っています。

ありがとう!

アップデート:

すべての迅速な対応に感謝します。より明確にするために、連想配列を渡すことがほとんどのシナリオでより良いオプションであることを理解しているとだけ言っておきますが、既に作成した関数を使用していて、関数の方法を変更したくない場合がありますコードのあらゆる部分で呼び出されます。また、二次的なフレームワークを使用していて、関数の記述方法を制御できない場合もあります。

1 年前に書いたコードを見ていると、 が表示されますecho $zc->expand('Foo', 'Bar', 10, 1, 0, null, null, array('class'=>'code'), false);が、それはあまり役に立ちません。

したがって、私の質問を言い換えると、私は基本的にこれを尋ねてい
ます。代入を介して引数を関数に渡す方が読みやすい場合があります。これを行うことの欠点は何ですか? また、PHP のすべてのバージョンで機能しますか?

4

5 に答える 5

4

を使用すると、 PythoncalculateArea( $width = 10, $height = 5 )などの他の言語でできるように、名前でパラメーターを指定しません。

代わりに$width = 10$height = 5関数呼び出しには 2 つの変数代入式しかありません。

これが期待どおりに機能する理由は、代入式が値を代入するだけでなく、代入された値も返すためです。

割り当て式の値は、割り当てられた値です。つまり、「$a = 3」の値は 3 です。

したがって、実質的に同じパラメーターcalculateArea( $width = 10, $height = 5 )で呼び出すことになりますが、2 つの変数も割り当てます。calculateAreacalculateArea(10, 5)

calculateArea( $width = 10, $height = 5 );
var_dump($width);   // int(10)
var_dump($height);  // int(5)
于 2011-04-30T18:33:28.027 に答える
4

順番を間違えると安全性がなくなるという観点から、これは悪い考えだと思います。マップを使用すると、これをエミュレートするより安全な方法になります。また、ローカル スコープでこれらの変数の値を設定するという副作用もありますが、これは問題になる場合とそうでない場合があります。

calculateArea( $height = 5, $width = 10 ); # oops!

function calculateArea( $width, $height ) {
    // do calculations here...
}

配列 (マップ) では、それらをどの順序で配置しても問題ありません。

calculateArea( array( 'height' => 5, 'width' => 10 ) ) # yea!

function calculateArea( $dimensions ) {
    $width = $dimensions['width'];
    $height = $dimensions['height'];
}
于 2011-04-30T18:33:34.657 に答える
2

予期しない結果が生じる可能性があるため、関数呼び出しで変数の割り当てを使用しないでください。calculateArea($a = 10, $b = 5)も機能します。関数呼び出しが完了すると、$a === 10 と $b === 5 になります。これらの変数が関数呼び出しの前に異なる値を持っていた場合、それらの値は上書きされます。

于 2011-04-30T18:32:34.423 に答える
0

PHP にはこの機能がないことがわかりました。しかし、配列を渡すことも悪い方法だと言いたいです。このようにして、配列で使用できるキーをメモリ (または最良の場合は phddoc コメント) に保持する必要があり、「デフォルト値」を設定することはできず、配列のキーの名前を簡単にタイプミスすることができます。
したがって、私はこの場合にオブジェクトを使用することを好みます (PHP には「構造」がないため)。オブジェクトではデフォルト値を設定でき、関数宣言で必要なオブジェクトのタイプを設定でき、IDE ではオブジェクトのフィールド名のコードを完全にすることができます。例として:

class DimensionsParams
{
    public $width = 5;
    public $height;
}

function calculateArea(DimensionsParams $params)
{
    // do calculations here...
    return $params->height*$params->width;
}

もちろん、それは各関数にとって最良の選択ではありませんが、「名前付きパラメーター」の最良の選択肢です (私の意見では)。

于 2011-04-30T20:15:24.173 に答える
0

次のいずれかの方法で関数を呼び出すことができます。

calculateArea(10,5);

またはこれ:

calculateArea($幅、$高さ);

またはこれ:

calculateArea($xvar,5);

しかし、関数呼び出し内で値を代入することは、通常は悪い習慣です。技術的には正しいですが、コードが読みにくくなります。これを行う代わりに:

calculateArea( $width = 10, $height = 5 );

これを行う:

$width = 10;
$height = 5;
calculateArea( $width, $height );

またはこれ:

$width = 10;
$height = 5;
calculateArea( 10, 5 );

それらはすべて同じ効果がありますが、関数の外側で変数を宣言すると、そのスコープが明確になります。

于 2011-04-30T18:34:16.793 に答える