SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Das Zend Framework

Das Zend Framework zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP Grundlagen

PHP Grundlagen Hier kann über grundlegende Probleme oder Anfängerschwierigkeiten diskutiert werden

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 12.02.2012, 14:16:40
pascala pascala ist offline
Anfänger
 
Registriert seit: Mar 2007
Beiträge: 9
Autoload Beispiel ohne Schlüsselwort "new"

Hallo Zusammen,

Beispiel #3 von http://php.net/manual/de/language.oop5.autoload.php funktioniert natürlich in diesem Beispiel.

Code:
function __autoload($name) {
    echo "Möchte $name laden.\n";
    throw new Exception("Kann $name nicht laden.");
}

try {
    $obj = new NonLoadableClass();
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}

Ausgabe: Möchte NonLoadableClass laden. Kann NonLoadableClass nicht laden.

Aber wenn ich den Aufruf ändere und z.B. eine statische Methode aufrufe, kommt ein Fataler Error.

Code:
function __autoload($name) {
    echo "Möchte $name laden.\n";
    throw new Exception("Kann $name nicht laden.");
}

try {
    NonLoadableClass::Methode();
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}

Ausgabe: Fatal error: Class 'NonLoadableClass' not found in File on line X
Hier bricht der Code mit Fatal error ab und führt nichtmal mehr eine Shutdown-Funktion aus.

Lasse ich in dem Fall hingegen das throw new weg, führt er eine eventuell vorhandene Shutdown-Funktion aus, bricht aber dann auch bei "new Class" ab und wirft halt keine Ausnahme mehr.


Fragen:
Ist die Autoload Funktion nicht korrekt, um bei Class::Methode() die Klasse noch zu laden, sondern nur bei $obj = new Class; ?

Lässt sich das Problem lösen? (abgesehen davon, kein Autoload zu verwenden oder das ganze mit die() in der Autoloadfunktion abzubrechen, wenn z.B. die Datei und Klasse nicht gefunden wird).


Edit:
In dem Beispiel wird die Ausnahme ja als Beispiel geworfen. Ich würde sie werfen, wenn z.B. die Datei nicht gefunden wird.
Aber funktioniert ja nicht bei Class::Methode()

Zum Beispiel:
Code:
    if(!file_exists($strFilename))
      throw new \Exception("Die Datei $strFilename existiert nicht.");

    include_once($strFilename);

Danke für eure Hilfe.


Grüße
Pascal
Mit Zitat antworten
  #2  
Alt 12.02.2012, 14:24:00
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: Autoload Beispiel ohne Schlüsselwort "new"

1. Es ist Unsinn im Autoloader eine Exception zu werfen.
2. Verwende besser SPL Autoload
3. Warum lädst du die Klasse nicht im Autoloader? Dafür wurde er erfunden!
Mit Zitat antworten
  #3  
Alt 12.02.2012, 14:49:00
pascala pascala ist offline
Anfänger
 
Registriert seit: Mar 2007
Beiträge: 9
AW: Autoload Beispiel ohne Schlüsselwort "new"

1)
Wenn der Autoloader die Klasse nicht findet (weil z.B. die Datei nicht existiert), würde eine Exception meiner Meinung nach Sinn machen. Es darf natürlich nicht vorkommen, deswegen ist es ja eine Ausnahme. Sonst hätten die PHP-Entwickler es ja ab Version 5.3 nicht zugelassen sondern es wäre weiterhin ein Fataler error.

Aber vielleicht wollen sie es auch nur als Möglichkeit offen lassen :) Kann ja auch nur Ansichtssache sein. Ich berücksichtige deine Meinung und denke noch mal darüber nach. Deswegen unterhalte ich mich über solche Themen. Wenn man darüber spricht, hört man andere Meinungen und überdenkt das Ganze nochmal :).

2)
SPL Autoload schaue ich mir mal an. Hätte spl_autoload_register genutzt, um einen benutzerdefinierten Autoloader zu verwenden.

3)
Klar wird die Klasse im Autoloader geladen. Habe ja nur das Beispiel hier von PHP genommen, um das Problem mit Class::Methode() zu hinterfragen.


Denke nochmal über das Ganze nach.
Wünsche noch einen schönen Sonntag.

Pascal
Mit Zitat antworten
  #4  
Alt 12.02.2012, 15:22:38
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: Autoload Beispiel ohne Schlüsselwort "new"

__autoload verhindert die Verwendung von SPL Autoload.
SPL Autoloader sind verkettbar, bzw. werden verkettet. Wenn dann mitten drin ein Autoloader eine Excepion wirft, ist die ganze Kette fürn Arsch. Sorry, für das böse Wort, aber ist so.

Wenn eine Klasse nicht geladen werden kann, ist ein Fatal Error angemessen. PHP begnügt sich aber nicht damit, sondern wirft einen "Catchable" Fatal Error. Es gibt dir eine weitere Chance.

Zitat:
Klar wird die Klasse im Autoloader geladen. Habe ja nur das Beispiel hier von PHP genommen, um das Problem mit Class::Methode() zu hinterfragen.
1. Nein wird sie nicht, sonst hättest du eine andere Meldung bekommen.
2. Welches Problem?
Mit Zitat antworten
  #5  
