SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

TYPO3 Kochbuch

TYPO3 Kochbuch zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Entwicklung und Softwaredesign

PHP Entwicklung und Softwaredesign Hier können strukturelle (Programmier-) Konzepte diskutiert und Projekte vorgestellt werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 08.01.2011, 17:30:57
elkmod elkmod ist offline
Anfänger
 
Registriert seit: Mar 2009
Alter: 23
Beiträge: 45
elkmod befindet sich auf einem aufstrebenden Ast
OOP Zugriff auf Objekte fremder Klassen

Hallo zusammen.

Ich bin gerade dabei ein Framework zu schreiben, jedoch habe ich ein kleines Problem bei der objektorientierten Umsetzung des Ganzen.

Ich versuche mal kurz das Problem zu umreißen:
Es gibt eine Klasse BaseObject, von der alle anderen Klassen bis auf die Logs abgeleitet werden. Das BaseObject verfügt über einen Konstruktor, in dem die Log-Datei geöffnet wird, natürlich alles objektorientiert
PHP-Code:
$this->error_log = new Log("logs/error.log"); 
Das Ganze soll dazu dienen, dass später aus jedem anderen Objekt durch den Aufruf von
PHP-Code:
$this->error_log->add(Fehlermeldung); 
auf das Log-Objekt zugegriffen werden kann. Dazu ist es nützlich ein Zentrales Log-Objekt zu erzeugen, statt bei jeder Instanziierung ein neues. Beim recherchieren bin ich dabei auf die Singleton-Variante gestoßen, bei der das Objekt, soweit ich verstanden habe, nur einmal erzeugt wird und dann immer über obj->getInstance() darauf zugegriffen wird.

Die Klassen sind wie folgt aufgebaut:

Code:
BaseObject
  Config
  Controller
  Page

Log
  ErrorLog
  UserLog

Client
Wenn nun im Konstruktor von BaseObject ein Objekt der Klasse ErrorLog instanziiert wird, wie kann ich dann in Unterklassen von BaseObject auf das gleiche Objekt zugreifen ohne ein Neues erzeugen zu müssen?

