2016-04-01 12 views
0

Best Practice, um ein Objekt als Argument zurückzugeben ?? Spezifischer welche der folgenden Implementierungen als besser angesehen?Rückgabeobjekt als Argument

a)

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

$bar->doSomethingToFoo($foo); 

b)

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

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

Das Beispiel war zu dump.Hope Sie das allgemeine Konzept der meine Frage verstehen.

Antwort

0

Wenn Ihre doSomethingToFoo($someObject) für das Ändern übergebener Objekteigenschaften verantwortlich ist, müssen Sie das geänderte Objekt nicht zurück an den Clientcode senden (dies wäre eine redundante Methode).
Wenn ein Objekt über ein Argument gesendet wird, ist dieses Argument ein Zeiger auf das ursprüngliche Objekt. Somit wird Ihre Funktion das ursprüngliche Objekt direkt beeinflussen.
Betrachten Sie das folgende Beispiel:

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

Mit Ihrem Weg ist es nicht so offensichtlich für den Leser, welcher Teil Ihres Codes den Zustand von '$ foo' ändern. Etwas, das deinen Code zum Debuggen schwer macht. – dios231

+0

@ dios231, ich habe ein sehr einfaches Beispiel vorgestellt. Wenn Sie Schwierigkeiten mit solchen einfachen Dingen haben, sollten Sie einige Bücher vor dem Debuggen lesen. Zumindest sollten Sie diesen Artikel lesen: http://php.net/manual/en/language.oop5.references.php, obwohl es nicht genug sein wird – RomanPerekhrest

+0

wahrscheinlich haben Sie meine vorherige Erwähnung missverstanden. Ich wollte weder deinen Code noch dich beleidigen, Friede. Mein Hauptkonzept ist, dass in einer großen App, wo in einem einzigen Modul mehr als 100 Methodenaufrufe stattfinden, nicht so offensichtlich sein wird, wenn ein Objekt den Status ändert. Nehmen wir an, Sie haben 4 Methoden in Raw, die $ foo als Parameter verwenden. Wie kann der Leser wissen, in welcher Methode das Objekt auf einfache Art und Weise seinen Zustand ändert, ohne Doppel-Takes zu nehmen? – dios231

1

Interessante Frage. Beide sind technisch korrekt, aber nicht perfekt objektorientiert. Ich denke, das eigentliche Problem ist, dass sich der Zustand von foo wegen $ bar ändert. Dies bedeutet, dass die Funktion mindestens zwei Funktionen haben kann.

Es scheint besser zu sein, wenn ein Objekt seinen eigenen Zustand ändert, anstatt dass ein anderes Objekt den Zustand von foo ändert. Zum Beispiel:

$foo->changeState($bar->calculateValue($foo));