2011-09-09 8 views
2

これは単なる文体的な質問か、おそらく「正しい」答えがあります。複数の値を返すPHPスタイル

私は複数の値を返す必要があるPHPの機能を持っている(とそれらが入ってくる引数あり)が好ましい場合:

function myFuncReturnVals ($a, $b) { 
// do stuff 
return array ($a, $b) 
} 

function myFuncByRef (&$a, &$b) { 
// do stuff 
} 

list($a,$b) = myFuncReturnVals ($a,$b); 
myFuncByReb($a,$b); 

いずれかの方法は、仕事を得るだろうが、これが好ましい ?

ReturnValsは、発信者が値が変更されるかどうかを判断できるように、いくつかの面で少しきれいに見えます。

しかし、関数の意図が本当にそのデータに迷惑をかけているように、refによっては時にはよりよく適合しているようです。

ミキシングとマッチングはどうですか?何らかのデータの返還を主に担当する関数がありますが、処理中に受信パラメータに関する追加情報がある場合はどうなりますか?

答えて

2

私は疫病のような参照パラメータを避ける傾向があります:あなたがそれらを定義している時点で何をしているのかは明らかですが、ほとんどの場合、あなたはその使用法を見ています。これらのパラメータが参照によるものであるのか、by-valueであるのかはまったくわかりません。

return-as-arrayパラダイムに固執すると、読みやすくなり、副作用を避けることが容易になります。

$output = nl2br(
      detect_links(
      htmlspecialchars(
      trim($input)))) 

あなたは価値のコレクションの同じ種類を返す複数の機能を持っている場合、それはAでそれらをラップする価値があるかもしれない:アクションでこのように見えるスタイルのようなもの - それはまた、ネスティング/ファンクションを連鎖する呼び出すことができます(phpdoc)のコメントがなくても戻り値がわかりやすくなり、関数の引数に型ヒントを追加することで、そのような値を使う他の関数への無効な入力をキャッチすることができます。

また、オブジェクトは参照型であることに注意してください。オブジェクト全体を置換したい場合は、参照を渡してください。個々のフィールドを変更したり、破壊的なメソッドを呼び出すと、元のオブジェクトが変更されます。値。例:

<?php 
class Bar { 
    public $x; 
    public function __construct($x) { $this->x = $x; } 
} 

function foo($bar, $x) { 
    $bar->x = $x; 
} 

$myBar = new Bar(23); 
$foo($myBar, 42); 
printf("$foo->x is now %s\n", $foo->x); 
1

あなたのコーディングスタイルと一致する方法を使用してください。私はむしろ配列を返すだろう。