Ich sehe keine Möglichkeit das zu vereinheitlichen. Zumindest nicht alles.
Warenkorb:
Fall 1: Eignet sich recht gut zur Vereinheillichung.
Ein Container mit Inhalt. Da kann man sich jetzt noch überlegen ob der Inhalt Wissen um den Container haben darf. Oder besser nicht.
Wenn nicht, könnte das so aussehen:
PHP-Code:
interface MyContainer
{
function add(ContainerInhalt $element);
}
interface ContainerInhalt
{
function needs(); // return Dependency;
}
Fall 2: Ist eine Abhängigkeit ohne Bezug zum aktuellen Container.
Dazu ist eine ganz andere Logik nötig.
Abrechungsoftware:
Kein Container weit und breit. Also evtl mit Warenkorb Fall2 vergleichbar.
Browsergame Rechtesystem
und Warenkorb Fall2
Scheinen sich sehr ähnlich, scheint aber auch nur.
Das Zend_Acl ist in der Hinsicht sehr schön gemacht. Da kann man sich was abschauen. Hat aber den heftigen Nachteil. Dass immer ALLES, also die gesammt Struktur geladen werden muß. Bei zunehmender Applikationskomplexität ein Klotz am Bein.
------------------------------------------------------------------
Schlußendlich:
Du versuchst die Applikationslogik aus der Applikation heraus zu abstrahieren. Das wird nicht gehen.
Die Niere macht Stoffwechsel.
Die Lunge macht Stoffwechsel.
Die Leber macht Stoffwechsel.
Ja, alle machen Stoffwechsel. Haben also Input und Output. Das wars aber auch schon mit den Gemeinsamkeiten.
-------------------------------------------
Zitat:
@DokuLeseHemmung
Danke für den Tipp mit dem pattern.
|
Da kann ich eine Lösung für php5.3 anbieten. Evtl. kannst du sie ja auf einen Teil der Probleme anwenden.
Eine Kombination aus Registry, Factory und Dependency Injection Pattern.
Besonderheit: Die Abhängigkeiten werden erst zur Laufzeit aufgelöst.
PHP-Code:
<?php
// DIContainer.php
class DIContainer
{
protected $values = array();
public function __construct($file)
{
include $file;
}
public function __set($id, $value)
{
$this->values[$id] = $value;
}
public function __get($id)
{
if (!isset($this->values[$id]))
throw new InvalidArgumentException("Value '$id' is not defined.");
$val = $this->values[$id];
return $this->is_lambda($val)?$val($this):$val;
}
public function __call($id,Array $params=array())
{
$val = $this->__get($id);
if (!is_callable($val))
throw new InvalidArgumentException("Value '$id' is not callable.");
return call_user_func_array($val,$params);
}
public function __isset($id)
{
return isset($this->values[$id]);
}
public function __unset($id)
{
unset($this->values[$id]);
}
protected function asSingleton(Closure $factory)
{
return function (DIContainer $di) use ($factory)
{
static $object = null;
if (is_null($object)) $object = $factory($di);
return $object;
};
}
protected function asLambda(Closure $lambda)
{
return function () use ($lambda)
{
return $lambda;
};
}
protected function is_lambda($var)
{
return is_object($var) && 'Closure' === get_class($var);
}
}
?>
PHP-Code:
<?php
// DIConfig.php
$this->alphadsn = 'mysql://user:test@localhost/test';
$this->db1 = $this->asSingleton(
function (DIContainer $di)
{
return new PDO($di->alphadsn);
}
);
$this->Multiplikation = $this->asLambda(
function ($a,$b)
{
return $a*$b;
}
);
$this->transform = 'nl2br';
?>
PHP-Code:
<?php
// index.php5_3
error_reporting(E_ALL | E_STRICT);
ini_set('display_errors', TRUE);
require_once "./DIContainer.php";
$di = new DIContainer('./DIConfig.php');
echo 'Meldung: '.$di->db1->getAttribute(PDO::ATTR_CONNECTION_STATUS).'<br>';
echo $di->Multiplikation(3,5).'<br>';
// Alternativ:
$mul = $di->Multiplikation;
echo $mul(3,5).'<br>';
echo $di->transform("a\nb").'<br>';