2011-02-04 14 views
2

他の言語では、複数の戻り値を持つことが一般的です。 Luaの中で、たとえば1に記述することができます。PHPでは複数の戻り値がありますか?

list(, , $r1, $r2) = string_find(...); 

local _, _, r1, r2 = string.find(...) 

はPHPで私のようなものを記述する必要があります(_は「使い捨て」を戻り値にLUA一般的な方法です)

Luaでの複数の戻り値の使用方法は、ほぼすべてのプログラムでどこからでも見ることができますが、これはPHPでこれほど頻繁ではありません - while(list(...) = each(...)) { }の場合の他にもあります。

特にPHPでの複数の戻り値についてのあなたの意見 - 良いプラクティスか悪いコードですか?

ありがとうございました!

+0

複数の戻り値の意味が分からない場合 - 配列を返すことを意味していますか? – xil3

+0

@ xil3:はい、彼はそれを意味します。 – NikiC

+1

@ xil3:いいえ、配列でもオブジェクトでもなく、全く異なるものです。いくつかの言語でしか利用できません。たとえば、C#ではタプルを返すことができますが、タプルは普通のオブジェクトです。複数の値を返すと、 '(firstName、lastName)= this.GetPersonName();'のようになります。 –

答えて

1

PHPでは複数の戻り値を使用しても問題ありません。少なくともあなたがそれをうまく使っているならば。いくつかの状況が本当に助けになる場合があります(例えば、このように面白いことでタプルを返すなど)。

もちろん、このような方法を文書化するときは注意が必要です。また、メソッドから20個の値を返す場合は、非常に間違ったものがあります。しかし、再び、それはPHPに関連していません。

なぜ、これはあまり頻繁にPHPで使用されないのですか?私の意見では、PHPプログラムを書くほとんどの人はそれを知らないためです。

+0

私はあなたの答えが大好きです、特にこの機能の知らないことについての最後の部分です。ドキュメンテーションは確かに問題です。どうやってやるの? – aurora

+1

これをsimpelのままにして、DocBlocksを '$ return array 2-tupel with(name:string、age:string)'として使うこともできます。それをどのように書いているのか、誰もが理解できるように文書化することは難しくありません。 – KingCrunch

+0

C#のように、PHPでIntelliSenseを取得する方法を文書化する公式の方法はありません。したがって、複数の戻り値のドキュメントを書くときには、単一戻り値メソッドの場合と同じようにして、複数の戻り値の部分がどのようなものであるかを調べます。 –

2

PHPでは、配列やオブジェクトを返すのが一般的です。すべての値を別々の変数に代入するのではなく、その配列やオブジェクトを直接操作します。

function get_preferences() { 
    return array('color' => 'red', 'size' => 'large', 'material' => 'cotton'); 
} 

$prefs = get_preferences(); 

echo "We're sending you a " . $prefs['size'] . " shirt."; 
+0

はい、私は知っています...私は前に戻り値としてオブジェクトとハッシュを使用していましたが、私は非常に好きで、私はPHPでの一般的な習慣ではないのかと思っていました。私は@MainMaが正しいと思います。多くのPHPプログラマがこれを認識しておらず、これが広く普及していないかもしれません。ありがとう。 – aurora

0

合理的に使用されていれば大丈夫だと考えます。 2番目の例は、while(list(...) = each(...))の例で、使用しない場合の例です。ここでは、これはループのforeachループのより遅い変形です。

PS:何か私が最近見つけ:ワン缶巣list()s :)

+0

私はこのネストされたリストのことを知らなかったが、それについて少し考えても、それはうまくいかない理由はない。共有ありがとう:)あなたは実際にそれを使用していますか? – aurora

+0

@harald:いいえ、これまでに使ったことはありません。しかし、PHPのyファイルをブラウズしながら、私はいつもネストされた 'list'sやby-reflambda(' function&(){} 'のような好奇心を見つけます。ただ指摘したい;) – NikiC

1

ようにするにはそのクリア:「配列を返します」「複数の値を返す」と同じではありません。後で簡単にはできません。

私は時々「タペル」の一種として配列を返しますが、これが必要な非常にまれなケースがあります。ほとんどの場合、関数/メソッドは特定の値を返します。

たとえば、指定されたインデックスに文字列を分割する関数が必要です。この場合、配列を返すことになります

+0

私は参照してください。あなたはそれを使用します、それは有用である/意味があり、あなたはそれについて悪い気持ちを持っていません...? – aurora

+0

いいえ、どうですか?その単なるタプルとタプルは、明確に定義されたデータ型です。だから、なぜPHP開発者はこのタイプを使用しないのですか?そして、私が言及したように:本当に多くのケースはない、それは返されるtupelsを必要とします。 – KingCrunch

関連する問題