php.de

Zurück   php.de > php.de Intern > Wiki Diskussionsforum

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 12.01.2009, 21:53  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard Mini-Tutorial: Autoload Exception bei nichtgefundener klasse

hier ein kleiner codeschnipsel um nicht gefundene klassen in autoload als exception zu behandeln. (das erste sinnvolle mal das eval bentutzt wird!)

PHP-Code:
<?php

function autoload($classname)
{
         
// try to load class
    
if(is_file($classname.'.php'))
    {
        include_once(
$classname.'.php');

        
// if class was not in file
        
if(!class_exists($classname))
            
class_not_found($classname);
    }
    else
        
class_not_found($classname);
}

function 
class_not_found($classname)
{
    eval(
'
                   class '
.$classname.'
                    {
                        public static function throw_autoload_exception()
                        {
                            throw new Exception(\'Class "'
.$classname.'" not found!\');
                        }
                    }

                    '
.$classname.'::throw_autoload_exception();
             '
);
}

spl_autoload_register('autoload');

try
{
       new 
class_does_not_exists();
}
catch(
Exception $exception)
{
        echo 
$exception->getMessage();
}
ist natürlich mehr zu debug zwecke zu gebrauchen, sieht aber schöner aus als ein "FATAL ERROR"
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*

Geändert von brian johnson (13.01.2009 um 15:45 Uhr).
brian johnson ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 13.01.2009, 09:34  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Dann lieber den Error-Handler entsprechend ausstatten, sonst wird beim nächsten Zugriff auf die Klasse (die ja jetzt existiert) einiges schiefgehen
Chriz ist offline   Mit Zitat antworten
Alt 13.01.2009, 12:01  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Dann lieber den Error-Handler entsprechend ausstatten,
bei einem fatal error, bzw. E_ERROR, der bei einer nicht gefundenen klasse geworfen wird, ist schluss.

Zitat:
Zitat von Chriz Beitrag anzeigen
sonst wird beim nächsten Zugriff auf die Klasse (die ja jetzt existiert) einiges schiefgehen
türlich, ich finds aber einfach unschön sowas entgegengeschmettert zu bekommen:

Zitat:
Fatal error: Class 'my_class' not found in test.php on line 17
so kann man wenigstens das script sauber zum abschluss bringen....
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Alt 13.01.2009, 15:20  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ah, dachte der Fehler wird mit dem letzten Atemzug doch noch an den ErrorHandler übergeben.
Chriz ist offline   Mit Zitat antworten
Alt 13.01.2009, 15:22  
moderatives Dielektrikum
 
Benutzerbild von nikosch
 
Registriert seit: 21.05.2008
Beiträge: 34.256
PHP-Kenntnisse:
Fortgeschritten
nikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz seinnikosch kann auf vieles stolz sein
Standard

1. Funktioniert das auch mit statischen Methodenaufrufen unbekannter Klassen?

2. Und hier
Zitat:
include($classname.'.php');
sollte wohl zwingend ein include_once hin!

3. Aus Debugging-Sicht finde ich es etwas seltsam, dass die Exception in der Klasse ausgelöst wird, die angeblich nicht existiert...
Zitat:
throw new Exception(\'Class "'.$classname.'" not found!\');
__________________
--
One pixel is still too big. Please make it smaller. ASAP.

Initiative Mittelstand.
Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers.
--

Geändert von nikosch (13.01.2009 um 15:27 Uhr).
nikosch ist gerade online   Mit Zitat antworten
Alt 13.01.2009, 15:51  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von nikosch Beitrag anzeigen
1. Funktioniert das auch mit statischen Methodenaufrufen unbekannter Klassen?
aber selbstverständlich:

PHP-Code:
try
{
    
do_not::$call_me;
    
do_not::CALL_ME;
    
do_not::call_me('!');
}
catch(
Exception $exception)
{
        echo 
$exception->getMessage();

Zitat:
2. Und hier
sollte wohl zwingend ein include_once hin!
jep, erledigt.

Zitat:
3. Aus Debugging-Sicht finde ich es etwas seltsam, dass die Exception in der Klasse ausgelöst wird, die angeblich nicht existiert...
hätte ich dabei schreiben sollen:

mir gefällt der trace dann besser, ansonsten steht da bloß das eval() ganz oben:

Code:
#0 D:\_projects\test.php(31) : eval()'d code(11): do_not::throw_autoload_exception()
#1 D:\_projects\test.php(31): eval()
#2 D:\_projects\test.php(15): class_not_found('do_not')
#3 [internal function]: autoload('do_not')
#4 D:\_projects\test.php(38): spl_autoload_call('do_not')
#5 {main}
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Alt 14.01.2009, 11:39  
Erfahrener Benutzer
 
Benutzerbild von phpdummi
 
Registriert seit: 06.06.2008
Beiträge: 1.631
PHP-Kenntnisse:
Anfänger
phpdummi ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Nice!
__________________
"Nobody is as smart as everybody" - Kevin Kelly
— The best things in life aren't things
phpdummi ist offline   Mit Zitat antworten
Alt 20.01.2009, 22:49  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Ich find das immernoch unschön. Wie siehts mit Opcode-Caching aus, verhagelt das einem dann mal alles? Weiß mans? So fingen die kleinen Sünden von PHP 4 auch an, einfach Error by Design, aber es lief irgendwie. Für mich wäre das keine Option.

Dann lieber ein kleines Skript bauen, dass das Projekt ins Tokens zerlegt und nach verwendeten Funktionen und Klassen sucht und entsprechend Empfehlung zum Aktivieren von Extensions oder Einbinden von Funktionen bringt. Das wäre schon interessanter. Klar es löst nicht das Problem.

Andere Frage, kann ich bei einem PHP-Fehler noch schnell einen HTTP-500 senden, damit der Apache für die Fehlerseite einspringt?
Chriz ist offline   Mit Zitat antworten
Alt 20.01.2009, 23:34  
Erfahrener Benutzer
 
Registriert seit: 16.07.2005
Beiträge: 1.007
PHP-Kenntnisse:
Fortgeschritten
brian johnson befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von Chriz Beitrag anzeigen
Ich find das immernoch unschön. Wie siehts mit Opcode-Caching aus, verhagelt das einem dann mal alles? Weiß mans? So fingen die kleinen Sünden von PHP 4 auch an, einfach Error by Design, aber es lief irgendwie. Für mich wäre das keine Option.
ich bin ehrlich gesagt der meinung, das php hier error by design betreibt. wenn es dir nicht gefällt eine klasse zu emulieren, so gib eine fehlermeldung samt einem exit aus. fällt aber eben auch nicht besser als die php interne methode aus.

Zitat:
Zitat von Chriz Beitrag anzeigen
Andere Frage, kann ich bei einem PHP-Fehler noch schnell einen HTTP-500 senden, damit der Apache für die Fehlerseite einspringt?
jein, schalte display_errors aus und es wird ein HTTP 500 bei einem parse und fatal error gesendet.
__________________
PHP4?!?>>>Aktuelle PHP Version: 5.2.11 || 5.3.0
Suse 11.2 *vorfreude*
brian johnson ist offline   Mit Zitat antworten
Alt 23.01.2009, 22:09  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zitat:
ich bin ehrlich gesagt der meinung, das php hier error by design betreibt
Jein, wenn halt zur Laufzeit was fehlt wirds halt schwierig darauf zu reagieren. Vielleicht hiermit:
PHP: RuntimeException - Manual

Aber ob PHP jemals strikt und konsequent sein wird wag ich ja zu bezweifeln. Muss man sagen auch zurecht, grad für Einsteiger ist PHP halt das Paradies (ja altes Thema, ich schweif nich aus).

Zitat:
jein, schalte display_errors aus und es wird ein HTTP 500 bei einem parse und fatal error gesendet.
Guter Tipp, werd ich mal probieren.
Chriz ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Methode einer anderen Klasse aufrufen Luka PHP-Fortgeschrittene 15 09.11.2008 14:19
Exception Higidi PHP-Fortgeschrittene 14 10.09.2008 13:29
PHP: Exceptions - Teil 1 Zergling-new Tutorials 4 05.12.2007 23:31

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php autoloader tutorial, autoload exception, php autoload tutorial, php try include_once, php __autoload, http://www.php.de/wiki-diskussionsforum/50634-mini-tutorial-autoload-exception-bei-nichtgefundener-klasse.html, php autoload, autoload class, php exception tutorial, php autoload exception handling, php autoload deaktivieren, php schönere exceptions, include_once exception, php __autoload tutorial, autoload try, php autoload 5.3 class not found, exceptio debug php, php autoload class, autoload exceptions, php error handling class

Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum