2011-09-16 14 views
2

関数呼び出しの中で変数値を設定する - これはあまり表示されませんが、これは良い方法と考えられますか?PHP - 関数の引数に値を代入する - 良い方法ですか?

function myUpdate($status){ 
    ... 
} 

myUpdate($status = 'live'); 

私は個人的には説明的なので好きです。私はそれをもっと頻繁に、すなわち、関数定義にデフォルト値を割り当てることを頻繁に見ます。

+0

うわー、これは動作しますか? :O – Rijk

+5

これを行うことは、関数の実行には何ら影響を及ぼさず、呼び出し側スコープ内にローカル変数のみを割り当てることを知っていますか? –

+0

@Rijkはい、これはPHPでの代入の結果が割り当てられた値であるために機能します。 – Phil

答えて

5

。 phはで、はキーワード引数をサポートしていないので、奇妙なことにつながる可能性があります。ポイントのケース:

function f($a, $b){ 
    echo 'a: ' . $a . "\n"; 
    echo 'b: ' . $b . "\n"; 
} 
f($b='b-value', $a='a-value'); 

このプログラムは出力だけ

a: b-value 
b: a-value 

は、グローバルな文脈で変数$b$aを定義していません。これは

f($b='b-value', $a='a-value'); 
// is the same thing as ... 
$b = 'b-value'; 
$a = 'a-value'; 
f($b, $a); 

一つは覚えてメソッドの引数を容易にするために行うことができますいくつかの良い習慣がありますので、次のとおりです。

  • エディタ/ IDEは、ハイライトの機能の署名を表示するように設定します。
  • 関数は状態のいくつかの種類を記述する引数をたくさん持っている場合は、あなたの関数がちょうど引数の多くを必要とする場合、それは取る作る* OBJEC *トン(その代わりに状態を保持している)
  • にそれを移動することを検討配列すべての必須でな​​いものについては。これにより、メソッド呼び出し元は、多数のオプションについて心配することなく、興味のあるものを知るだけでよいのです。
+0

それはコードの難読化ではありません。関数に3つのブールパラメータがある場合、記述的な方法で変数を追加すると、実際に読みやすくなります。 –

+0

@Darhazer誰かがメソッドのシグネチャを変更するまで、読みやすさが向上します。その後、この習慣は*実際にメソッドのシグネチャについてプログラマに誤解を与えるでしょう。 – phihag

2

真剣に冗談を言っているのはなぜですか?あなたはそれがデフォルト値を割り当てることとはまったく異なる何かを認識しなければなりません。ここでは、変数に値を代入し、その変数を関数に渡しています。その結果、関数呼び出しの後には、$status varialbeがまだ定義されています。

myUpdate($status = 'live'); 
echo $status; // "live" 

これが何をしたい場合でも、私はそれだけで二列にそれを分割するよりも少ないわかりやすいかなと思います。

1

まあ、デフォルト値は違うものです。

// if you call myUpdate without argument, it will have $status with value live 
function myUpdate($status = 'live'){ 

} 

は、このコール:呼び出しの後、あなたはmyUpdate($status = 'live');のようにそれを呼び出す場合は、$status VARを維持することが唯一の違いで

myUpdate('live'); 

myUpdate($status = 'live'); 

に相当します関数内ではなく関数を呼び出したスコープ内に値liveがあります。

しかし、私見そのはるかに読みやすい、このようにそれを行うには:

それは基本的に、コードの難読化なので、非常に悪い考えをだ
$status = 'live'; 
myUpdate($status); 
2

いいえ、余分なコードではありません。試してみてください:

myUpdate('live' /*status*/, 42 /*maxTries*/);

それとも、本当に名前付きパラメータを望んでいた場合、あなたはマップを使用することができます

myUpdate(array(
    'status' => 'live' 
)); 

通常とにかく、それは型の安全性を殺すだろうが、PHPは、いずれかを持っていません。

関連する問題