php.de

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

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 20.07.2009, 13:49  
Benutzer
 
Registriert seit: 25.05.2008
Beiträge: 50
binäri
Standard Ansatz für Einbinden einer Funktion in mehrere Klassen

Hallo
Ich habe verschiedene Klassen und ein Großteil davon kann auch Fehlermeldungen zurückgeben, wenn mal etwas schief läuft. Außerdem habe ich eine einzelne Funktion (bis jetzt in noch keiner Klasse untergebracht), die Fehlermeldungen in log-Dateien schreibt.

Jetzt suche ich eine möglicht effektive Mögichkeit, allen Klassen diese Funktion zur Verfügung zu stellen. Welche Ansätze gäbe es da?
binäri ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 20.07.2009, 14:33  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.166
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard

Stichwort: lose Kopplung

Benötigst du in einer Klasse einen Logger, machst du ein Attribut diesen Typs innerhalb eben jener Klasse und definierst einen setter mit dem du den Logger setzen kannst. Die einzelne Funktion würde ich, je nach Bedarf, als statische Klassenmethode definieren. Dann kannste die auch überall verwenden.

PHP-Code:
class MyClass {
    protected 
$logger;
    
    ...
    public function 
setLogger(Logger $logger) {
        
$this->logger $logger;
    }
    
