2016-04-01 10 views
0

オブジェクトを引数として返すのがベストプラクティスですか? 次の実装のうち、どれがより優れていると考えていますか?あなたは私の質問の一般的な概念を理解してdump.Hopeオブジェクトを引数として返す

A)

$foo = new ClassAInstance(); 
$bar = new ClassBInstance(); 

$bar->doSomethingToFoo($foo); 

B)

$foo = new ClassAInstance(); 
$bar = new ClassBInstance(); 

$foo = bar->doSomethingToFoo($foo); 

例があまりにもでした。

答えて

0

doSomethingToFoo($someObject)が渡されたオブジェクトのプロパティを変更する必要がある場合、変更されたオブジェクトをクライアントコードに戻す必要はありません(冗長な方法です)。
オブジェクトが引数で送られるとき、その引数は元のオブジェクトへのポインタです。したがって、関数は元のオブジェクトに直接影響します。

class ClassA { 
    public $name; 

    public function __construct($name) { 
     $this->name = $name; 
    } 
} 

class ClassB { 
    function doSomethingWithObject($obj){ 
     $obj->name = "changed name"; 
    } 
} 

$foo = new ClassA("John"); 
echo $foo->name; // "John" 

$bar = new ClassB(); 
$bar->doSomethingWithObject($foo); 

echo $foo->name; // "changed name" 

http://php.net/manual/en/language.oop5.references.php

+0

あなたのコードのどの部分が '$ foo'の状態を変更するかは、読者には分かりません。あなたのコードをデバッグのために難しくするもの。 – dios231

+0

@ dios231では、私は非常に簡単な例を提示しました。このような単純なことに問題がある場合は、デバッグする前にいくつかの本を読んでおくべきです。少なくとも、あなたがこの記事を読んでください:http://php.net/manual/en/language.oop5.references.phpを、しかし、 – RomanPerekhrest

+0

はおそらくあなたが私の以前の言及を誤解し、十分ではありません。私はあなたのコードやあなたの平和を侮辱したくありませんでした。私の主なコンセプトは、単一のモジュールで100以上のメソッド呼び出しを行う大規模なアプリケーションでは、オブジェクトが変更されたときにあまり明確ではないということです。 $ fooをパラメータとして取るrawの4つのメソッドがあるとします。読者は、どの方法でオブジェクトが自分の状態を変更するかを、二重のテイクを取らずに簡単な方法でどのように知ることができますか? – dios231

1

興味深い質問:
次の例を考えてみましょう。両方とも技術的には正しいですが、完全にオブジェクト指向ではありません。本当の問題は$ barのせいでfooの状態が変わるということです。つまり、関数には少なくとも2つの目的がある可能性があります。

fooの状態を変更する別のオブジェクトではなく、オブジェクトが自分の状態を変更するようにする方がよいでしょう。例:

$foo->changeState($bar->calculateValue($foo)); 
関連する問題