PHP-Autoloading für Funktionen
frager
- php
Abend/Nacht,
gibt es eine Möglichkeit, das PHP-Autoloading nicht nur für Klassen oder Interfaces sondern auch für Funktionen zu verwenden?
Gruß
gibt es eine Möglichkeit, das PHP-Autoloading nicht nur für Klassen oder Interfaces sondern auch für Funktionen zu verwenden?
eine klasse/objekt ist meistens eine ansammlung von funktionen - was hindert dich daran einem objekt nur eine einzige funktion zu erstellen und nur diese zu verwenden?
Hallo,
Für PHP5 würde ich eine abstrakte Klasse als Methodensammlung erstellen und in dieser die Methoden als public static anbieten:
abstract class Foo {
public static function bar () {
//mach dies
}
public static function baz () {
//mach das
}
}
Dann lassen sich die MEthoden so aufrufen:
Foo::bar(); //macht dies
Foo::baz(); //macht das
Zusammen mit autoload ist das eine sehr praktikable Geschichte.
netten Tag
^da Powl
Hallo,
ja keine schlechte Idee, aber damit wird wieder die ganze Klasse geladen mit allen Funktionen sobald ich eine Methode aus der Klasse benötige.
Aber das autoload einfach für "undeclared" functions ist nicht möglich?
Gruß
Hallo,
Aber das autoload einfach für "undeclared" functions ist nicht möglich?
Nein.
Wenn Du die Funktionen einzeln haben willst, kannst Du ja immer noch sowas machen wie:
abstract class Func1 {
public function exec () {
// ...
}
}
abstract class Func2 {
public function exec () {
// ...
}
}
Func1::exec ();
Func2::exec ();
Nicht besonders schön, nicht besonders toll, funktioniert aber...
Ansonsten: Warum hast Du überhaupt so extrem viele globale Funktionen, die Du dynamisch nachladen willst? Hast Du außerdem mal an einen Opcode-Cache (z.B. APC) nachgedacht, wenn die Compilerperformance für Dich ausschlaggebend ist?
Viele Grüße,
Christian
Hallo,
danke für deine Antwort.
Naja ich weiß nie, wie für was ich sinnvoll eine Klasse/ein Objekt verwenden soll ... irgendwie ist mir das nicht ganz einleuchtend wo ich bei meinem Code sowas wie im Tut habe, wo ein wirklcihes Objekt (Kreis) mit seinen Methoden verändert wird ...
Naja die unschöne Variante ist es dann wohl auch nicht.
Was macht dieser Opcode-Cache genau? Bisjetzt cache ich nur generierte Ausgaben, Grafiken und PDFs. Was wird da genau gecached?
Gruß
Hallo,
Was macht dieser Opcode-Cache genau? Bisjetzt cache ich nur generierte Ausgaben, Grafiken und PDFs. Was wird da genau gecached?
Opcodes. ;-)
Wenn PHP eine Datei ausführt, dann passiert folgendes: In Schritt 1 wird die Datei geparset und kompiliert und das Ergebnis davon wird im Speicher als sogenannte "Opcodes" abgelegt. Im zweiten Schritt werden diese Opcodes dann von PHP der Reihe nach ausgeführt. Zu Opcodes hatte ich vor einiger Zeit etwas geschrieben - zwar aus anderem Anlass, aber evtl. hilft es Dir, das ganze zu verstehen.
Der Witz an Opcode-Caches ist nun, dass sie den Kompiliervorgang (der evtl. einiges an Zeit kostet, weil da rumgeparst werden muss usw.) überflüssig machen, weil sie die fertigen Opcodes einer Datei im Speicher oder auf der Festplatte abgelegen und solange sich die Datei nicht mehr ändert, die Datei nicht erneut kompiliert werden muss.
Wenn Du also Angst hast, dass es Performance kostet, dass PHP so eine riesige Datei von Dir jedes Mal parsen muss, dann kannst Du dem mit Opcode-Caches entgegen wirken. Dann spricht auch nichts dagegen, alle Funktionen, die Du hast, immer zu laden.
Einziges Problem: Du musst Kontrolle über die PHP-Installation haben, um einen Opcode-Cache verwenden zu können oder der Admin muss das für Dich einrichten.
Andererseits: Wenn Du so extrem viele Funktionen hast, dass Du das schon als viel empfindest, die imemr zu laden, dann spricht das eher für ein schlechtes Design, das Du evtl. korrigieren solltest. Wenn Du mit OOP nicht besonders grün bist, wäre evtl. ein gutes Buch zu OOP Design Patterns nicht schlecht, hier kursierte vor einiger Zeit auch mal eine Empfehlung, allerdings ist sie mir gerade entfallen - vielleicht liest ja auch jemand anderes noch mit...
Viele Grüße,
Christian