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