Hier noch der Konstruktor von BaseObject
PHP-Code:
public function __construct()
{

  
$this->client = new Client();
  
$this->error_log LogFile::getInstance("logs/error.log");


Der Parameter bei getInstance ist da, weil das Objekt ja mindestens einmal erzeugt werden muss. Meine Frage ist jetzt, wie genau diese Funktion getInstance($path) aussehen muss, damit erst geprüft wird, ob bereits ein Objekt der Klasse existiert und dieses ggf. zurückgegeben oder erzeugt wird.
__________________
MfG Dominic

Geändert von elkmod (08.01.2011 um 17:36:13 Uhr) Grund: Rechtschreibfehler
Mit Zitat antworten
  #2  
Alt 08.01.2011, 18:06:11
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Beiträge: 2.269
DokuLeseHemmung befindet sich auf einem aufstrebenden Ast
AW: OOP Zugriff auf Objekte fremden Klassen

Singletons sind böse!
Ein stumpfer Ersatz für globale Variablen.
Selten sinnvoll.
Was ist, wenn es mehrere (verschiedene) Logger geben soll?
Was ist, wenn du mal eine Ableitung/Kind eines Loggers verwenden willst?

Ob etwas Singleton sein darf/soll/muß, ist eine Anforderung der Applikation. Darum darf sowas in einem Framework nicht auftauchen.
Selbst die Helden des ZF haben das mittlerweile geschnallt und eliminieren jetzt alle Singletons in ihrem Framework.
Bitte tappe nicht in die gleiche Falle.




Logger über den Constructor übergeben ist auch böse!
Denn nicht immer brauchen alle Objekte einen Logger.
Das Fachwort dafür ist übrigens "Constructor Injection"
Besser wäre also die "Setter Injection".

Im Falle deiner Controller wäre es sicherlich Sinnvoll diese per "Factory" zu erzeugen.
Mache dich generell über das "Dependency Injection Pattern" kundig.
Denn witziger weise, bist du nicht die/der erste mit diesem Problem!
Mit Zitat antworten
  #3  
Alt 16.01.2011, 16:31:13
elkmod elkmod ist offline
Anfänger
 
Registriert seit: Mar 2009
Alter: 23
Beiträge: 45
elkmod befindet sich auf einem aufstrebenden Ast
AW: OOP Zugriff auf Objekte fremden Klassen

Soweit ich das jetzt verstanden habe, sollen die Objekte von eienr Factory-Klasse erzeugt werden und jede Klasse, welche beispielsweise einen Logger braucht enthält dann einen "setLogger" - Dienst. Wie sieht das mit der Vererbung aus bei Klassen die einen Logger brauchen und bei welchen die keinen benötigen?
__________________
MfG Dominic
Mit Zitat antworten
  #4  
Alt 16.01.2011, 21:44:06
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Beiträge: 2.269
DokuLeseHemmung befindet sich auf einem aufstrebenden Ast
AW: OOP Zugriff auf Objekte fremden Klassen

Bevor ich was zur Vererbung oder Fabriken sage (was soll man dazu denn auch sagen), erstmal dieses:
1. bei notwendigen Dingen: Konstruktor injection
2. bei optionalen Dingen: Setter injection


Im folgenden Code benötigt der Logger ZWINGEND einen Dateinamen.
Also: Konstruktor injection

Aber der Rechner kann einen Logger bedienen, muss aber nicht, kommt auch ohne aus.
Also: Setter injection

So und nun endlich ein Beispiel:
PHP-Code:
<?php
error_reporting
(-1);
ini_set('display_errors'TRUE);



interface 
Logger
{
  function 
log($string);


interface 
Logable
{
  function 
setLogger(Logger $logger);


class 
FileLogger implements Logger
{
    protected 
$filename '';
  
    public function 
__construct($filename)
    {
      
$this->filename=$filename;
    }
    public function 
log($string)
    {
      
file_put_contents($this->filename,$string."\n",FILE_APPEND);
    }
}


class 
Rechner implements Logable
{
   protected 
$logger null;
   public function 
setLogger(Logger $logger)
   {
      
$this->logger $logger;
   }
   
   public function 
plus($a,$b)
   {
      
$c $a $b;
      if(
$this->logger)
      {
        
$this->logger->log("$c = $a + $b");
      }
      return 
$c;
   }
}


// testcode
$r = new Rechner;
$l = new FileLogger('./log.txt'); // Konstruktor injection

if($r instanceof Logable)
{
  
$r->setLogger($l); // Setter injection
}

echo 
$r->plus(1,2), '<br>';
echo 
$r->plus(1,3), '<br>';
echo 
$r->plus(1,4), '<br>';
echo 
$r->plus(1,5), '<br>';
Mit Zitat antworten
  #5  
Alt 17.01.2011, 01:07:31
elkmod elkmod ist offline
Anfänger
 
Registriert seit: Mar 2009
Alter: 23
Beiträge: 45
elkmod befindet sich auf einem aufstrebenden Ast
AW: OOP Zugriff auf Objekte fremden Klassen

Okay, dank deiner Hilfe steige ich langsam da durch. Per Factory lass ich alle Logger usw. anfangs erzeugen und gebe sie dann gegebenenfalls den anderen Objekten per Setter Injection mit, falls diese sie benötigen.

Wenn ich mehrere Klassen habe deren Objekte, einen Logger benötigen, macht es dann Sinn eine Oberklasse, zu schreiben, welche die Methoden setLogger, setDB usw. enthält oder soll ich die Methode je nach Bedarf immer einzeln in die Klasse schreiben, was mir aber weniger sinnvoll erscheint, denn wie sieht es aus, wenn es mehrere Logger geben soll für welchen Zweck auch immer, kann man die Methoden irgendwie verallgemeinern?
__________________
MfG Dominic
Mit Zitat antworten
  #6  
Alt 17.01.2011, 01:24:23
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Beiträge: 2.269
DokuLeseHemmung befindet sich auf einem aufstrebenden Ast
AW: OOP Zugriff auf Objekte fremden Klassen

Zitat:
macht es dann Sinn eine Oberklasse, zu schreiben, welche die Methoden setLogger, setDB usw. enthält oder soll ich die Methode je nach Bedarf immer einzeln in die Klasse schreiben,
Das kann ich natürlich von hier aus nicht sagen.
Bedenke:
Du kannst immer nur von EINER Oberklasse erben, aber VIELE Interfaces implementieren.

Zitat:
, kann man die Methoden irgendwie verallgemeinern?
Hmm...

Sowas?
Google: "Observer Design Pattern"
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
In einer Klasse auf andere Klassen zugreifen ghost120 PHP Entwicklung und Softwaredesign 7 06.03.2010 23:06:27
dynamisch Objekte von Klassen anlegen floorball92 PHP für Fortgeschrittene und Experten 6 06.04.2009 14:22:19
Abfrage der SessionID auf fremden Server? d4ron PHP für Fortgeschrittene und Experten 5 06.07.2008 18:03:47
Mit ajax auf Klassen zugreifen Valentin PHP für Fortgeschrittene und Experten 0 27.04.2006 16:14:47
Zugriff auf andere Domain Raketenmann PHP Grundlagen 2 15.06.2004 12:37:47


Alle Zeitangaben in WEZ +2. Es ist jetzt 14:15:00 Uhr.


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


© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt