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)

feuervogel 22.06.2004 12:49:32

wobei dann natürlich immer auch wenn du die klasse in 10 jahren benutzt, die konstanten zur datenbankverbindung gesetzt sein müssen.

ich empfehle also, sie bei initialisierung der klasse zu übergeben.

sprich also die klasse user_del so zu schreiben:

PHP-Code:

class user_del extends datenbank
{
    var 
$gmt_zeit;
    var 
$user_old;
    var 
$board_old;
function 
user_del($host,$user,$pass,$name) {

$this->dbhost $host;
$this->dbuser $user;
$this->dbpass $pass;
$this->dbname $name;
$this->db_conn();
}
    function 
zu_alt()
    {
            
$b_query 'SELECT `id`, `last` FROM `' $brenam '_board`';
            
$b_weg   $this->db_query($b_query);

            
/* usw. */
    
}
}

$obj = new del_userDB_HOST DB_USER DB_PASS DB_NAME ); 
//usw...

//nun ist der klasse del_user egal woher die zugansgdaten kommen, sie ist nicht mehr an dei konstanten gebunden. das ganze natürlich in der klasse datenbank auch noch so machen, wenns recht ist. 


NanoCyte 22.06.2004 23:32:05

@feuervogel: thx für den tip, werds dann doch so rum machen, wie du vorgeschlagen hast.
bin auch erst bei klassen eingestiegen in das thema

René_M 23.06.2004 13:19:25

@feuervogel,

ist das eine vertrettbare Lösung, wenn man die Daten für die Eltern-Classe nicht durch alle Kind-Classen schleiffen will?

PHP-Code:

<?php

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

    function 
datenbank($db_host$db_user$db_pass$db_name$diff_ro)
    {
        
$this->dbhost $db_host;
        
$this->dbuser $db_user;
        
$this->dbpass $db_pass;
        
$this->dbname $db_name;
        
$this->diffro $diff_ro;
    }

    
/* usw */
}

/**/

$db = new datenbank(DB_HOSTDB_USERDB_PASSDB_NAME$diff_ro);

define('CONN_ID'$db->db_conn());

?>

PHP-Code:

<?php

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

    function 
user_del($zeit$del_user$del_board$conn_id)
    {
        
$this->gmt_zeit  $zeit;
        
$this->user_old  = (86400 $del_user);
        
$this->board_old = (86400 $del_board);
        
$this->conn      $conn_id;

        
$this->zu_alt();
    }

    
/* usw. */
}

/**/

$udel = new user_del($zeit$del_user$del_boardCONN_ID);

?>


feuervogel 23.06.2004 14:47:52

ja, so könnte man es machen. aber da ich immer noch was finde: das aufrufen von klassen kostet zeit. sehr viel zeit. daher würde ich nur eine klasse einmal aufrufen wollen:)

zum thema zeit:

http://www.webmasterstop.com/tutoria...-PHP-OOP.shtml

wisst ihr, mir ist das im prinzip egal, wie ihr die klassen gestaltet, aber die erfahrung zeigt, dass ne klasse im prinzip wie so ne mühle ist: es kommt was rein und verändert wieder raus. dabei kann man grob mahlen, man kann fein mahlen, und man kann getreide, aber auch kaffee mahlen.

woher der kaffee kommt, ist der mühle doch egal, oder? ob aus ner dose oder ner tüte.

so solltet ihr auch klassen betrachten. eine klasse ist auf keinen fall an globale variablen gebunden oder an irgendwas außerhalb von ihr. also alles was in der klasse von außen kommt, wird übergeben.

feuervogel 23.06.2004 14:51:44

p.s.: was du machst: du nimmst deine klasse db und verbindest das script mit der db. diese verindungskennung übergibst du nun der tochter klasse.

warum übergibst du nicht die instanz der db klasse und verbindest in der tochter klasse? du kannst sie ja ein mal in den konstruktor schreiben, schon "schleifst" du sie nicht mehr mit.

René_M 23.06.2004 15:16:49

Zitat:

Original geschrieben von feuervogel
übergibst du nicht die instanz der db klasse und verbindest in der tochter klasse? du kannst sie ja ein mal in den konstruktor schreiben, schon "schleifst" du sie nicht mehr mit.
Wie würde das an dem letzten Beispiel-Code aussehen?
Wie ist es wenn z.B. noch eine dritte o. vierte Classe existiert?

feuervogel 23.06.2004 23:58:00

auch wenn ich stark nen zacken in der krone habe (scheiß fußball:)

PHP-Code:

<?php
class datenbank
{
    var 
$dbhost;
    var 
$dbuser;
    var 
$dbpass;
    var 
$dbname;
    var 
$diffro;
    var 
$conn;
    function 
datenbank($db_host$db_user$db_pass$db_name$diff_ro)
    {
        
$this->dbhost $db_host;
        
$this->dbuser $db_user;
        
$this->dbpass $db_pass;
        
$this->dbname $db_name;
        
$this->connecttodb$dbhost $dbuser $dbpass );
        
$this->selectdb$dbname );
    }
    
/* usw */
}

