Einem Object Werte oder Referenz übergeben?

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

  • onemorenerd
    antwortet
    Zitat von ModestLife Beitrag anzeigen
    Was spricht gegen das Interface als Type Hint?
    Das Interface ist semantisch schwächer als eine konkrete Klasse. PN braucht nicht die Id von irgendeinem Objekt sondern von einem User.
    Angenommen wir machen
    PHP-Code:
    class PN {
        public function 
    __construct(Identifiable $user) { ... }
    }

    class 
    Product implements Identifiable { ... }

    $pn = new PN(new Product($id)); 
    Das funktioniert, und genau das soll es nicht. Denn später wird sowas kommen wie $pn->save().
    Dabei landet die PN z.B. in der DB. Dummerweise mit einer Produkt-Id in der uid-Spalte. Wenn es zufällig einen User mit diese Id gibt ....

    Einen Kommentar schreiben:


  • ModestLife
    antwortet
    Was spricht gegen das Interface als Type Hint? Abgesehen von deinem Vorschlag mit der abstrakten Klasse, macht das Beispiel ansonsten keinen Sinn. :-)

    PHP-Code:
    interface Identifiable {
        public function 
    getId();
    }

    // Interface brauchen wir aus irgendeinem Grund nicht mehr ...
    class User {
        public 
    $id;
    }

    class 
    PN {
        public function 
    __construct(User $user) {
            
    $uid $user->getId(); // Fail, Methode gibt's nicht mehr
        
    }

    Einen Kommentar schreiben:


  • onemorenerd
    antwortet
    Übergib das ganze User-Objekt. Die Klasse pn muss nämlich nicht zwangsläufig geändert werden, wenn sich die Klasse User ändert. Für sowas gibt es Interfaces.
    Solange User das Interface implementiert, dass PN erwartet, ist alles okay. Damit hast du das Problem verlagert: User kann sich ändern, nur das Interface muss gleich bleiben. Das ist der Sinn von Interfaces, sollte also kein Problem sein.

    PHP-Code:
    interface Identifiable {
        public function 
    getId();
    }

    class 
    User implements Identifiable {
        public function 
    getId() {
            return 
    $this->id;
        }
    }

    class 
    PN {
        public function 
    __construct(User $user) {
            
    $uid $user->getId();
        }

    Im Ctor von PN könnte man als Type Hint auch nur Identifiable verwenden. Aber semantisch gesehen wäre das imho zu lasch.
    Ich würde stattdessen eher eine abstrakte Klasse einführen, die Identifiable implementiert, eine Property id hat und den Getter dafür. Auf diese abstrakte Klasse würde ich den Type Hint setzen, wenn man mich dazu überredet.
    Zuletzt geändert von onemorenerd; 12.07.2009, 22:45.

    Einen Kommentar schreiben:


  • phpMorpheus2
    hat ein Thema erstellt Einem Object Werte oder Referenz übergeben?.

    Einem Object Werte oder Referenz übergeben?

    Hallo Leute.

    Wenn eine Klasse z.B. eine ID braucht o.ä., wird diese als Parameter mitgeliefert.

    Nun die Frage:
    Sollte man immer nur den explizit benötigten Wert übergene,
    oder eine Referenz des Objectes, welches den benötigten Wert enthält?

    Beispiel:
    Für das Lesen einer PN benötigt die PN Klasse die ID des angemeldeten Nutzers.
    Instanziere ich nun ein user object und gebe das der pn klasse als referenz, sodass dann das erstellte pn object sich die benötigten Daten aus der Referenz zieht oder einfach nur den expliziten Wert?

    Weil:
    Wenn ich ein Object übergene und es mal ändern sollte, aus welchem Grund auch immer, dann müssen alle Klassen welche referenzen der user klasse nutzen auch umgeschrieben werden...

    PHP-Code:
    $user = new user();
    $pn =  new pn($user);
    // ... 
    oder

    PHP-Code:
    $user = new user();
    $wert $user->id;

    $pn =  new pn($wert); 
Lädt...
X