phpbar.de logo

Mailinglisten-Archive

[php] Speicherverbrauch bei vielen Objekten mit gleicher Basisklasse

[php] Speicherverbrauch bei vielen Objekten mit gleicher Basisklasse

Andreas Demmer php at andreas-demmer.de
Die Aug 24 12:22:01 CEST 2004


Hallo Carsten!

> Habe ich jetzt 201 Objekte mit gleichem Speicherverbrauch (201*25kB)
> oder belegen die abgeleitete Klassen mit weniger PHP-Code weniger
> Speicher, etwa 25kb + 1*2,4kB + 20* (1,9kB + 10* 2,1kB)? Oder spielt
> die Codelänge fast keine Rolle?

Die Codelänge spielt erstmal keine Rolle, eher schon die Komplexität
des Codes, also wie der daraus resultierende Bytecode aussieht.

Aber mach doch mal die Probe aufs Exempel und überwache den Speicher-
verbrauch bei steigender Objektanzahl.

> Oder ist mein OOP-Ansatz völlig fürn Eimer?

Nein, genau das ist der Sinn von OOP: Datensätze als Objekte zu be-
trachten und über Methoden zu modifizieren. Das ist sauber, übersicht-
lich und wenn gut gemacht auch bequem.

Ein schöner Ansatz wäre auch, dass die finalen Objekte lediglich noch
den Datenbestand verwalten und die Methoden alle im geerbten Objekt
bleiben. Hierzu wäre Overloading sehr gut geeignet!

Beispiel für PHP5:

<?php
interface storeDataset {
    public function __set($key, $value);
}

abstract class modifyDataset {
    protected $id;
    protected $query = NULL;

    public function saveToDatabase() {
        (bool)$this->id ? $this->createUpdate() : $this->createInsert();
        echo $this->query, "<br />\n";
    }

    protected function createInsert() {
        $this->query = 'INSERT INTO '.$this->table.' SET
'.$this->getArgumentsString();
    }

    protected function createUpdate() {
        $this->query = 'UPDATE '.$this->table;
        $this->query .= ' SET '.$this->getArgumentsString();
        $this->query .= ' WHERE id  = '.$this->id;
    }

    protected function getArgumentsString() {
        $argumentString = array();

        foreach($this->dataset as $key => $val) {
            $argumentString[] = $key.' = \''.$val.'\'';
        }

        return implode(', ', $argumentString);
    }
}

final class userdata extends modifyDataset implements storeDataset {
    protected $table = 'usertable';
    protected $dataset = array();

    function __construct($id = FALSE) {
        $this->id = $id;
    }

    public function __set($key, $value) {
        $this->dataset[$key] = $value;
        return TRUE;
    }
}

$existingUser = new userdata(1);
$existingUser->username = 'foo';
$existingUser->saveToDatabase();

$newUser = new userdata();
$newUser->username = 'bar';
$newUser->saveToDatabase();
?>

Gruss,
Andreas

--
http://www.andreas-demmer.de



php::bar PHP Wiki   -   Listenarchive