2017-09-20 8 views
2

私は最近、ユーザーの投稿データを取得するためにSlim\Http\MessageSlim\Http\Requestを使用しなければなりませんでした。oopでオブジェクトのクローンを返すのはなぜですか?

$thisではなく、オブジェクトのクローンを返すメソッドwithBody()に何か気付いた。

$request->withBody(...)に変数($request)を割り当ててから、そのスクリプトで新しい変数を使用して実行するまで、アプリケーションを動作させることができなかったため、これは私にとって問題でした。

私は説明する模擬例があります(コードのコメントを参照してください)。

class Request { 
    protected $body; 

    public function addBody($body) { 
     $clone = clone $this; 
     $clone->body = $body; 
     return $clone; 
    } 

    public function getBody() { 
     return $this->body; 
    } 
} 

$request = new Request; 

// this will return NULL 
$request->addBody([ 
    'name' => 'john', 
    'email' => '[email protected]', 
]); 

var_dump($request->getBody()); 

// ----------------------- 

// but this will return the "body" that was passed in above. 
$request = $request->addBody([ 
    'name' => 'john', 
    'email' => '[email protected]', 
]); 

var_dump($request->getBody()); 

ここで何が起こっているのか分かります。しかし、私は理解していないなぜクラスはこのように実装されるだろう。

どのようなメリットがありますか?このように開発者を制限するのはなぜですか?

+4

を実際PSR-7標準でおしっこを見てhttps://blog.joefallon.net/2015/08/immutable-objects -in-php /)」となります。 – Fildor

+0

そして機能プログラミング –

+0

意見に基づいて投票に投票しました。 https://softwareengineering.stackexchange.comを試してみてください。そこに移行する投票はできません –

答えて

3

スリムは、次のように自分自身を説明PSR-7 HTTPメッセージング・インターフェース標準を、使用しています。

<?php 
namespace Psr\Http\Message; 

/** 
* HTTP messages consist of requests from a client to a server and responses 
* from a server to a client. This interface defines the methods common to 
* each. 
* 
* Messages are considered immutable; all methods that might change state MUST 
* be implemented such that they retain the internal state of the current 
* message and return an instance that contains the changed state. 
* 
* @see http://www.ietf.org/rfc/rfc7230.txt 
* @see http://www.ietf.org/rfc/rfc7231.txt 
*/ 
interface MessageInterface 
{ 
    //etc 
} 

"メッセージは不変と考えています"。それらはValueオブジェクトとみなされ、状態を変更する必要はありません。状態を変更する場合は、新しいインスタンスが返されます。

はここのリンクを説明する価値がhttp://deviq.com/value-object/

をオブジェクトやページから少しの抽出物は、私がリンクされます:

値オブジェクトのみ そのプロパティの状態によって区別される不変タイプです。つまり、 の一意の識別子を持ち、そのプロパティが であっても区別できないエンティティとは異なり、正確に同じプロパティーを持つ2つの値オブジェクト は等しいと見なすことができます。バリューオブジェクトは、エバンスのドメイン駆動設計の書籍で最初に説明されたパターン であり、Smith とLermanのドメイン駆動設計の基礎コースでさらに説明されています。

この情報を参考にしてください。

最後に、([不変オブジェクト]」あなたが調査したい場合があり、ここでhttp://www.php-fig.org/psr/psr-7/

関連する問題