OOP: Objekt an Klasse geben

cobraone

Mitglied
Hallo ich würde gerne wissen, ob mein Verständnis von OOP soweit verstanden ist. Ich habe eine Klasse, die, die ganze Verbindung zu der MySQL Datenbank regelt. Eine weitere Klasse wäre zum Beispiel, die User Authentifizierung (kurz "UserAuth").
Da ich für die UserAuth-Klasse die DB-Connection benötige um die Abfragen zu machen, muss diese irgendwie in Verknüpfung mit der MySQL-Klasse kommen. Da ich aber nicht verschiedene MySQL-Objekte schaffen will (zu viele offene Verbindungen) vererbe ich die MySQL-Klasse nicht in die UserAuth, sondern übergebe der UserAuth-Klasse das Objekt der MySQL-Klasse. (siehe unten das gekürzte Beispiel)
Ist diese Methode korrektes OOP oder muss ich irgendwo mit Komplikationen rechnen bei dieser Art von "Objekt-Überlieferung"?

Hier das Beispiel:
PHP:
class MySQL {
  var $counter = 0;

  function Query($var) {
	$this->counter++;
    return md5($var); // Tue irgendwas und gib es retour
  }

  function OutputCount() {
    return $this->counter;
  }
}

class UserAuth {
  function UserAuth($mydb) {
    echo $mydb->Query("Salut");
  }
}

$mydb = new MySQL;
$Auth = new UserAuth($mydb);

echo "<br />" . $mydb->Query("Hallo");

echo "<br /><br />" . $mydb->OutputCount();
Herzlichen Dank für eure Hilfe!

Be blessed!
 
Das ist so in Ordnung! Du kannst aber auch die MySQL Klasse in der anderen Klasse GLOBAL setzen.

PHP:
  class MySQL { 
   var $counter = 0; 
  
   function Query($var) { 
 	$this->counter++; 
 	return md5($var); // Tue irgendwas und gib es retour 
   } 
  
   function OutputCount() { 
 	return $this->counter; 
   } 
 } 
  
 class UserAuth { 
   function UserAuth() { 
 	 global $mydb;
  	 echo $mydb->Query("Salut"); 
   } 
 } 
  
 $mydb = new MySQL; 
 $Auth = new UserAuth($mydb); 
  
 echo "<br />" . $mydb->Query("Hallo"); 
  
 echo "<br /><br />" . $mydb->OutputCount();

Ich persönlich setze meine Mysql-Klasse immer GLOBAL! Aber ich denke das muss jeder selber wissen!
 
Vielen Dank
habe es ausprobiert und funktioniert auch einwandfrei!
Falls sonst noch jemand Kritik üben möchte - nur zu bin für (fast) jeden Vorschlag offen!

Danke nochmals - be blessed!
 
time-master hat gesagt.:
Das ist so in Ordnung! Du kannst aber auch die MySQL Klasse in der anderen Klasse GLOBAL setzen.
Etwas global setzen widerspricht aber auf jeden Fall OOP.
Wenn man schon so arbeitet, dass ein Objekt genau einmal überall vefügbar ist, dann sollte man es als Singleton nach Gamma et. al. implementieren (Literatur: englisch oder deutsch, Kurze Erklärung auf Wikipedia und Singleton-Tutorial von ckj).

Beispiel Deiner DB-Klasse (nur PHP5, in PHP4 muss man sich selbst zwingen, private Attribute nicht von außen anzusprechen):
PHP:
<?php
class MySQL {
  private $counter = 0;

  private static $instance = null;

  public function query($var) {
    $this->counter++;
    return md5($var); // Tue irgendwas und gib es retour
  }

  public function getOutputCount() {
    return $this->counter;
  }

  public static function getInstance() {
    if ( self::$instance == null ) {
      self::$instance = new MySQL();
    }
    return self::$instance;
  }
}

class UserAuth {
  function UserAuth() {
    echo MySQL::getInstance()->query("Salut");
  }
}

$u=new UserAuth();
echo "<br>";
echo MySQL::getInstance()->getOutputCount();
echo "<br>";
echo MySQL::getInstance()->query("Noch ein Query an anderer Stelle");
echo "<br>";
echo MySQL::getInstance()->getOutputCount();
?>
Ich würde allerdings noch einen Konstruktor einbauen, der die Verbindung herstellt, oder hast Du hier verkürzten Code gepostet? Der Konstruktor ist bei einem Singleton private.

Mögliche Komplikationen bei Deiner Methode:
Aus objektorientierter Sicht ist die Vorgehensweise, eine Instanz der Klasse zu übergeben richtig. Sie verhindert jedoch nicht wirkungsvoll, dass Du in Deinem Skript mehr als ein Objekt der DB-Klasse initialisierst. Dafür gibt es das Design-Pattern Singleton. Du könntest zum Beispiel in irgendeinem Unterscript eine DB-Klasse benötigen und erzeugst sie dort, weil Du in einem von zwei Hauptskripten keine DB-Verbindung benötigst. In einem anderen Hauptskript initialisierst Du auch eine DB-Klasse, weil Du sie dort benötigst. Bindest Du das Unterskript in das zwite Hauptskript ein, hast du zwei Instanzen der DB-Klasse. Du müsstest also sehr genau den Überblick über Deinen Code behalten und Dir überlegen, wann Du wo DB-Zugriff haben willst. Ein Fehler und Dein Counter spuckt Blödsinn aus.

Gruß hpvw
 
Zurück