php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 12-07-2009, 22:50
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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); 
Mit Zitat antworten
  #2 (permalink)  
Alt 13-07-2009, 00:39
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Ü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.

Geändert von onemorenerd (13-07-2009 um 00:45 Uhr)
Mit Zitat antworten
  #3 (permalink)  
Alt 13-07-2009, 14:52
ModestLife
 Registrierter Benutzer
Links : Onlinestatus : ModestLife ist offline
Registriert seit: Sep 2007
Beiträge: 105
ModestLife ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
    
}

Mit Zitat antworten
  #4 (permalink)  
Alt 13-07-2009, 15:27
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
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 ....
Mit Zitat antworten
  #5 (permalink)  
Alt 13-07-2009, 21:45
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Habe ich eine Möglichkeit, beim instanzieren eines Objects einen Wert zurückzugeben?

Ich setze versch. Werte in der __construct, aber diese kann keinen Rückgabewert abgeben.
Gibt es da eine Möglichkeit?

Danke
Mit Zitat antworten
  #6 (permalink)  
Alt 13-07-2009, 21:48
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Noe, ist aber auch nicht nötig. Im Erfolgsfall hast du das Objekt, im Fehlerfall eine Exception.
Mit Zitat antworten
  #7 (permalink)  
Alt 13-07-2009, 21:53
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von unset Beitrag anzeigen
Noe, ist aber auch nicht nötig. Im Erfolgsfall hast du das Objekt, im Fehlerfall eine Exception.
Auch war.
Mit Zitat antworten
  #8 (permalink)  
Alt 13-07-2009, 22:41
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich sehe immer wieder, dass viele Leute Ihre Klassen in ganz viele Methoden aufteilen und diese nacheinander abklappern.

Jedoch finde ich es manchmam übertrieben, für selbst nur eine abfrage eine Methode zu basteln welche nur 1. programmzeile enthält.

Ist das so "gängig" oder schon eine Art der übertreibung?

Wenn ich finde, eine Methode kann so gestaltet bleiben, auch wenn Sie etwas größer ist, jedoch keine Funktion in der Methode jemals von etwas anderem gebraucht wird, so bleibt die große Methode so, wie sie ist.

Oder doch lieber alles schön aufteilen?

z.B. jede SQL Abfrage und das Ergebnis return'n usw.

Danke
Mit Zitat antworten
  #9 (permalink)  
Alt 13-07-2009, 22:44
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Erstmal alles in der Funktion lassen. Aber sobald sich der selbe oder ähnliche Code an anderer Stelle wiederholt, anfangen zu refaktorieren.

Les- und Wartbarkeit sollte allerdings auch eine Rolle spielen.
Mit Zitat antworten
  #10 (permalink)  
