Benutzer-Klasse

String

Erfahrenes Mitglied
Hallo zusammen,

ich arbeite (ich muss gestehen) zum ersten mal ernsthaft mit Klassen und habe ein paar Fragen dazu.
Aktuell habe ich eine Benutzer (User)-Klasse aufgebaut:

PHP:
class User {
	// Initialisierung
	public function __construct($id){
		$myData = mysql_query("....");
		$myData = mysql_fetch_assoc($myData);
		
		$this->id			=	$myData['id'];
		$this->name		=	$myData['name'];
		$this->rechte		=	$myData['rechte'];
		$this->bewertung	=	$myData['bewertung'];
		$this->onldat		=	$myData['onldat'];
		$this->p_geschlecht	=	$myData['p_gesch'];
		$this->p_geb		=	$myData['p_geb'];
		$this->p_name		=	$myData['p_name'];
		$this->p_bild		=	$this->getProfilBild($myData['p_bild']);
		
		// Online Zeit erneuern
		$this->setOnline();
	}

// Profil updaten
	public function updateProfil($name,$geb,$gesch) {
		$this->p_geschlecht	=	$gesch;
		$this->p_geb		=	$geb;
		$this->p_name		=	$name;
		mysql_query("..."); // MYSQL user Updaten
	}
}

Ich habe funktionen wie "setOnline" und so weggelassen, zu übersichtiglichkeit.
Ist das der richtige Weg? Oder ist das absoluter blödsinn?

Und wenn ich nun eine Tabelle erstellen will, welche anzeigt, welche User gerade online sind, erstelle ich dann für jeden Eintrag ein neues Objekt dieser Klasse? Oder erstelle ich eine neue Klasse..? Oder ist das gesamte, was ich da veranstalte für die Katz?

Ihr seht..fragen über fragen *G*

Danke schonmal für eure Hilfe :)

string
 
Hallo String,

ich finde es ist sehr schwer Antworten auf deine Fragen zu finden. Ob Du es richtig machst oder nicht? Dafür fehlen genauerer Informationen (Modelle).

Bei der Webprogrammierung verhält sich das genau so wie bei der Programmierung von Desktop-Software. Am Anfang brauchst Du ein Konzept in diesem legst Du die tiefe der Abstraktionen fest. Danach können dann die Klassen erzeugt werden (ganz grob beschrieben).

Ich würde dir Empfehlen sich mit MVC Prinzip vertraut zu machen. UML Modelierung ist auch bei solchen Sachen sehr hilfreich.

in deinem Code oben wurde ich folgendes verändern:
-mysql Verbindung raus
-alle Varibalen private
-getter/setter einfügen oder magic Methoden benutzen
-je nachdem wie gross und komplex die Anwendung zwei Klassen für user und users

gruss
 
Zuletzt bearbeitet:
Das ganze Zeugs UML, MVC Prinzip.. *grusel* es fühlt sich an wie gestern als unser Lehrer uns das quälend beigebracht hat *G*

Grundsätzlich wollte ich eig. erstmals wissen, ob "man" eine "user"-klasse so aufbaut. Oder ob ich da schon einen Denkfehler hatte.
Und wie es halt bei einer Schleife aussieht. Weil ich ja grundsätzlich bei den ganzen Usern immer wieder mysql abfragen hätte. Also, wenn ich 100 User ausgeben, werden 100 Querys ausgeführt..was ja irgendwie nicht sinn der sache sein sollte..

Und wo ist der unterschied zwischen einer Public und einer Private.. also, wieso macht man das mit getter und settern?

Mysql-Verbindung raus? Wie genau meinst du das? Alle vars. für die Klasse vorher aus der DB rausholen und dann mit setter an die klasse übergeben? Oder in der Klasse eine mysql Klasse nutzen?

string
 
Wie "man" eine "user" klasse macht ist nicht zu beantworten, da es darauf ankommt, was alles benötigt wird und wofür.
Unterschied zwischen public und private:
PHP:
class test{
  public $foo = 'Hallo';
  private $bar = 'Welt';
  public function get_bar(){
    return $this->bar;
  }
  public function set_bar($value){
    $this->bar = $value;
  }
}
$test = new test();
echo $test->foo; //Hallo
echo $test->bar; //Fehlermeldung da bar nicht öffentlich (public) zugänglich ist
echo $test->get_bar(); //Welt
$test->set_bar('Planet');
echo $test->get_bar(); //Planet
 
