php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2006

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 28.03.2006, 17:41  
Erfahrener Benutzer
 
Registriert seit: 03.01.2006
Beiträge: 253
CC84
Standard OOP Denkfehler, wie lösen gegenseitiges Zugreifen

Also ich habe folgendes Denkproblem, bei dem ich mal wissen möchte, wie andere das sauber lösen.

Ich baue eine Seite aus mehreren Klassen bzw. deren Objekten auf. Da gibt es dann z.B. die Klasse MySQL. Theoretisch kann ich nun wenn ich z.B. gerade im Gästebuch bin, dort einfach ein Objekt der Klasse initiieren und drauf los arbeiten mit der DB. Da ich aber noch für mehr Sachen auf dieser Seite MySQL brauche und ich es für wenig Performance optimiert halte, dann 3 oder 4 mal je Seite ein Objekt aus dem Boden zu stampfen (Objekt muss 4 mal angelegt werden, 4 mal connecten 4 mal disconnecten.) erstelle ich ein Objekt und übergebe dieses als Parameter an die weiteren Klassen, wie eben z.B. das Gästebuch.

Soweit so gut. Nun habe ich eine Klasse die mir das Logging abnimmt. Diese kann ich sogar nur einmal aufrufen, da am Ende der Seite die gesammelten Einträge auf der Seite angezeigt werden. Auf diese Art und weise habe ich eine Zentrale Fehler/Hinweisausgabe. Bei schwerwiegenden Fehlern soll diese Klasse etwas in die DB schreiben. Wäre ja auch noch kein Problem, kann ja wie oben verfahren, zuerst das Object für MySQL erstellen und dann dem Logging dieses übergeben.
Damit scheidet aber eins aus: Ich kann Fehler die bei DB Anfragen kommen nicht mit überwachen. Da bei der Erstellung des Objekts für die DB die Logs noch nicht bestehen oder eben umgekehrt.

Ich sehe dafür nun 2 Lösungen, beide gefallen mir nicht. 1. Ich könnte Fehler die bei DB Abfragen auftreten separat händeln oder aber ich verschmelze DB und Logging Klasse.
1. versaut wieder eine zentrale aufbewahrung
2. verbindet, was nicht so recht zusammen gehört.

Seht ihr noch einen 3. Weg?

Um eins vorneweg zu nehmen: Die Klassen dienen in meinem Fall einfach nur der übersichtlicheren Programmierung und der Widerverwendbarkeit für verschiedene Projekte, nicht um die Klassen ersetzbar zu machen, durch andere (etwa MySQL durch Oracle oder sowas)

Hoffe mir kann jemand helfen.

Gruß

CC
CC84 ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 28.03.2006, 18:06  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

Ich würde mal nicht für jeden Zugriff zur Datenbank die Klasse aufzufen sondern ein einziges mal... das muss doch reichen mit einem Connect alles zu machen!

Und dann hast du auch nicht das Problem mit der Fehlerklasse wenn du insgesamt einmal MySQL und die Fehlerklasse initiierst dann haste die des ganze Skript über und kannst immer drauf zugreifen.
Flor1an ist offline  
Alt 28.03.2006, 18:16  
Erfahrener Benutzer
 
Registriert seit: 03.01.2006
Beiträge: 253
CC84
Standard

das ist mein Ziel, das Problem ist der Weg

Versuch mal, wenn du nacheinander 3 Objekte unterschiedlicher Klassen erstellt hast aus diesen jeweils auf die anderne zuzugreifen. Das klappt nur, wenn man die Zielklasse in der Funktion mit Global bekannt macht. Zudem musst du ja prüfen, ob das andere Objekt bereits existiert. Denn wenn die nacheinander erst erstellt werden, ist es nicht selbstverständlich, dass diese existieren.
CC84 ist offline  
Alt 28.03.2006, 19:30  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Hallo,

nein verschmelzen sollte das nicht. Vor allem hast du dein Problem damit
ja nicht gelöst.

Du musst eben eine Alternative zur Speicherung von Fehler ins DB haben
(zB Filesystem, EMail-Info, ..). Ich denke aber da kommst du nicht
drumrum.

Und das mit der Datenbank hast du schon ganz richtig gemacht, 1x
instanzieren reicht und das Objekt dann einfach dem Konstruktor
übergeben. Allerdings sind deine Klassen dann eben an genau diese
Datenbank-Klasse & seine Schnittstelle gebunden!

Beispiel:
PHP-Code:
<?php
$db 
= new DB();
$db->connect(MYSQL_HOSTMYSQL_USERMYSQL_PW);

$user = new User($db);
$news = new News($db);
$news->getPage(@$_GET['page']);
?>
Kann natürlich bei dir völlig anders aussehen - ist jetzt auch nur so
dahergetippt.
Zergling-new ist offline  
Alt 28.03.2006, 23:03  
Erfahrener Benutzer
 
Registriert seit: 03.01.2006
Beiträge: 253
CC84
Standard

Hm um ehrlich zu sein verstehe ich deine Antwort nicht so ganz. Du meinst also, ich soll einfach die Logs ganz von der DB trennen und lieber in ne Datei schreiben?
Wäre natürlich ne Maßnahme und würde bei einem SQL Total Ausfall noch Logs produzieren. Andererseits gehen natürlich auch alle Vorteile der DB damit verloren.

Streng genommen gibt es ja nur genau einen Fall wo es zu Problemen (Endlosschleife) kommt. Das ist der Fall ich würde zuerst das MySQL Object erstellen. Beim Init geben ich keine Fehler an die Logklasse, denn wenn der scheitert, ist das Script eh schon sinnfrei, daher breche ich dann ganz ab.

