Hallo!
zwei Klassen wie kann ich von der Kind-Klasse auf die Vater-Klasse zugreifen. Ich erhalte bei meinen Versuchen diese Fehlermeldung:
Ich würde hier allerdings nicht mit Vererbung arbeiten. Du kannst zwar mit Vererbung arbeiten, ist vielleicht einfacher, aber wenn Du nur eine Db-Verbindung brauchst, würde ich ein Singleton-Pattern einsetzen wollen, da Du so eine globale DB-Variable vermeidest.
Erstmal zur Vererbung:
$db = new datenbank;
$db->dbhost = DB_HOST;
$db->dbuser = DB_USER;
$db->dbpass = DB_PASS;
$db->dbname = DB_NAME;$db->db_conn();
das würde ich schonmal nicht machen.
Man sollte nach Möglichkeit nicht auf Variablen in einer Klasse direkt von außen zugreifen, weil das eine Kapselung zunichte machen kann.
Eher sowas:
$db = new datenbank(DB_HOST,DB_USER,DB_PASS,DB_NAME);
dann brauchst Du in der DB-Klasse eine Konstruktor-Funktion mit dem Namen "datenbank", die die Parameter entsprechend weiterverarbeiten und damit z.B. $this->db_conn($host,$user,$pass,$name); aufruft. Dadurch wird deine interne Implementierung vollkommen unabhängig vom Rest der Applikation.
Jetzt hast Du in $db ein Objekt mit einer DB-Verbindung, was Du überall einsetzen kannst, leider eine globale Variable.
Wenn Du hier wirklich mit Vererbung arbeiten willst, musst Du nicht " new datenbank" verwenden, sondern direkt die erbende Klasse aufrufen. Aber das finde ich schlecht weil dann möglicherweise andauernd neue Verbindungen aufgebaut werden.
Zum Thema Singleton-Pattern:
Die Idee dahinter ist, dass Du eine Methode/Funktion hast, die selber genau eine(!) Instanz der DB-Klasse in einer statischen Variable hält.
class DB {
var $conn;
function DB() {
$this->connect();
}
function connect() {
// Verbindung herstellen
}
function query($sql) {
// SQL an DB senden
}
function & getConnection() {
// statische Variable die eine DB-Objekt Instanz hält
static $instance;
// Wenn noch kein Objekt existiert, erzeuge eins
if(!is_object($instance)) {
$instance = new DB;
}
return($instance);
}
}
Jetzt kannst Du überall in der Applikation ohne globale Variablen zu verwenden diese eine DB-Verbindung nutzen
Z.B. so
$db1 =& DB::getConnection();
$db1->query('SELECT...');
an einer anderen Stelle(in einer anderen Klasse...) z.B. so:
class User {
var $db;
var $uid;
var $name;
function User() {
$this->db =& DB::getConnection();
}
function getUser($id) {
$res = $this->db->query("SELECT name FORM users WHERE uid = '".$id."'");
$row = $res->fetch_row();
$this->uid = $id;
$this->name = $row['name'];
}
function storeChanges() {
$this->db->query("INSERT INTO users (name) VALUES ('".$this->name."')");
}
function setName($new) {
$this->name = $new;
}
function getName() {
return $this->name;
}
function delUser() {
$this->db->query("DELETE FORM users WHERE uid = '".$this->uid."'");
}
}
$user =& new User();
$user->getUser(123);// evtl kann man das auch direkt über den Konstruktor machen
echo $user->getName();
$user->setName('Hannes');
$user->storeChanges();
$user->delUser();
So in etwas würde ich das heute glaube ich machen. Nur mit dem Unterschied dass ich den SQL-Kram noch aus der User-Klasse eliminieren würde, und zwar in eine eigene DAO-Klasse, für jedes Objekt der "Business-Logik" .
Du kannst natürlich die getConnection() Funktion anpassen, dass man der auch DB-Zugangsdaten übergeben kann, Betonung auf _kann_, so kann man diese Funktion am Anfang einmal aufrufen mit den Zugangsdaten, und dann so verwenden wie von mir beschrieben. Oder Du fragst die Zugangsdaten aus der Klasse heraus ab, da weiß ich im Augenblick selber nicht so genau wie ich das machen würde.
Was meinst Du / was meint Ihr dazu?
Viele Grüße
Andreas