private/public
Es gibt Methoden die nur Klassenintern genutzt werden. Diese schön immer mit private (oder protected, wenn es Sinn macht dass ein Chield diese Methode benutzen darf).

Für Auflistungen brauche ich meistens eine eigene Klasse. Ein ArrayObject. Das könnte dann etwa so aussehen (alles ungetestet)
PHP:
<?php
//Ein User gezielt laden
$user1 = new User(1);
//Alle Users als ArrayObject laden
$allUsers = new Users();

//$user sieht nun gleich aus wie $allUsers->offsetGet(1);

class Users extends ArrayObject{
    public function __construct(){
        $result = mysql_query('SELECT id, name FROM tbl_users');
        while($row = mysql_fetch_assoc($result)){
            $user = User::instanceOfByArray($row);
            $this->offsetSet($user->getId(), $user);    
        }
    }
}

class User{
    private $id;
    private $name;
    public function __construct($id=false){
        //Nur laden wenn eine ID mitgegeben wird
        if($id!==false){
            $result = mysql_query("SELECT id, name FROM tbl_users WHERE id = {$id}");
            $row = mysql_fetch_assoc($result);
            $this->initByArray($row);
        }
    }
    
    public function initByArray($array){
        $this->id   = $array['id']; 
        $this->name = $array['name'];         
    }

    public static function instanceOfByArray($array){
        $instance = new self();
        $instance->initByArray($array);
        return $instance;
    }
    
    public function getId(){return $this->id;}
    public function getName(){return $this->name;}
}

?>
$

Die Vaiblen sind als private deklariert. Es gibt nur einen Getter. Dadurch ist es nicht möglich von aussen einfach Attribute zu überschreiben. Wenn man einen Setter macht, kann man darin den neuen Wert auch validieren, damit nicht einfach alles rein geschrieben werden kann.

Die Statische Funktion ist immer gut als altrernatives Create-Methode....
 
Okay gut, ich fasse schonmal zusammen:
Ich werde bei Listen eine neue Klasse erstellen.

Aber was ist denn nun mit dem MySQL in der Klasse..? Lasse ich das da drinne?

Und den Unterschied zwischen private und public kenne ich schon. Aber ich verstehe nicht ganz, wieso es wichtig ist darauf Wert zu legen..?

string
 
hi @ all,

also ich benutze für Datenbakabfragen immer eine extra Klasse. Diese Liefert mir dann mal eine Row oder Rows jenach dem was ich brauche.

SQL -"Code" versuche ich wie HTML -Zeugs von der Logik zu trennen!

mfg

PHP:
class Verein extends gcuser {
    
    public $_post = array(
    );
    
    private $_gcuser;
    private $_idverein;
    
    private $_tabOps;
    
    public $arrMembers = array(
    );
    public $arrBsts = array(
    );
    
    private $_tab_columns = array(
        'idverein'=>'', 'register'=>'', 'idgcuser'=>'', 'vereinsname'=>'', 'vorstand'=>'',
             'anredevorstand'=>'', 'partner'=>'', 'anredepartner'=>'', 'bundesland'=>'',
             '	stbvnr'=>'', 'logo'=>'', 'partnerart'=>''
    );
    
    private $_tableStructure = array(
        'tab'=>'', 'pk'=>'idgcuser', 'tab_column'=>'', 'fk'=>'idgcuser'
    );
    
    public function __construct($id = '') {
        
        $this->_tableStructure['tab_column'] = &$this->_tab_columns;
        
        $this->_tab = 'gc_verein';
        
        $this->_tableStructure['tab'] = $this->_tab;
		
		$this->tables[] = $this->_tableStructure;
        
        $this->mergedTableHeads = array_merge($this->gc_userTableHead['tab_column'], $this->_tab_columns);
        
        $this->_tabOps = new TableOps();
    }

das $this->_tabOps leifert mir dir Methoden zum Arbeiten auf den Daten. Das ist der einfachste weg. Oder wie gesagt Du Implementierst das MVC ;) Dann ist die Trennung noch eindeutiger.

projumper
 
Zuletzt bearbeitet:
Zurück