Änderungen von Objekteigenschaften vor dem Speichern berechnen

Änderungen von Objekteigenschaften vor dem Speichern berechnen

am 12.04.2008 13:44:42 von Jacob Hayn

Moin 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

Re: Änderungen von Objekteigenschaften vor dem Speichern berechnen

am 12.04.2008 15:02:03 von Johannes Mueller

Jacob Hayn wrote:

> 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?

So löst man das Problem meines Wissens auch in Propel[1].

Grüße
Johannes

[1] http://propel.phpdb.org/trac/

--
Emails ohne "[nospam]" im Betreff werden kommentarlos gelöscht.