2012-02-09 5 views
2

私はこのような方法について話している:PHPでメソッド連鎖を使用すると、リソースやメモリに問題はありますか?

$object->method()->method1('param')->method2('param'); 

これらは、関数でオブジェクトを返すことによって作成されます。

return $this; 

私は、そのメソッドを使用するサードパーティ製のソフトウェアを見てきましたが、私は、あなたが継続的に全体のオブジェクトを返しているので、それはリソースやメモリに問題があるのビットを起こさないと、思ったんだけど?

+1

は、私はあなたが「連鎖メソッド呼び出し」ではなく、ネストされた方法を意味すると思います。そして私はあなたが参考文献を読むことをお勧めします。 –

+0

私の代わりに、「ネストされたメソッド」の「メソッドチェーン」を参照してタイトルを編集しました。 –

答えて

10

オブジェクト全体を返しているわけではなく、参照という参照をオブジェクトに返します。つまり、オブジェクトが存在するメモリ位置です。したがって、チェーンに沿ってメソッドが呼び出されるとき、オブジェクトは常にメモリ内にコピーされません。

デフォルトでは(が主ですが、実際の詳細についてはのリンクを参照してください)、objects in PHP are passed, returned, and assigned by referenceです。オブジェクトを返すことにより

See the PHP docs on references.

+0

文字列のようなものもメモリアドレスとして渡されます。私は数値が常にコピーされると信じていますが、関係なく、彼らはとにかく行く何バイト限りメモリアドレスを渡すと、その類似したように、バイト値が小さいです。 – goat

2

連鎖方法は、実際に効率的です。

スタックは、チェーンに新しいメソッドを追加することによって、より大きな成長しません。 PHPは、オブジェクトのコピーが、参照を返さない

、そのオブジェクトが、「ポインタ」を渡しません。

0

者は「ネストされたメソッド」ではありませんが、それはmethod chainingと呼ばれる、それは(あなたがとにかく「スタック内の深い」つもりはない)とにかく性能に影響を与えるべきではありません。

あなたはそれらの断片にコードを分割することができます:

$res = $object->method(); 
$res = $res->method1('param') 
$res = $res->method2('param'); 
// and res is still equivalent to $object if you return $this 

だから何のオブジェクトのコピー、ネストされた呼び出しは、「呼び出しスタック」には多くの項目が...いいえ、パフォーマンス・オーバーヘッドは、あなたがうまくあってはなりません。

関連する問題