PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit überladener Klasse und Objekten



lolli
19-10-2003, 13:45
Hallo.
ich möchte gern in der Klasse Session ein Datenbank-Object $_dbh verwenden. Das Initialisieren der Klasse funktioniert auch noch problemlos, nur leider kann ich mit dem Objekt nicht "normal" arbeiten, da PHP beim overloading scheinbar zwingend die Verwendung der __call-Funktion erfordert.
Ich habe folgendes Beispiel zusammengestellt, um mein Problem zu demonstrieren:


error_reporting(15);
class database {
function Database(){
mysql_pconnect('localhost','root');
mysql_select_db('test');
}
function Query($sql) {
return mysql_query($sql);
}
}
class Session{
var $_data;
var $_dbh;
function Session(){
$this->_dbh=new Database;
// führt zu einem Fehler
$rc=$this->_dbh->Query("select * from all");
}
function __get($key,&$var){
$value=$this->data[$key];
return true;
}
function __set($key,$val){
$this->data[$key]=$value;
return true;
}
//function __call($function,$param){
//
//}
}
overload('Session');
$Session=new Session;

Wie bekomme ich es nun hin, dass ich mit dem Database-Object $this->_dbh "normal"
arbeiten kann, ohne einen hässlichen Umweg über __call($function,$param)
machen zu müssen?

Oliver

Gaert
19-10-2003, 18:43
Hallo!

Soweit ich informiert bin verhält sich das Overloading generell etwas seltsam, wenn es um eingebettete Objekte geht. Ist ja aber auch noch experimental.
Ich bin ehrlich gesagt auch noch nicht dahintergekommen für was man es bei PHP überhaupt benötigen sollte - vielleicht kannst du mir das ja mal erläutern.

Ach ja... für alle die, die nicht wissen worum es eigentlich geht:
http://de3.php.net/overload
http://www.phppatterns.com/index.php/article/articleview/28/1/2/

comrad
20-10-2003, 12:17
Original geschrieben von lolli

class Session{
var $_data;
var $_dbh;
function Session(){
$this->_dbh=new Database;
// führt zu einem Fehler
$rc=$this->_dbh->Query("select * from all");
}


fehlt beim "new Database" nicht die Funktionsklammer?

also new Database()

comrad

lolli
20-10-2003, 15:02
Jein. Es klappt auch ohne.
Eine nicht saubere Lösung wäre es, in den entsprechenden Funktionen mit einer Zwischenvariable zu arbeiten:

// $rc=$this->_dbh->Query("select * from all");
$tmp=$this->_dbh;
$rc=$tmp->Query("...");

Aber das ist nicht wirklich mien Ziel....