Direkt danach wird die ´Logklasse erstellt. Das ist alles kein Problem (vorrausgesetzt ich mache Mysql das Log Objekt per Global bekannt), bis beim schreiben einer Log in die DB ein Fehler auftaucht. Denn dann versucht die DB wieder an Log zu senden, der versucht wieder zu schreiben => Schleife.

Und mir fällt einfach nicht ein wie ich das wirklich sauber löse.

Die beiden zu mischen löst schon das Problem, da ich diesen gegenseitigen Aufruf dann los bin. Die Endlosschleife kann ich dann ja ebenfalls einfach abfangen.

Das einzige was mich eben stört ist die Global Definition.....

Wäre es denn mal streng genommen noch sauber, wenn ich alles erstmal in den Spreicher schreibe und am Ende der Datei ein Array aus der Log Klasse ziehe und dieses dann der MySQL Klasse zuschiebe. (Über extern, keine interne Funktion der Logs) Dort könnte ich im Zweifle ja sogar noch abfange, ob fatale SQL Errors existieren und in dem Fall das ganze doch in ne Datei mappen.

Meine SQL Klasse connectet halt im Constructor, ist denke die sauberere Methode Aber hast ja selber gesagt, das tut erstmal nix zur Sache.
CC84 ist offline  
Alt 28.03.2006, 23:23  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Ne Moment, ich meinte nicht, alles in eine Datei zu schreiben. Ich finde
zwar, dass Log-Daten ins Dateisystem gehören, auf einfachste Ebene
eben, aber wenn du das in die Datenbank schreiben willst ist das deine
Entscheidung.

Und eine Endlosschleife kannst du ja ganz einfach beenden, nämlich wenn
das $db-Objekt keine Verbindung aufbauen konnte

PHP-Code:
<?php
$db 
= new DB();
$log = new Log($db);
// gedanklicher Ausflug in die Log-Klasse:
class Log
{
  var 
$db;
  var 
$useDb;
  var 
$fp;

  function 
Log($db)
  {
    if (
is_object($db) && strtolower(get_class($db)) == 'db') {
      
$this->db $db;
      
$this->useDb $db->isConnected();
    } else {
      
$this->fp fopen('log.txt''a');
    }
  }

  function 
message($text)
  {
    if (
$this->useDb) {
      
$this->db->query('INSERT INTO..');
    } else {
      
fputs($this->fptime().'#'.$text);
    }
}
?>
Wenn das der Fall ist speicherst du das eben in einer Datei.
Zergling-new ist offline  
Alt 29.03.2006, 13:02  
Erfahrener Benutzer
 
Registriert seit: 03.01.2006
Beiträge: 253
CC84
Standard

bleibt das Problem, wie ich der DB Klasse die Logklasse bekannt mache.
CC84 ist offline  
Alt 29.03.2006, 13:26  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

So?

PHP-Code:
<?php
// DB Klasse
// ..
function query($sql)
{
    
$res = @mysql_query($sql);
    if (!
$res)
      
$this->_error();
    return 
$res;
}

function 
_error()
{
    
$this->log->message(mysql_error(), mysql_errno());
}
?>
Zergling-new ist offline  
Alt 29.03.2006, 17:41  
Erfahrener Benutzer
 
Registriert seit: 03.01.2006
Beiträge: 253
CC84
Standard

Zitat:
Zitat von Zergling
So?

PHP-Code:
<?php
// DB Klasse
// ..
function query($sql)
{
    
$res = @mysql_query($sql);
    if (!
$res)
      
$this->_error();
    return 
$res;
}

function 
_error()
{
    
$this->log->message(mysql_error(), mysql_errno());
}
?>
Nette Idee, nur woher soll DB wissen was Log ist??
PHP-Code:
$db = new DB();
$log = new Log($db); 
CC84 ist offline  
Alt 29.03.2006, 17:49  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

In dem du ihr es mitteilst?

Wenn beide eben voneinander abhängig sind - DB schreibt ihre Fehler ins Log
und Log schreibt seine Nachrichten/Zustände in die DB, musst du einen
Kompromiss eingehen bzw. Alternativen anbieten.

PHP-Code:
<?php
$db 
= new DB();
if (
$db->isConnected()) {
  
$log = new Log_DB($db);
} else {
  
$log = new Log_File('log.txt');
  
$log->message(mysql_error());
}
$db->setLog($log);
?>
Log_File() und Log_DB() könnten von einer gemeinsamen Log-Klasse erben.
Zergling-new ist offline  
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Inhalte von Array werden nicht ausgegeben ... Denkfehler? maeck PHP Tipps 2007 10 07.05.2007 16:04
Mit PHP auf Lotus Notes Datenbanken zugreifen buggybugga PHP Tipps 2007 2 02.05.2007 11:33
auf unterobjekte von div zugreifen JS/DOM Crypi HTML, Usability und Barrierefreiheit 4 05.04.2007 16:27
Via PHP auf eine andere festplatte zugreifen? skytrance PHP Tipps 2006 6 05.05.2006 16:23
Rechte für user vergeben - auf externe Datenbank zugreifen PHP Tipps 2005-2 8 07.10.2005 13:59
[Erledigt] Mit PHP auf ASP dot NET Webservice zugreifen PHP-Fortgeschrittene 3 08.01.2005 22:41
[Erledigt] Auf &lt;td&gt; zugreifen ??? HTML, Usability und Barrierefreiheit 3 07.11.2004 05:41

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php zentrale fehlerklasse

Alle Zeitangaben in WEZ +2. Es ist jetzt 11:26 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.