    ...

Du könntest statt dessen aber auch den Logger immer via new oder factory-Methode im Konstruktor erzeugen.
dennis81 ist offline  
Alt 20.07.2009, 14:55  
Benutzer
 
Registriert seit: 25.05.2008
Beiträge: 50
binäri
Standard

PHP-Code:
public function setLogger(Logger $logger
Diese Zeile setzt doch voraus, dass ich für den Logger eine eigene Klasse schreibe. Wäre das nicht etwas zu umständlich für eine einzelne Methode?
Mir persönlich schwebt als Lösung ja eher soetwas wie 'include' vor. Allerdings kann ich eine, ich nenne sie mal fremde, Funktion nicht auf ein Objekt anwenden.
binäri ist offline  
Alt 20.07.2009, 15:00  
Erfahrener Benutzer
 
Registriert seit: 17.02.2009
Beiträge: 120
PHP-Kenntnisse:
Fortgeschritten
donald123 befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Diese Zeile setzt doch voraus, dass ich für den Logger eine eigene Klasse schreibe
nicht nur in eine klasse, sondern durch den typhint "Logger" auch in ein interface, was ich persönlich auch für eine saubere implementierung halte.
donald123 ist offline  
Alt 20.07.2009, 15:24  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.166
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard

Ebendrum. Du könntest das o.g. Beispiel sogar noch ausweiten. Nehmen wir mal an, du möchtest deine Meldungen nicht nur in einer Datei loggen, sondern u.U. in einer Datenbank oder in extrem Fällen Nachrichten per E-Mail verschicken. Dazu passt du das Beispiel ein wenig an.
PHP-Code:
interface Logger {
    public function 
log(/*hier gewünschte Parameter einfügen*/);
}

class 
FileLogger implements Logger {
    public function 
log(/*hier gewünschte Parameter einfügen*/) {
        
/*Gewünschte Funktionalität implementieren*/
    
}
}

class 
DatabaseLogger implements Logger {
    public function 
log(/*hier gewünschte Parameter einfügen*/) {
        
/*Gewünschte Funktionalität implementieren*/
    
}
}

class 
MailLogger implements Logger {
    public function 
log(/*hier gewünschte Parameter einfügen*/) {
        
/*Gewünschte Funktionalität implementieren*/
    
}
}

class 
MyClass {
    protected 
$logger = array();
    
    public function 
addLogger(Logger $logger) {
        
$this->logger[] = $logger;
    }
    
    protected function 
logEvent() {
        foreach ( 
$this->logger as $logger ) {
            
$logger->log(/*whatever*/);
        }
    }

Möglicher Weise gibt es dazu noch ein paar nützliche Design Patterns, aber das dürfte dir erstmal weiter helfen.
dennis81 ist offline  
Alt 20.07.2009, 15:29  
Benutzer
 
Registriert seit: 25.05.2008
Beiträge: 50
binäri
Standard

Jup, das hilft mir erstmal weiter
binäri ist offline  
Alt 20.07.2009, 15:29  
Erfahrener Benutzer
 
Registriert seit: 13.05.2009
Beiträge: 1.166
PHP-Kenntnisse:
Fortgeschritten
dennis81 befindet sich auf einem aufstrebenden Ast
Standard

Ok, und hier das Pattern, das ich meinte: Kompositum (Entwurfsmuster) – Wikipedia
dennis81 ist offline  
Alt 20.07.2009, 20:01  
Benutzer
 
Benutzerbild von isam2k
 
Registriert seit: 03.10.2008
Beiträge: 55
PHP-Kenntnisse:
Anfänger
isam2k befindet sich auf einem aufstrebenden Ast
Standard

Ansonsten hilft das hier:

Vererbung von Klassen
Programmierung - PHP und OOP - Vererbung von Klassen
__________________
Ich kann allem widerstehen - ausser der Versuchung
Oscar Wilde
isam2k ist offline  
Alt 20.07.2009, 20:59  
yab
Erfahrener Benutzer
 
Registriert seit: 05.04.2009
Beiträge: 291
PHP-Kenntnisse:
Anfänger
yab befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von binäri Beitrag anzeigen
Jetzt suche ich eine möglicht effektive Mögichkeit, allen Klassen diese Funktion zur Verfügung zu stellen.
Da eine Funktion automatisch im globalen Scope zur Verfügung steht, kannst du sie auch von überall (Klasse, Funktion, Methode) aus aufrufen.
yab ist offline  
Alt 20.07.2009, 21:31  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.268
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ein Interface sollte das Mittel deiner Wahl sein, wie es dennis bereits geschrieben hat. Somit kannst du einen beliebigen Logger uebergeben. Eine Funktion wuerde ich nicht verwenden, selbst eine Klasse mit nur einer Methode ist doch akzeptabel.

Falls dir das nicht liegt, kannst du auch einen Callback uebergeben:
PHP-Code:
<?php
class MyClass {
  protected 
$_loggerCallback;
  public function 
setLoggerCallback($callback) {
    if (!
is_callable($callback)) {
      throw new 
InvalidArgumentException();
    }
    
$this->_loggerCallback $callback;
  }
  public function 
doSomething() {
    
call_user_func($this->_loggerCallback"Nachrichtentext");
  }
}

// ..

function logger($message) {
  
error_log($message);
}

class 
MyLogger {
  public static 
logger($message) {
    
file_put_contents("log.txt"$messageFILE_APPEND);
  }
}

$obj = new MyClass();
$obj->setLogger("logger");
$obj->doSomething();
$obj->setLogger(array("MyLogger""logger"));
$obj->doSomething();
?>
Abgesehen davon musst du natuerlich pruefen, ob auch wirklich ein Logger an die entsprechende Klasse uebergeben wurde.

Die Interface-Variante ist trotz allem sauberer
__________________
"Nuschel ich?" - "Was?"
Chriz 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
[Erledigt] js funktion funktioniert nach änderungen am php teil nicht mehr xstefxanx JavaScript, Ajax und mehr 7 13.04.2009 16:09
JS: Einführung - Javascript im Schichtenmodell nikosch Tutorials 4 11.04.2009 17:06
auruf klassen Methode ombolo30 PHP Tipps 2009 11 09.04.2009 15:54
funktion für html escape etc. TeazY PHP Tipps 2009 19 12.02.2009 13:19
[Erledigt] Array innerhalb einer Funktion Marko_Schulze PHP Tipps 2008 8 02.12.2008 18:58
[Erledigt] Wohin mit einer Funktion, die ich in verschiedenen Klassen benötige LichtAnd PHP Tipps 2008 5 06.10.2008 12:03
Wert einer Funktion an andere Funktion übergeben Secondary PHP Tipps 2008 14 27.08.2008 10:36
Rekursive Funktion bricht ab... duras666 PHP Tipps 2008 9 28.04.2008 11:36
Klassen und externe Funktionen ? ssm PHP-Fortgeschrittene 17 18.07.2007 11:59
PHP-GTK Tutorial Beitragsarchiv 9 02.11.2005 21:07
Rückgabewert einer rekrusiven Funktion PHP-Fortgeschrittene 7 06.10.2005 18:44
Klassen und OOP Problem PHP-Fortgeschrittene 3 08.09.2005 10:37
(schnellere) Funktion zum Zusammenfassen von CSS PHP-Fortgeschrittene 21 08.08.2005 16:47
[Erledigt] Wie kann ich beliebig viele Werte an eine Funktion übergeben PHP Tipps 2005 11 25.01.2005 10:44

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php mehrere klassen einbinden, php klassen funktionen einbinden, php funktion einbinden, php funktionen einbinden, php oop mehrere klassen, html mehrere klassen einbinden, php fremde klasse einbinden, php class in class einbinden, php eigene class einbinden, php externe functionen klassen einbinden, mehrere klassen einbinden, funktion in mehreren klassen einbinden php, php class function callback, funktionen einbinden php, php klasse einbinden, mehrere klassen php, php mehrere klassen, mehrere class einbinden, oop mehrere klassen php, php alle klassn im voraus einbinden

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:22 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