Änderungen von Objekteigenschaften vor dem Speichern berechnen
am 12.04.2008 13:44:42 von Jacob HaynMoin NG,
man stelle sich folgenden Auszug eines Objekts vor, Zielplattform ist
ein LAMP mit PHP 5.2.3 und memcached 1.2.1:
class MyObject
{
// die Nutzlast
private $aProps = array();
public function __construct() {
// hole die Eigenschaften aus Cache/DB
// und schiebe sie in $aProps
}
public function __destruct() {
// berechne was sich in $aProps geändert hat
// und schiebe die Änderungen zurück in Cache/DB
}
public function set($sKey, $mValue) {
$this->aProps[$sKey] = $mValue;
}
}
Im weiteren Programmverlauf wird dann eine Instanz erstellt
$oMyObject = new MyObject();
und per $oMyObject->set(); wird mindestens ein Wert überschrieben.
Wie oben schon angedeutet soll im Destruktor (oder in __sleep() oder wo
auch immer) berechnet werden, welche Elemente von $aProps verändert
wurden, damit sie auf die eine oder andere Weise dann ihren Weg zurück
in den Cache und die DB finden können.
Mein erster Ansatz war, das komplette $aProps als Kopie in
$aOriginalProps abzulegen und später mit array_diff() (oder so) zu
arbeiten. Das habe ich dann schnell wieder verworfen, weil mir das vom
Ressourcenverbrauch her zu teuer wird.
Dann kam mir die Idee, in der Methode set() den $sKey des geänderten
Elements an eine neue Klassen-Eigenschaft $aChangedProps anzuhängen.
//...
public function set($sKey, $mValue) {
// hier könnte man noch prüfen
// ob sich $mValue tatsächlich ändert (===)
$this->aChangedProps[] = $sKey;
$this->aProps[$sKey] = $mValue;
}
//...
Das würde die Auswahl natürlich vereinfachen und ist auch nicht so teuer.
Habt Ihr vielleicht noch Anmerkungen dazu oder eine Idee wie das
eleganter zu lösen ist?
Gruß Jacob