PHP Forum

PHP Forum (http://www.selfphp.de/forum/index.php)
-   PHP für Fortgeschrittene und Experten (http://www.selfphp.de/forum/forumdisplay.php?f=13)
-   -   Andere Klasse aus Klasse aufrufen (http://www.selfphp.de/forum/showthread.php?t=7995)

NanoCyte 20.06.2004 23:36:56

Andere Klasse aus Klasse aufrufen
 
ich hab eine Klasse für Datenbank und will jetzt diese Klasse aus einer anderen klasse heraus ansprechen.

Ich würde das gerne ohne global in jeder function machen und auch ohne extends. gibt es da noch andere möglichkeiten, die klasse anzusprechen, wenn ich in ner anderen klasse bin, weil einfach $db->query(" ... "); funktioniert nicht

feuervogel 21.06.2004 01:09:29

ja, man kann klassen vererben.

PHP-Code:

<?PHP
class mutter {
    function 
muttermeckert() {
        echo 
"du bist böse";
    }

    function 
muttergibtgeld() {
        echo 
"kauf dir was";
    }
}

class 
tochter EXTENDS mutter {
    function 
verhaltenvontochter$ver ) {
        if ( 
$ver == "frech" ) {
            
$this->muttermeckert();
        } elseif ( 
$ver == "brav" ) {
            
$this->muttergibtgeld();
        }
    }
}

$obj = new tochter();
$obj->verhaltenvontochter"brav" );
?>

ist getestet:

http://www.julianmoritz.de/selfphp/class.php

siehe auch da:

http://www.dclp-faq.de/q/q-klassen-vererbung.html

feuervogel 21.06.2004 01:11:53

achso OHNE extends *ggg*

ja, gibt es auch...du kannst die instanz der klasse einfach mitübergeben.

PHP-Code:

class neueklasse {
function 
neueklasse$instanzderaltenklasse ) {
$this->instanzderaltenklasse $instanzderaltenklasse;
}
}

$obj1 = new alteklasse();
$obj2 = new neueklasse$obj1 ); 


NanoCyte 21.06.2004 15:08:57

ja, das alles weiß ich dass es geht. wäre es aber möglich, einfach mit $db->query("...") was aufzurufen, wenn ja, muss ich dafür irgendwas mit global oder so bestimmen?
ging mir nur darum, dass ich quasi "einfach mal so" aus der klasse heraus die db-klasse aufrufen kann....
wenn das so net geht, muss ich mir wohl für jede klasse ne instanz-func schreiben

edit:

okay, habs raus, wie es geht, mit kleinem umweg
PHP-Code:

class ship
        
{
        
// Andere Klasse aufrufen
        
function ship()
                {
                global 
$cdb;
                
$this->cdb $cdb;
                }
        } 

(is fast so wie das von feuervogel, thx für die idee!)

feuervogel 21.06.2004 19:11:59

das ist aber kein sauberer programmierstil und die wiederverwendbarkeit der klasse sinkt enorm.

Fuchs 21.06.2004 20:13:12

Mach dich mal ueber 'Singleton' schlau. Such einfach mal im Forum od. google.

René_M 22.06.2004 11:12:33

Hi @all,

ich habe ebenfalls eine Frage / Problem.

Die Fehlermeldung bekomme ich durch den Aufruf der Funktion "$b_weg = $this->db_query($b_query);" aus der Classe "class user_del" heraus. Rausgefunden habe ich das es am fehlenden "$this->conn" liegt. Wenn ich aus dem Normalen PHP-Code auf die Funktion zugreife "$result = $db->db_query($query);" funktioniert es aber nicht von der Kind-Classe in die Eltern-Classe. Weis jemand wie ich den Fehler beheben kann?

Zitat:

Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource in E: ... db_class.php on line 67
PHP-Code:

<?php

class datenbank
{
    var 
$dbhost;
    var 
$dbuser;
    var 
$dbpass;
    var 
$dbname;
    var 
$conn;

    function 
db_conn()
    {
        
$this->conn = @mysql_connect($this->dbhost$this->dbuser$this->dbpass);

        if(!
$this->conn)
            
$this->db_error('Connect');

        
$this->sele = @mysql_select_db($this->dbname$this->conn);

        if(!
$this->sele)
            
$this->db_error('Database');

        return 
$this->conn;
    }

    function 
db_query($query)
    {
        
$this->result = @mysql_query($query$this->conn); /* line 67 */

        
if(!$this->result)
            
$this->db_error('Query');

        return 
$this->result;
    }

/* usw. */

}

$db = new datenbank;

$db->dbhost DB_HOST;
$db->dbuser DB_USER;
$db->dbpass DB_PASS;
$db->dbname DB_NAME;

$db->db_conn();

/*************************************/

class user_del extends datenbank
{
    var 
$gmt_zeit;
    var 
$user_old;
    var 
$board_old;

    function 
zu_alt()
    {
            
$b_query 'SELECT `id`, `last` FROM `' $brenam '_board`';
            
$b_weg   $this->db_query($b_query);

            
/* usw. */
    
}
}

$udel = new user_del;

$udel->gmt_zeit  $zeit;
$udel->user_old  = (86400 $del_user);
$udel->board_old = (86400 $del_board);

$udel->zu_alt();

?>


feuervogel 22.06.2004 11:49:02

also, wenn du die klasse aus dem php-code aufrufst, machst du das sicher so:

$obj1 = new datenbank();
$obj1->db_connect( $diezugangsdaten );
$res = $obj1->db_query($query);

klaro, es gibt keinen fehler.

wenn du nun aber innerhalb der klasse user_del einfach nur $this->db_query( $query ); machst gibts nen fehler, klaro, weil du ja eben noch nicht zur db verbunden bist. genau das steht auch in der fehlermeldung. schreib dir für user_del mal nen konstruktor in dem zur db verbunden wird, dann dürfte das kein problem mehr sein.

René_M 22.06.2004 12:04:08

$db->db_conn();

Hier wird doch die Funktion zum Verbindungsaufbau aufgerufen und das noch vor dem Aufruf der Funktion in der Kind-Classe ?

OOP ist noch Neuland für mich, kleine Code-Beispiele wären fürs verstehen besser. ;-)

feuervogel 22.06.2004 12:41:49

aaaalso...

um ne sql-abfrage zu machen brauchst du die verbindung zur db. das hat erst mal nix mit oop zu tun.

wenn du nun in den child-class auch ne sql-abfrage machen willst, musst du vorher eben eine verbindung zur datenbank starten.

PHP-Code:

class user_del extends datenbank

{

    var 
$gmt_zeit;

    var 
$user_old;

    var 
$board_old;

function 
user_del() {

$this->dbhost DB_HOST;

$this->dbuser DB_USER;

$this->dbpass DB_PASS;

$this->dbname DB_NAME;



$this->db_conn();

}

    function 
zu_alt()

    {

            
$b_query 'SELECT `id`, `last` FROM `' $brenam '_board`';

            
$b_weg   $this->db_query($b_query);



            
/* usw. */

    
}





Alle Zeitangaben in WEZ +2. Es ist jetzt 09:43:16 Uhr.

Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.