![]() |
|
|
Themen-Optionen |
|
|
Nach oben #1 | ||
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
|
Hallo Leute,
ich bin grad dabei, mein Framework zu schreiben und stehe vor einem kleinen Problem: ich habe folgende Datei index.php: PHP-Code:
PHP-Code:
PHP-Code:
Die Ausgabe ist wie gewünscht: Zitat:
Denn dann wirft er keine Exception, sondern gibt einfach eine Standard-Fehlermeldung aus: Zitat:
Das Dumme ist nur: Wenn ich um das throw in __autoload einen try-catch-Block mache, bekomme ich immer noch die Standard-Fehlermeldung von PHP. Die bekomme ich zwar über error_reporting(E_NONE); in den Griff. Aber das ist für mich nicht gerade "sauber". Gibt es nicht einen anderen Weg, sowas sauber zu lösen, ohne von meinem Weg des Werfens der Ausnahme in __autoload abzukommen? Ich hoffe, ihr könnt mir helfen. Danke, Jojo
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
||
|
|
|
|
|
Nach oben #2 |
|
Erfahrener Benutzer
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 497
|
afaik hilft es dir, wenn du ne fehler-behandlungsfunktion angibst (http://php.net/set_error_handler).
__________________
Weißt Bescheid - Scheiß wie weit |
|
|
|
|
|
Nach oben #3 |
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
|
Also meinst du, ich soll dann quasi diesen Fehler filtern und einfach nicht ausgeben?
Oder soll ich die Exception in dem benutzerdefinierten Handler werfen?
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
|
|
|
|
|
Nach oben #4 |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 786
|
...einfach mal ins Manual schauen und die Notes lesen:
http://php.net/manual/en/language.oop5.autoload.php Basti |
|
|
|
|
|
Nach oben #5 |
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
|
Autsch!
Das tut weh! Jetzt wo ich das gelesen habe fällt mir auch noch was Doofes ein: Ich hab ne ähnliche Idee schonmal fallen gelassen, weil ich ich die Note gelesen habe //edit: Huch, aber die erste User contributed Note seh ich zum erstem Mal. Meintest du die? Wenn das klappt wär das natürlich genial. //edit2: Ich bin mir sicher, dass du das meintest. Danke!
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int Geändert von Jojo (16.11.2006 um 17:47 Uhr). |
|
|
|
|
|
Nach oben #6 | |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 786
|
Zitat:
Übrigens: Is'n Scherz, oder? Basti |
|
|
|
|
|
|
Nach oben #7 |
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
|
Eher ein Schusselfehler. Danke ^^
Jetzt habe ich nur noch ein "Problem". Und zwar habe ich die Error-Funktionen ausgelagert und include sie am Anfang des Scriptes. Nur tritt jetzt anscheinend folgendes Problem auf: Jedes Mal, wenn include/require/o.ä. auftritt, wird anscheined zuerst in die __autoload-Funktion gegangen und versucht, sie darüber zu laden. Denn nun beschwert er sich, weil er eine Exception-Klasse nicht gefunden wurde, die in der __autoload-Funktion gebraucht wird, wenn ich meine Exceptions einbinden will... -.- Werd ich wohl einen Workarround machen müssen.... //edit: Ich habe den Fehler, aber immer noch keine Lösung Meine erste eingebundene Exceptionklasse ist Kindklasse einer anderern Exceptionklasse. Und anscheinend wartet PHP nicht, bis alle Exceptionklassen eingebunden sind (was auch logisch ist). Nun.... Hat jemand eine Idee, wie ich das verhindern könnte? Eventuell, wenn ich das Errorreporting kurzzeitig ausschalte? //edit: Dreckig aber es geht.... Aber glücklich bin ich damit nicht.... //edit: Sorry für die vielen Edits, aber ich bin glaube ich heute etwas voreilig.... Es geht nicht. Is ja auch logisch! Nur weil der Error nicht angezeigt wird, heißt das ja noch nicht, dass es nicht abbricht. Mein Problem ist eben folgendes, dass ich über ein "tolle" Funktion mein ganzes Exception-Dir include. Und der schaut natürlich nicht nach Namen oder Abhängigkeiten... Naja, mal schaun, vielleicht fällt mir ja was ein.
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int Geändert von Jojo (16.11.2006 um 18:31 Uhr). |
|
|
|
|
|
Nach oben #8 |
|
Erfahrener Benutzer
Registriert seit: 15.09.2005
Ort: Königreich Flieden
Beiträge: 497
|
ähm mach das ganze doch so:
überprüfe in der exception-funktion, ob die Exception-klasse geladen wurde (class_exists). Wenn nicht, kannst du von nem schwerwiegenden Fehler ausgehen, der das ganze system unmöglich macht. also kann das skript dann einfach mit ner entsprechende fehlermeldung abgebrochen werden.
__________________
Weißt Bescheid - Scheiß wie weit |
|
|
|
|
|
Nach oben #9 |
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
|
Das Problem ist aber doch, dass ich eine Klasse AutoloadException habe, die von DefaultException erbt.
Wenn er nun zuerst AutoloadException includet, versucht er über __autoload die Klasse DefaultException nachzuladen, was jedoch nicht funktioniert, da ich bei den Exceptions eigentlich keine Namespaces möchte. Dummerweise weiß der Interpreter nicht, dass er die Klasse DefaultException noch nachladen wird. Ich glaube, ich werde einfach in der __autoload() eine Fallunterscheidung zwischen Exceptionklassen und "normalen" Klassen machen. Ich denke, das wäre am unkompliziertesten...
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int |
|
|
|
|
|
Nach oben #10 |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 786
|
Macht du das grad in deiner Freizeit? Ich meine, man kann sich auch stundenlang mit sowas aufhalten. *g
Ich benenne meine Dateien und Klassen übrigens immer "komplett": lib/Mod/Mod_News/Mod_News_View/Mod_News_View_EditForm.php: class Mod_News_View_Display extends... Damit hab ich war ellenlange Klassennamen, aber es gibt definitiv keine Konflikte, da ja auch nur eine Datei mit einem Namen in einem Verzeichnis liegen kann. Übrigens macht der include_path() doch keinen Sinn, wenn du in __autoload() eh immer den absoluten Pfad angibst, oder? Basti |
|
|
|
|
|
Nach oben #11 | ||
|
Irgendwas mit e
Registriert seit: 26.08.2005
Ort: Mannheim
Beiträge: 390
|
Zitat:
So mach ich das auch bei allen anderen Klassen. Nur wollte ich das bei den Exceptions aus kosmetischen Gründen vermeiden. Zitat:
Index.php: PHP-Code:
PHP-Code:
Grüße, Jojo
__________________
In the beginning was the word and the word was content-type: plain/text heute code ich, morgen debug ich und uebermorgen cast ich die koenigin auf int Geändert von Jojo (17.11.2006 um 19:35 Uhr). |
||
|
|
|
|
|
Nach oben #12 |
|
Erfahrener Benutzer
Registriert seit: 04.01.2006
Ort: Kassel
Beiträge: 786
|
Ich gehe davon aus, dass es schneller ist, wenn du einen absoluten Pfad für dein include angibst, anstatt einem, der relativ ist zu deinem include_path. So muss ja in jedem Verzeichns im include_path erstmal nach der Datei geschaut werden. Außerdem vermeidest du, wenn du einen absoluten Pfad angibst, den Fehler wenn irgendwo im include_path eine Datei liegt, die wie deine Klassen-Datei heißt.
Was die Exceptions angeht: Musst du schon selber wissen, wie du die benennen willst. Ist wahrscheinlich keine schlechte Idee, die z.B. Exception_FileSystem zu bennenen und dann eben alle Exceprions im Verzeichnis lib/Exception/ zu haben. Falls nicht würde ich aber in jedem Fall das preg_match() durch substr() ersetzen. Außerdem würde ich das inclue_once durch include ersetzen, denn die Datei wurde ja definitiv noch nicht eingebunden (falls du konsequent alles über __autolad() lauen lässt, wovon ich ausgehe) und include_once ist ziemlich lahm. Und mit den Dateinamen überleg ich mir auch nochmal, ob ich das nicht doch so mache, wie du und nicht jedem Verzeichnis/jeder Datei den "vollen" Namen geben: lib/Mod/News/View/Display.php anstatt lib/Mod/Mod_News/Mod_News_View/Mod_News_Display.php Ist halt so (wie bei mir) in Editoren viel schneller erfasbar, welche der offenen Dateien welche ist. In Kate würde sonst in der Liste der ffenen Dateien oder in der Tab-Bar nur Folgendes stehen: Controller.php Controller.php (2) Controller.php (3) Controller.php (4) Anstatt eben Mod_Page_Controller.php Mod_User_Controller.php Mod_MlText_Controller.php Mod_News_Controller.php Der Nachteil ist, dass es ätzend ist, Module zu kopieren oder umzubenennen. Basti |
|
|
|