2013-03-16 24 views
6

Ich bin immer noch ein wenig neu in PHP OO Programmiertechniken und ich habe eine sehr einfache allgemeine Frage, ist es in der Regel schlechte Praxis, eine Klasse in einer Klasse zu instanziieren, dann diese Instanz übergeben zu einer anderen Klasse?PHP Eine Instanz einer Klasse an eine andere Klasse übergeben

Ich möchte in der Lage sein, eine Instanz einer bestimmten Klasse zu erstellen, die ich immer mit jeder Benutzeranforderung benötigen werde. Klasse zwei ist mehr als nur eine Hilfsklasse, idealerweise wäre es in meiner Anwendung ein "Loader", der die Ansichten lädt.

Erste Klasse, die die beiden anderen Klassen aufruft:

require 'classTwo.php'; 
require 'classThree.php'; 

class first { 
    public $classTwo, $classThree; 

    public function __construct() { 
      $this -> classTwo = new classTwo; 
      $this -> classThree = new classThree; 

      $this -> classThree -> displayNum($this -> classTwo); 

    } 
} 

Zweite Klasse, die die Hilfsklasse ist:

class classTwo { 
    public function returnVal() { 
      return 123; 
    } 
} 

dritte Klasse ist die Action-Klasse, wo aktuelle Arbeit und letzte Anzeige passieren würde:

class classThree { 
    public function displayNum($instance) { 
      echo $instance -> returnVal(); 
    } 
} 

Insgesamt möchte ich nur wissen, ob das schlechte Praxis ist, weil ich nie gesehen habe es vorher gemacht.

Vielen Dank im Voraus!

+1

upvoted, da es eine gute Frage zu stellen ist, und ich wünschte, ich hätte solche Fragen gebeten hatte, wenn Ich habe zuerst OOP gestartet. Sobald Sie mit Abhängigkeitsinjektion vertraut sind, die der Link in Jaitsus Antwort gut abdeckt, empfehle ich einen Blick auf [Pimple] (http://pimple.sensiolabs.org/), der ein DI-Container für alle Ihre Klassen und Parameter ist. –

+0

Dank @ Adam-E Ich stimme definitiv zu und ich habe genug PHP OO Techniken gearbeitet und gelesen und habe nie die Methode gesehen, die ich vorher benutzte und ich dachte wer besser als Stack Overflow Benutzer zu fragen, die ich immer sehr hilfreich finde. Ich werde definitiv in Pimple schauen, danke! –

Antwort

8

Es ist eine gute Übung, alle abhängigen Objekte zu injizieren, da Sie so während des Komponententests ziemlich leicht nachspionieren können.

Generell, wenn Sie ClassA und stützt sich auf eine Instanz von ClassB haben dann funktionieren Sie wie etwas tun könnte ..

$objectB = new ClassB(); 
$objectA = new ClassA($objectB); 

Werfen Sie einen Blick auf http://net.tutsplus.com/tutorials/php/dependency-injection-in-php/

EDIT: Constructor Injektion Übergeben der Abhängigkeit in den Konstruktor des neuen Objekts (wie oben gezeigt).

Setter Injektion wird unter Verwendung eines Verfahrens, das die Abhängigkeit zu setzen, und wird in der Regel verwendet, wenn die Abhängigkeit nicht kritisch ist:

$objectB = new ClassB(); 
$objectA = new ClassA(); 
$objectA->setObjectB($objectB); 
+0

Vielen Dank @Jaitsu, Können Sie mir sagen, warum es besser ist, die Instanz von Instanziierung als von einer Methode zu übergeben. –

+0

10 @ TomBird Es gibt zwei Arten von Injektion, Setter-Injektion und Konstruktor-Injektion. Wenn die Abhängigkeit optional ist, verwenden Sie normalerweise Setter-Injection, aber wenn Ihr Objekt * eine Instanz eines anderen Objekts empfangen muss, um zu arbeiten, dann verwenden Sie Konstruktorinjektion – JamesHalsall

2

Ja. Dies würde es sehr schwierig machen, Ihre first Klasse zu testen, da in ihr Abhängigkeiten fest codiert sind.

Entweder die Instanzen der Klassen injizieren oder eine Fabrik injizieren.

Verwandte Themen