User-Klasse richtig erstellen

String

Erfahrenes Mitglied
Hallo zusammen,

nachdem ich nun wirklich einige Stunden gesucht habe, bin ich erst recht verunsichert.
Wie *** noch mal erstelle ich einen User-Klasse richtig?

Ich habe immer das Gefühl, dass Klassen in PHP alles unfassbar kompliziert machen.
Also gehe ich gleichzeitig davon aus, dass ich sie irgendwie falsch verwende.. :D

So in der Art, baue ich meine Klassen meist auf:
PHP:
class User {
     var $nick, $mail, $avatar, $punkte # usw...
     
     public function __construct($id) {
          # hier lade ich die Felder aus der Datenbank..
     }

     public function setMail($mail) {
          # prüfen ob Mail anders ist, in die DB schreiben
     }
}

Ist das so eigentlich überhaupt gedacht?
Irgendwie verstehe ich auch nicht so ganz, wo der Vorteil sein soll, das einfach kurz in der Datei zu machen, in der ich die eMail sowieso ändere..

Anstatt einfach kurz
PHP:
if($neuemail != $altemail) {
     # speicher in DB
}

Muss ich die Klasse erstellen und dann die Funktion aufrufen.
Okay, ist vielleicht ein schlechtes Beispiel, aber irgendwie..

Habt ihr da ein paar Ideen? Leider wird nirgends geschrieben: So sollte es gemacht werden, dass sollte nicht rein, so und nicht so... bla bla..

paD
 
1.) var ist veraltet und gehört ins php4-Zeitalter.
2.)Faustregel: Ein Objekt(eine Klasse) = Eine Aufgabe, Klassen sollten weiderverwendbar sein, also nach möglichkeit an keine Aufgabe im speziellen angepasst sein. (Dafür gibts dann ja noch vererbung, Dependency Injection, Objektkomposition...)
3.)Schau dir fertige Implementierungen an und schau dir was ab: http://ppfeufer.de/php-klasse-fuer-den-nutzerlogin/
4.) Schreib lieber mehr Klassen als zuwenig. (ört sich ejtzt komisch an, is aber so. Ich mach auch immer zu wenige Klassen sodass man dann schnell in die Gefahr kommt, Gott-Objekte zu bauen)
5.) Buchtipp: http://www.amazon.de/PHP-Design-Pat...864X/ref=sr_1_1?ie=UTF8&qid=1350933606&sr=8-1 (Es geht nur in der zweiten Hälfte des buchs um die Patterns, davor wird Praxisnah erklärt, wie man objektorientiert programmiert)

edit: ich seh rgade, dass die von mir gepostete Beispielimplementierung mehr buu als wuu ist... Musst du selber nochmal googlen.
 
Zuletzt bearbeitet:
Klassen eignen sich wunderbar um mehrere Objekte zu erstellen. Zum Beispiel Vektoren:
PHP:
class Vector{
  public $x, $y, $z;
  public function __construct($x, $y, $z){
    $this->x = $x;
    $this->y = $y;
    $this->z = $z;
  }
  public function getLength(){
    return sqrt($this->x*$this->x + $this->y*$this->y + $this->z*$this->z);
  }
}

$v1 = new Vector(1, 0, 0);
$v2 = new Vector(0, 3, 4);
echo $v1->getLength(); // 1
echo $v2->getLength(); // 5

Wenn man nur einen einzigen User verwendet, ist es nicht unbedingt Notwendig eine Klasse zu erstellen, allerdings erhöht das die Übersicht und das Verständnis des SourceCodes.

Unter letzterem Aspekt macht deine Klasse so schon Sinn, weil es einfach schöner zu lesen ist.
 
Okay, machen wir aus dem var halt nen private und gut :D

Hm.. also sind die hunderten Foren-Beiträge, die man so findet "Unsinn"?
Also die, die immer schreiben "nein, dass gehört nicht in eine Klasse" etc. etc.

Mal liest man, dass SQL nicht in eine Klasse gehört. - Warum auch immer!?

paD
 
Ja, für SQL führt man meist eine zusätzliche Abstraktionsschicht ein, um unabhängig von der API des gewählten DBMS und dessen version zu sein. Stell dir vor du wechselst den provider und statt MySQL stellt der nurnoch PostgreSQL zur Verfügung, dann müsstest du alle abfragen ändern. Wenn du aber eine Klasse implementierst, die gewisse methoden zur verfügung stellt, musst du nur diese ändern.

