Ankündigung

Einklappen
Keine Ankündigung bisher.

PHP Constructor Injection

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • PHP Constructor Injection

    Hallo zusammen,

    ich versuche gerade das Prinzip der Injections besser zu verstehen. Dabei scheitere ich aber an einem Fehler, auf dessen Lösung ich selber nicht komme.
    Zum Test habe ich diese beiden leeren Klassen:
    Code:
    <?php
    class Database {
        private $db;
    
        public function __construct(Database2 $test) {
    
            $this->db=$test;
    
        }
    }
    
    class Database2
    {
        public function __construct() {
    
        }
    
    }
    ?>
    Diese rufe ich dann wie folgt auf:
    Code:
    <?php
    spl_autoload_register(function ($class_name) {
        include $class_name . '.php';
    });
    
    $t=New Database();
    var_dump($t);
    ?>
    Ich erhalte jedoch immer den Fehler, dass $test noch kein Objekt beinhalten würde: Fatal error: Uncaught TypeError: Argument 1 passed to Database::__construct() must be an instance of Database2, none given, ...

    Wer kann mir bitte sagen, was ich falsch mache?

    Besten Dank,
    Poscht

  • #2
    Du betreibst kein DI. PHP macht das nicht von alleine, sowas musst du dir schon selbst schreiben, oder auf eine fertige DI-Lib zurückgreifen.
    [QUOTE=nikosch]Macht doch alle was Ihr wollt mit Eurem Billigscheiß. Von mir aus sollen alle Eure Server abrauchen.[/QUOTE]

    Kommentar


    • #3
      Zitat von tkausl Beitrag anzeigen
      Du betreibst kein DI. PHP macht das nicht von alleine, sowas musst du dir schon selbst schreiben, oder auf eine fertige DI-Lib zurückgreifen.
      Schade, ich hatte gehofft, dass die Instanzierung der Klasse Database2 dann schon von PHP übernommen wird.
      Wenn ich die beiden Klassen selber instanziere klappt es.

      Code:
      <?php
      spl_autoload_register(function ($class_name) {
          include $class_name . '.php';
      });
      
      $test1=New Database2();
      $test2=New Database($test1);
      var_dump($test2);
      ?>

      Kommentar


      • #4
        Und genau das ist Dependency Injection.

        Automatisch wäre totaler nonsense. Woher soll denn Database wissen, wie es das Objekt Database2 zusammenstellen muss, bzw. konfigurieren soll? Da ist ja das ganze Prinzip von DI hinfällig, da du eine statische Bindung zwischen beiden herstellst.
        "Software is like Sex, it's best if it's free." - Linus Torvalds

        Kommentar


        • #5
          Wenn du das Konzept verstanden hast, kannst du PHP-DI für den praktischen Einsatz nutzen. Das unterstützt u.a. Autowiring.
          [SIZE="1"]Atwood's Law: any application that can be written in JavaScript, will eventually be written in JavaScript.[/SIZE]

          Kommentar


          • #6
            da deine Beispielimplementation nach Singleton "müffelt" ....

            im RealFall würde ich je nach Anwendungsgröße einige (dutzend) Objecte beider Classen erwarten .. woher soll bitte ein neu erstelltes Object Database wissen, WELCHES der (vielen) Database2-Objecte es benutzen soll ?
            solch MetaIntelligenz kannst du nicht ernsthaft von Computern und Programmiersprachen erwarten

            PS rein Interesse halber .. welche Version benutzt du, dass du im Constructor den Type der Variable mit deklarieren kannst ?
            "Irren ist männlich", sprach der Igel und stieg von der Drahtbürste [IMG]http://www.php.de/core/images/smilies/icon_lol.gif[/IMG]

            Kommentar


            • #7
              Zitat von eagle275 Beitrag anzeigen
              PS rein Interesse halber .. welche Version benutzt du, dass du im Constructor den Type der Variable mit deklarieren kannst ?
              Das geht für Objekte seit der 5er.
              VokeIT GmbH & Co. KG - VokeIT-oss @ github

              Kommentar


              • #8
                Zitat von eagle275 Beitrag anzeigen
                da deine Beispielimplementation nach Singleton "müffelt" ....
                Das waren nur die ersten "kreativen" Klassennamen, der mir zum Testen eingefallen sind.

                Kommentar


                • #9
                  Zitat von lottikarotti Beitrag anzeigen
                  Wenn du das Konzept verstanden hast, kannst du PHP-DI für den praktischen Einsatz nutzen. Das unterstützt u.a. Autowiring.
                  Besten Dank, schaue ich mir dann mal genauer an.

                  Kommentar


                  • #10
                    Ich habe im Bezug auf PHPDI auch mal ein Beispiel fürs Autowiring angelegt: https://github.com/rkrx/autowiring-example


                    Kommentar

                    Lädt...
                    X