php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Thema geschlossen
 
LinkBack Themen-Optionen Thema bewerten
Alt 23.09.2007, 18:12  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard __autoload und is_subclass_of

Hallo,
folgendes Phänomen meiner __autoload() Funktion:
PHP-Code:
<?php
function __autoload($class)
{
    
$pathClass PATH_CLASSES str_replace("_""/"$class) . ".php";
    
$isClass is_file($pathClass);
    if (
$isClass) {
        require_once 
$pathClass;
        
#assert(class_exists($class));
        
return;
    }

    
$pathException PATH_EXCEPTIONS $class ".php";
    
$isException is_file($pathException);# && class_exists("Exception") && is_subclass_of($class, "Exception");
    
var_dump("--erreicht--");
    if (
$isException) {
        require 
$pathException;
        
#assert(class_exists($class));
        
return;
    }
}
?>
Ausgabe:
Code:
string(12) "--erreicht--" string(12) "--erreicht--"
Fatal error: Uncaught exception 'ErrorException' with message 'Undefined index: method T:\projects\***\online\private\includes\exceptions\SystemException.php:9' in T:\projects\***\online\private\includes\functions\errorHandler.php:5 Stack trace: #0 T:\projects\***\online\private\includes\exceptions\SystemException.php(9): errorHandler('%s(): directori...', '/public/') #1 T:\projects\***\online\private\includes\classes\FrontController.php(66): SystemException::factory('/public/') #2 T:\projects\***\online\private\includes\classes\FrontController.php(46): FrontController->setModulePath('modulePath', '/public/') #3 T:\projects\***\online\private\includes\classes\FrontController.php(23): FrontController->__set('T:\projects\loc...', '/public/') #4 T:\projects\***\online\public\index.php(2): FrontController->__construct() #5 {main} thrown in T:\projects\***\online\private\includes\functions\errorHandler.php on line 5
Sprich, __autoload läd eine benötigte Exception, weil offenbar zur Laufzeit ein (hier nicht relevanter) Fehler aufgetreten ist, der eine Exception wirft.
Völlig in Ordnung bis dahin, ich möchte nur zeigen, dass die __autoload() bis dahin tut was sie soll.

Das komische ist, entferne ich den Kommentar bei $isException um die Typerkennung der Klasse abzusichern, also zu
PHP-Code:
<?php
$isException 
is_file($pathException) && class_exists("Exception") && is_subclass_of($class"Exception");
?>
bekomme ich folgenden Fehler:
Code:
Fatal error: Class 'IoException' not found in T:\projects\***\online\private\includes\classes\FrontController.php on line 69
(class_exists habe ich nur testweise hinzugefügt)

Es erfolgt KEINE Ausgabe von "--erreicht--", das heißt is_subclass_of() bricht offenbar den Programmablauf von __autoload() ab. Nur warum?

http://de3.php.net/is_subclass_of
Zitat:
is_subclass_of — Checks if the object has this class as one of its parents
IoException liegt wo es sein soll, leitet sich von SystemException ab, welches direkt von Exception erbt. Es steht ja explizit "one of its parents" und nicht "direct parent". Ich verwende PHP 5.2.3, das heißt als 1. Parameter ist ein String und nicht nur ein Objekt erlaubt (ab 5.0.3).

Kann es Probleme geben, wenn eine über __autoload require_once'te Klasse eine weitere über __autoload zu ladende Klasse einbindet?

Erkennt PHP einen nicht aufzulösenden (mir fällt der Fachbegriff nicht ein) Ring den ich nicht sehe?
Ich verstehe das Problem nicht, da der var_dump() nach der Deklaration von $isException einfach nicht ausgeführt wird.
Zergling-new ist offline  
Sponsor Mitteilung
PHP Code Flüsterer

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

Alt 23.09.2007, 18:19  
Erfahrener Benutzer
 
Registriert seit: 21.05.2008
Beiträge: 9.937
Zergling-new wird schon bald berühmt werden
Standard

Herrje, immer wenn ich was poste, und ich versuch wirklich vorher zu schauen, fällt mir die Lösung zu:
is_subclass_of() kann die Klasse nur auf ihre Parent-Klasse testen, wenn sie sie kennt, dazu muss sie eingebunden werden. Ist natürlich nicht möglich, wenn ich den Test vor dem Einbinden durchführe.
Zergling-new ist offline  
Thema geschlossen


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

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
__autoload, is_subclass_of, class_exists bricht ab

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:30 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

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.