Anstatt msql_query("SELECT bli FROM bla WHERE blub = blob") schreibst du dann $this->db->select(bli, bla, array('where' => 'blub = blob') oder Ähnliches ;)
 
Hm.. aber wo ist da der große Vorteil zu einfachen Funktionen?
Wie im Ursprungsthread von mir gesagt, ich verstehe dieses ganze Objektgedöhne bei PHP nicht so wirklich.

Klar, ich kann damit tolle Vectoren und so weiter erstellen, weil es in PHP noch keine implementierten Lösungen gibt. Aber, eine Userklasse, Benutzerverwaltungsklasse, Loginklasse oder ähnliches, kann ich mir immer noch nicht so wirklich vorstellen.. :(

paD
 
@String
Dann lass es. Es ist nicht notwendig.
Wenn du an grössere Projekte kommst wirst du das von alleine vermissen.
 
Jup sehe ich ähnlich: Guck, was dir wirlich etwas erleichtern würde und schreib dann mal so ne klasse. Noch bevor du fertig bist fallen dir dann meist 1000 Sachen an, die man hätte besser machen können :)
Bei mir haben die frameworks übrigens den Schalter umgelegt, dass ich OOP ganz praktisch fand: Damit kann man einfach schneller entwickeln.
 
Also quasi nach dem Motto:
"Mist, jetzt muss ich das in dieser Datei wieder Programmieren.." wird es Zeit für eine Klasse? :D

paD
 
Nein, eher dann:

Mist, jetzt muss ich wieder 30 Files durchackern, weil ich meine Variablen so blöd verteilt habe.

Die Verwendung von Klassen ist nicht die Allerweltslösung. Wer mit Klassen programmiert, weiß warum er/sie das tut. Es schafft einfach besseren Überblick über den Code. Wenn alles, was zu einem bestimmten Use-Case gehört in einer gewohnten Kette zu finden ist, weil man MVC anwendet. Oder weil man statt bei jedem Datenbankaufruf eine neue Verbindung erstellt oder noch schlimmer die Datenbankverbindung global vorhält (Manipulation zur Laufzeit), statt das man ein Singleton einsetzt. Wenn man einen OR-Mapper verwendet, um z.B. sowas realisieren zu können:

PHP:
class Adresse
{
  private $_id;
  private $_strasse;
  private $_hausnummer;
  private $_plz;
  private $_ort;

  public function __construct($id, $strasse, $hausnummer, $plz, $ort)
  {
    $this->_id = $id;
    $this->_strasse = $strasse;
    $this->_hausnummer = $hausnummer;
    $this->_plz = $plz;
    $this->_ort = $ort;
  }

  public function getId()
  {
     return $this->_id;
  }

  /// Hier die restlichen Getter
}

class User
{
  private $_id;
  private $_name;
  private $_email;
  private $_passwort;

  private $_adressen;

  public function __construct($id, $name, $email, $passwort, array $adressen)
  {
    $this->_id = $id;
    $this->_name = $name;
    $this->_email = $email;
    $this->_passwort = $passwort;
    $this->_adressen = $addressen;
  }

  public function getId()
  {
    return $this->_id;
  }

  public function getAdressen()
  {
    return $this->_adressen;
  }

  public function getAdresseById($id)
  {
    foreach($this->_adressen as $adresse)
    {
      if($adresse->getId() == $id)
        return $adresse;
    }
  }
}

$yogurt = new User(1, 'saftmeister', 'saftmeister@mond-vega.universum', 'wahnsinnig-kompliziertes-passwort', array(
  new Adresse(1, 'Tempel des Besserwissers', '1a', 123456789, 'Vega-City'),
  new Adresse(2, 'Jungfrauengasse', 56, 987654321, 'Druidia')
  ) );

$zweitAdresse = $yogurt->getAdresseById(2);

echo "Yogurt heißt eigentlich " . $yogurt->getName() . " und wohnt am Zweitwohnsitz in " . $zweitAddresse->getOrt();

* Keine Garantie, das der Code funktioniert ;-)
 
Zurück