class 
user_del
{
    var 
$gmt_zeit;
    var 
$user_old;
    var 
$board_old;
    var 
$conn;
    function 
user_del($zeit$del_user$del_board$dbobj)
    {
        
$this->gmt_zeit  $zeit;
        
$this->user_old  = (86400 $del_user);
        
$this->board_old = (86400 $del_board);
        
$this->conn      $conn_id;
        
$this->zu_alt();
        
$dbobj->query"SELECT * FROM table" );
    }
    
/* usw. */
}
$db = new datenbank(DB_HOSTDB_USERDB_PASSDB_NAME$diff_ro);

$udel = new user_del($zeit$del_user$del_board$db);
?>

bei drei oder vier klassen? ich frag mich als schon warum das löschen des benutzers eine eigene klasse ist? könnte man da nicht viel zusammenfassen?

bei 3 oder 4 klassen werden die jeweiligen instanzen halt übergeben.

ich schreibe mal die tage eine parser klasse...dort kann gewählt werden zwischen bbcode-, spiegel.de- und LaTeX-parsing...

René_M 24.06.2004 15:17:13

Hi feuervogel,

so richtig zufrieden bin ich damit auch nicht. Wenn ich das so mache dann brauche ich ja das "... extends datenbank" nicht mehr. Da ja die ganze Classe in dem "$db" steckt.

Habe noch was rausgefunden die ganzen var ... aus der "datenbank" (Eltern-Classe) stehen in den Kind-Classen überhaupt nicht zur Verfügung.

Gibt es denn nicht irgend eine Möglichkeit das das $this->conn (Verbindungs-Kennung) zur Verfügung steht wenn man this->query(...) aus einer Kind-Classe aufruft.

---------

Wegen dem zusammenlegen ich brauche die "user_del" nur in einer spezielen Seite die "datenbank" in allen.

---------

Hatte mir gestern noch die eine Seite mit dem Diagramm angesehen. Konnte zwar nichts lesen (Kann kein englisch) aber wenn ich das Diagramm richtig deute ist es doch ein Fehler überhaupt Classen zu verwenden. Dann wenns sein muss nur eine Funktion?

Aber wo man hinschaut werden Classen geschreiben und verwendet?

--------

Wenn du willst kann ich dir ja auch mal die Classen komplett per E-Mail zusenden.

meikel (†) 25.06.2004 15:01:32

Zitat:

Original geschrieben von René_M
Wenn ich das so mache dann brauche ich ja das "... extends datenbank" nicht mehr. Da ja die ganze Classe in dem "$db" steckt.
Du mußt im Konstruktor der Kindklasse den Konstruktor der Elterklasse aufrufen.
PHP-Code:

class vater
{
  var 
$test 'huhu';
  function 
vater ()
  {

  }
}

class 
sohn extends vater
{
  function 
sohn ()
  {
    
vater::vater();
    echo 
$this->test;
  }
}

$instanz = & new sohn


René_M 25.06.2004 19:14:13

Hi meikel,

mit der Funkt. "function conn_stand()" hatte ich das gelösst damit "$this->conn" in der Funkt. "db_query" da ist, wenn ich diese Funkt. aus der Kindklasse heraus aufrufe. Ohne gab es immer einen "Query-Fehler Nr. 0".

PHP-Code:

<?php

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

    function 
datenbank($db_host$db_user$db_pass$db_name$diff_ro)
    {
        
$this->dbhost $db_host;
        
$this->dbuser $db_user;
        
$this->dbpass $db_pass;
        
$this->dbname $db_name;
        
$this->diffro $diff_ro;

        
$this->db_conn();
    }

    function 
conn_stand()
    {
        static 
$verb;

        if(!empty(
$this->conn))
            
$verb $this->conn;

        return 
$verb;
    }

    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');

        
$this->conn_stand();
    }

    function 
db_query($query)
    {
        
$this->result = @mysql_query($query$this->conn_stand());

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

        return 
$this->result;
    }

    
/* usw. */
}

/**/

$db =& new datenbank(DB_HOSTDB_USERDB_PASSDB_NAME$diff_ro);

?>

PHP-Code:

<?php

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

    function 
user_del($zeit$del_user$del_board)
    {
        
$this->gmt_zeit  $zeit;
        
$this->user_old  = (86400 $del_user);
        
$this->board_old = (86400 $del_board);

        
$this->zu_alt();
    }

    function 
zu_alt()
    {
        
$bbrett = array( ... );

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

            
/* usw. */
        
}
    }
}

/**/

$udel =& new user_del($zeit$del_user$del_board);

?>

--------

Nachtrag:

Was auch wichtig ist, die Kindklasse(n) sind nicht in allen Seiten enthalten nur die Elternklasse "db_class.php" ist in allen Seiten per require eingebunden.

Wenn ich das so mache wie in deinem Beispiel, muss ich ja die Verbindungsdaten (Username, PW, ...) auch über jede Kindklasse mitgeben.

Was den Fehler verursaht ist ja nur das fehlende "$this->conn" wenn die Funktionen in denen "$this->conn" verlangt wird, aus der / den Kindklassen heraus aufgerufen wird.

Vorschläge, Verbesserungen nehme ich dankend an.


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:43:57 Uhr.

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