Alt 13-07-2009, 22:50
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Sobald eine meiner Methoden länger wie 20 Zeilen wird, versuche ich diese aufzuteilen. Generell solltest du in einem kurzen Satz erklären können, was die Methoden macht. Benötigst du ein und oder mehrere Sätze, wird es Zeit zum Aufteilen. Der Vorteil der Aufteilung ist die Übersicht und erbende Klassen können einzelne Teile der Funktion gezielt überschreiben. Sehr gerne nutze ich eine einzelne öffentliche Methode, welche den eigentlichen Vorgang an mehrere Untermethoden delegiert. Über Chaining ist das super zu lesen:
PHP-Code:
class Blubb {
    public function 
doIt() {
        return 
$this
            
->loadData()
            ->
transformBlubb()
            ->
somethingElse()
            ->
createResponse();
    }

Im Fehlerfall wird einfach eine Exception geworfen. Außerdem ist es für diese Methode völlig transparent, ob eine Untermethode auf weitere Objekte zugreift (die createResponse-Methode zum Beispiel auf eine ResponseRenderer-Klasse oder loadData auf die Datenbank?), der Ablauf ist aber ganz klar definiert. Und im Fehlerfall? Einfach die Exception fliegen lassen.
Mit Zitat antworten
  #11 (permalink)  
Alt 13-07-2009, 22:56
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von onemorenerd Beitrag anzeigen
Erstmal alles in der Funktion lassen. Aber sobald sich der selbe oder ähnliche Code an anderer Stelle wiederholt, anfangen zu refaktorieren.

Les- und Wartbarkeit sollte allerdings auch eine Rolle spielen.
Hm.. Gut.
Mit Zitat antworten
  #12 (permalink)  
Alt 13-07-2009, 23:46
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich habe oft das Problem, nicht zu wissen, wo ich eine Methode einordnen soll.
z.B. besitzt die Klasse "user" mehrere Methoden, welche den user betreffen wie z.B. ein bestimmtes Detail über den User ausgeben wie das Alter o.ä. und dann gibt es Situationen, da möchte ich z.B. den Pfad und den Dateinamen des Profilbildes des Users haben.

Erstelle ich nun eine neue user Methode z.B. get_user_picturepath oder verbau ich diese lieber in der class.picture.php, in welcher auch uploadmethoden des userbildes vorhanden sind?

Hach, das ist manchmal garnicht so leicht finde ich
Mit Zitat antworten
  #13 (permalink)  
Alt 14-07-2009, 01:01
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Dein Problem liegt einfach darin, dass du die Methoden in bereits vorhandene Klassen einsortieren willst. Wie du schon sagst, die get_user_picturepath-Methode passt nicht recht in die user-Klasse, aber auch irgendwie nicht in die picture-Klasse, beide hätten aber was mit dieser Methode zu tun. Lösung: Eine neue Klasse erstellen, welche dann über eine user- und picture-Instanz den Vorgang ausführen kann. Und alles was du momentan schon an Userbild-Methoden in der picture-Klasse hast, refaktorisierst du in diese Klasse.
Mit Zitat antworten
  #14 (permalink)  
Alt 14-07-2009, 01:05
phpMorpheus2
 Registrierter Benutzer
Links : Onlinestatus : phpMorpheus2 ist offline
Registriert seit: Apr 2007
Beiträge: 646
Blog-Einträge: 2
phpMorpheus2 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ja aber dann habe ich später ja zich php-Dateien!?
Mit Zitat antworten
  #15 (permalink)  
Alt 14-07-2009, 01:09
unset
  Moderator
Links : Onlinestatus : unset ist offline
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.782
unset befindet sich auf einem aufstrebenden Ast
Standard

Und wo ist das Problem? Ein durchschnittliches Projekt von mir hat (jenseits der eingesetzten Frameworks) gerne mal mehrere Hundert eigene Klassen – in jeweils eigenen Dateien. Alles eine Frage der Organisation.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
object via return aus funktion übergeben analyzer PHP Developer Forum 16 07-03-2008 14:53
Referenz oder clone? McMuh PHP Developer Forum 7 21-09-2007 14:03
bei submit(); Werte übergeben die nicht von einem Formularfeld stammen - sanktusm HTML, JavaScript, AJAX, jQuery, CSS, Bootstrap, LESS 3 25-07-2007 13:21
Objekt als Referenz übergeben? getphp PHP Developer Forum 4 19-05-2005 16:49
Klassen Object in Session übergeben. niknormal PHP Developer Forum 3 20-08-2003 14:35

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

ADSMAN V3 - Werbe-Manager ansehen ADSMAN V3 - Werbe-Manager

ADSMAN V3 - mehr als nur ein Bannermanager! Banner, Textanzeigen und PagePeel Manager! Mit ADSMAN PRO haben Sie die Marketinglösung für eine effektive und effiziente Werbeschaltung mit messbaren Ergebnissen. Unterstützt werden Bannerformate in beliebi

25.10.2018 virtualsystem | Kategorie: PHP/ Bannerverwaltung
PHP News und Artikel Script V2

News schreiben, verwalten, veröffentlichen. Dies ist jetzt mit dem neuen PHP News & Artikel System von virtualsystem.de noch einfacher. Die integrierte Multi-User-Funktion und der WYSIWYG-Editor (MS-Office ähnliche Bedienung) ermöglichen...

25.10.2018 virtualsystem | Kategorie: PHP/ News
Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 02:39 Uhr.