Alt 12.02.2012, 18:41:04
pascala pascala ist offline
Anfänger
 
Registriert seit: Mar 2007
Beiträge: 9
AW: Autoload Beispiel ohne Schlüsselwort "new"

Wir reden ein wenig aneinander vorbei oder vielleicht drücke ich mich auch nicht korrekt aus.

Meine eigentliche Frage bezog sich auf folgenden Code:

Code:
<?php
function __autoload($name) {
    echo "Möchte $name laden.\n";
    throw new Exception("Kann $name nicht laden.");
}

try {
    NonLoadableClass::Methode();
} catch (Exception $e) {
    echo $e->getMessage(), "\n";
}

?>

Ausgabe: Fatal error: Class 'NonLoadableClass' not found in File on line X
Also ein Skript was nur das hier ausführt (BEISPIEL). Es geht mir nicht darum, wie sinnvoll das ist (ist angelehnt an das Beispiel von PHP Manual). Warum wird hier trotz throw new Exception ein Error ausgelöst und er springt nicht in den Catch Block. Wenn ich $obj = new NonLoadableClass; anstatt NonLoadableClass::Methode(); schreibe, läuft der Code wie im Beispiel vorgesehen und springt in den Catch Block.

Ich will nur verstehen, warum das so ist. In beiden Fällen ist die Klasse NonLoadableClass noch nicht vorhanden, aber einmal gibt es einen Fehler und einmal geht's in den Catch Block.

Eine Erklärung dazu habe ich im Manual nicht gefunden. Es ist auch nicht in irgendwelche Projekte integriert oder dergleichen. Einfach nur dieses Beispiel.

Was ich mir auf jeden Fall anschaue ist das SPL Autoload. Und das Exception bei verketteten Autoloadern unlogisch sind, verstehe ich auch. :)

Aber es ist wahrscheinlich unsinnig, hier weiter drüber zu sprechen, da das Beispiel 3 aus dem PHP Manual so ja eh nie verwendet wird. Mir ging es nur um den Hintergrund :).

Pascal
Mit Zitat antworten
  #6  
Alt 12.02.2012, 19:51:19
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: Autoload Beispiel ohne Schlüsselwort "new"

OK, dann zurück auf Null:
PHP-Code:
<?php
error_reporting
(-1);
ini_set('display_errors'TRUE);

function 
__autoload($name) {
    echo 
"Want to load $name.\n";
    throw new 
Exception("Unable to load $name.");
}

try {
    
$obj = new NonLoadableClass();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
Sagt bei mir:
Zitat:
Want to load NonLoadableClass. Unable to load NonLoadableClass.
Zuverlässig und stabil. Jedes mal.(bisher)



PHP-Code:
<?php
error_reporting
(-1);
ini_set('display_errors'TRUE);

function 
__autoload($name) {
    echo 
"Möchte $name laden.\n";
    throw new 
Exception("Kann $name nicht laden.");
}

try {
    
NonLoadableClass::Methode();
} catch (
Exception $e) {
    echo 
$e->getMessage(), "\n";
}
Sagt zuverlässig:
Zitat:
Möchte NonLoadableClass laden.
Fatal error: Class 'NonLoadableClass' not found in xxxxxx.php on line 11
Der Autoload wird also genutzt, aber die Exception schlägt nicht durch.
Meintest du das?
Dann ist das evtl. ein Fall für einen Bugreport.

Wobei mir allerdings die Praxisrelevanz fehlt, denn eine Exception im Autoloadstack ist recht sinnfrei.
Mit Zitat antworten
  #7  
Alt 12.02.2012, 20:21:46
pascala pascala ist offline
Anfänger
 
Registriert seit: Mar 2007
Beiträge: 9
AW: Autoload Beispiel ohne Schlüsselwort "new"

Hallo,

genau das meinte ich. Ich habe genau das gleiche Ergebnis. Dann ist es vielleicht wirklich ein Bug und ich habe nichts falsch verstanden (im Bezug auf dieses Beispiel). Denn er startet in beiden Fällen die Autoload Funktion, geht aber nicht identisch mit um.

Ich habe hier im Forum nachgefragt, weil es ja vielleicht auch so beabsichtigt sein könnte. Wenn man komplett unerfahren ist und arbeitet sich langsam in PHP ein, nimmt man halt Beispiele aus dem Manual und probiert diese aus.

Deinen Ratschlag bezüglich Exception, Sinnfrei usw. nehme ich mir zu Herzen :).

Grüße und noch einen schönen Abend.
Pascal
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Autoload für Klassen urvater PHP für Fortgeschrittene und Experten 23 25.03.2009 01:17:36
Fehler in Beispiel Objekte ??? pinball Off Topic Area 11 13.03.2008 15:21:32
Suche ein Beispiel für IP im Bild ... Wolfgagn Uhr PHP für Fortgeschrittene und Experten 6 16.02.2004 15:36:15


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:25:32 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt