Einzelnen Beitrag anzeigen
  #4  
Alt 16.01.2011, 20:44:06
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
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