php und Objektüberladung

dragonknight

New Member
Hallo,
ich hab mal ne Basis frage, da ich gerade eines meiner Scripte umprogrammiere.

Ich hab auf php.net die Objektüberladung entdeckt.
Hab meine Klasse damit aufgerüstet und begonnen etliche nicht dauerhaft benötigte Methoden in diese "Plugins" exportiert.
Der Hauptteil der Klasse hat sich daher drastisch entschlackt.
Bringt das überladen überhaupt Vorteile und vor allem wie schauts da mit der Reaktionszeit aus (Performance)?

MFG
chris
 
Ich hab auf php.net die Objektüberladung entdeckt.
Vielleicht erklärst Du uns genauer was Du mit dem Begriff meinst. Google spuckt dazu rein gar nichts aus... ;)
Und vom objektorientierten Ansatz gibt es viele mögliche Aspekte, die Du meinen könntest.

huschi.
 
Php 5.x bietet die Möglichkeit magische Methoden zu definieren.
Diese werden bei den unterschiedlichsten Events geladen.
Beispiel
PHP:
public function __autoload($classname){
....
}
lädt zum Beispiel eine Klasse nach, wenn sie innerhalb des Hauptobjekts Instanziert wird.

Hingegen
(das ist die eigentliche Methode auf die ich hin aus will / wollte)

PHP:
public function __call($methode, $arg){
        $d = $this->load_file($this->c_class."core/",$methode.'.php','core');
        if(!$d){
	return $methode($argumente);
        }else{
            return false;
        }
}
Diese Methode bindet eine Funktion innerhalb einer Datei ein und übergibt die Parameter der aufgerufenen Methode aus.

Zum Beispiel wurde die Methode print nicht definiert innerhalb der Klasse, sondern als externe Funktion angelegt.
Ein Aufruf mit $objekt->print();
gibt trotzdem dem Wert der Methode aus.
Allerdings gibt es hier das Manko das $this nicht innerhalb der Überladenen Funktion gibt, sondern mit global $objekt nachgeladen werden muß (besser, das Objekt muß für die Funktion sichtbar gemacht werden).

Klingt nach viel mehr auffwand, was es im Endeffekt auch ist, da das Funktions array $arg auch bei der Programmierung mit bedacht werden muß.
Allerdings hat es halt den Vorteil, das nicht alle Methoden fest in der Klasse definiert werden müßen.

php.net Dokumentation:
PHP: Ãœberladung - Manual
Nachdem PHP 4 eh ab August 2008 nicht mehr Unterstützt wird, dachte ich mir ich bau das Feature ein.
Bei mir funktionierts inzwischen relativ gut.
Allerdings meine ist meine Frage hinsichtlich der Performance unschlüssig.
Was haltet ihr davon, hat da schon mal jemand Erfahrung sammeln können?

[@mods, das gerade sollte kein Pushen sein, sondern nur eine Präzisierung meiner Frage ;)]

thx chris
 
Ah, du meinst die "magischen Methoden". (Warum schreibst Du es nicht gleich statt dem neuen Kunstwort "Objektüberladung"?)

Für Getter und Setter sind die äußerst Praktisch.
Auch für Basis-Klassen, die auf diese Art fehlerhafte Implementierung/Vererbung auffangen können, ist es gut geeignet.
Für Autoloader
Aber reale Methoden damit auszuführen macht zum einen den Code unübersichtlich und geht bei dauerhafter Nutzung bestimmt auf kosten der Performance.

Der Aufruf einer Objekt-Methode geht vom höchsten Vererbungsgrad bis runter zum tiefsten. Bis die passende Methode gefunden wurde. Wenn nicht, werden die Getter-/Setter-/etc. Methoden durchsucht.
D.h., daß die magischen Methoden die längste Aufrufzeit haben.

Für Autoload gibt es übrigens __autoload() (außerhalb eines Objektes) um Klassen automatisch nachzuladen.
Nachteil von Autoload in PHP: PHP-Beschleuniger greifen hier nicht oder nur mangelhaft. Precompiler (wie IonCube) kommen damit klar. Binär-Code-Caches hingegen nicht.

huschi.
 
Ok, hilft mir mal weiter.
Hab hier nur Methoden ausgelagert, die nicht wichtige bestandteile des Systems sind, aber denoch aufgerufen werden können.
Vorteil der "setter" und "getter" methoden ist halt, das man alles Modullarisieren kann (was für ein schweres Wort, bitte nicht böse sein, wenn die Rechtschreibung nicht stimmt).
Mein bisheriges System schleppt viel Balast mit, was vom System selbst hin und wieder benötigt wird.
Ein Script Kern mit 1 MB Memory Load ist halt doch Resourcenhungrig ohne Ende.
Da sind aber Klassen für Autorisation, Template Engine etc. mit inbegriffen.
Aber trotzdem erhoff ich mir so, das ganze zu drosseln.
 
Ein Script Kern mit 1 MB Memory Load ist halt doch Resourcenhungrig ohne Ende.
Kommt immer drauf an, was da drin steckt.
Aber es muß halt ständig neu compiliert werden. Das ist das eigentliche Problem.
Hast Du schon einen PHP-Cache installiert?

Ansonsten würde ich das ganze System entsprechend Modularer aufbauen. Ggf. auch die Objekt-Struktur entsprechend verfeinern.
Kostet aber viel Zeit...

huschi.
 
Alternative dazu

So,
nach längeren Überlegungen hab ich vielleicht eine Alternative gefunden:

PHP:
    final public function __call($methode,$argumente){
    	global $API;
    	return Klasse::$methode($argumente);
    }

Die Methoden in der Klasse sind alle als Static definiert.
Die Klasse wird bei Instanzieren der Parentklasse mit geladen.
Methoden die öfters gebraucht werden, werden in der Klasse statisch definiert.
Hof das funktioniert nun noch.
Was hältst du von der Variante.

Als weitere Alternative kann ich eine Variable innerhalb des Objekts Instazieren und dann über dieses auch die __call Methode verwenden, da diese nicht statisch sein darf.
Mal schauen.

chris
 
Back
Top