Manuel B.: Fehlermeldungen E_ERROR abfangen

Ich grüsse den Cosmos,

ich hatte grad die Idee, sowas wie __autoload für Funktionien zu implementieren. Dummerweise würde ja der Aufruf einer nichtexistierenden Funktion ein E_ERROR auslösen, das man laut Doku nicht abfangen kann. Somit ist es auch nicht möglich, anhand der fehlermeldung die Funktion nachzuladen.
Gibt es eine Möglichkeit, diesen Fehler quasi zu übergehen, damit ich anschliessend die Fehlermeldung auslesen und darauf reagieren kann?
Das ganze müsste aber ohne Eingriff in die php.ini oder die Apache-Config (auch kein .htaccess) funktionieren und nur mit PHP5, PHP4 ist mir egal ;)

Kurz gesagt, hierbei geht es nur darum, ein E_ERROR auf einen eigenen error-handler umzubiegen, ohne in den Server selbst eingreifen zu müssen. Falls es nicht funktioniert (was ich befürchte nach meiner Recherche), reicht mir ein kleines "Nein, es geht nicht" :D

Wenns funktioniert, könnte ich damit aber viele schöne und vorallem praktische Dinge in meine API integrieren, die das Leben der Programmierer erleichtern.

Möge das "Self" mit euch sein

--
Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
  1. Wenn nicht mit try {} catch() {}, dann wohl: Nein es geht nicht.

    1. Ich grüsse den Cosmos,

      Wenn nicht mit try {} catch() {},

      Nein, damit gehts auch nicht

      dann wohl: Nein es geht nicht.

      Nicht das, was ich hören wollte, aber das, was ich befürchtet hab. Und das ganze über die Pufferung zu umgehen ist schlichtweg zu langsam. Somit muss ich mir was anderes einfallen lassen, um Dateien mit Funktionen möglichst automatisch einzubinden. Aber mir schwebt da schon ne Lösung vor.

      Möge das "Self" mit euch sein

      --
      Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
      ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
    2. echo $begrüßung;

      Wenn nicht mit try {} catch() {}, dann wohl: Nein es geht nicht.

      try und catch arbeiten nur beim Werfen von Ausnahmen, nicht jedoch mit PHPs herkömmlichem Fehlermeldungsmechanismus.

      echo "$verabschiedung $name";

  2. echo $begrüßung;

    ich hatte grad die Idee, sowas wie __autoload für Funktionien zu implementieren.

    Das wird nicht funktionieren. __autoload() kommt zwischen dem Suchen der Klasse und deren Ausführung zur Anwendung. Diese Funktionalität ist direkt in den Klassensuchprozess PHPs eingebaut. PHP müsste nach Auftreten des Funktion-nicht-vorhanden-Fehlers wieder an die Stelle _vor_ dem Aufruf der Funktion zurückspringen und den Aufruf wiederholen. Das wird es nicht tun, da es von (d)einem Autoload-Mechanismus nicht ausgehen kann und ohne diesen diese Vorgehensweise in einer Endlosschleife enden würde.

    Dummerweise würde ja der Aufruf einer nichtexistierenden Funktion ein E_ERROR auslösen, das man laut Doku nicht abfangen kann.

    Diese Fehler sind so fatal, dass eine Fortführung nicht möglich ist. Wenn beispielsweise der Speicher nicht mehr reicht, reicht er auch nicht mehr für den Errorhandler.
    Es wurde aber in PHP 5.2.0 eine Abstufung namens E_RECOVERABLE_ERROR eingefügt. Dieser Fehler kann mit dem Errorhandler abgefangen werden. Wenn das nicht gemacht wird, gibt es einen E_ERROR. Allerdings ist die Dokumentationslage nicht sehr berauschend. Ich fand keine komplette Auflistung der E_RECOVERABLE_ERROR-Auslösungsfälle.

    Wenns funktioniert, könnte ich damit aber viele schöne und vorallem praktische Dinge in meine API integrieren, die das Leben der Programmierer erleichtern.

    Steig um auf OOP und Klassen, dann kannst du auch autoloaden und andere interessante Dinge machen. (Schon mal die Standard PHP Library (SPL) Functions gesehen?)

    echo "$verabschiedung $name";

    1. Hallo dedlfix.

      ich hatte grad die Idee, sowas wie __autoload für Funktionien zu implementieren.

      Das wird nicht funktionieren.

      Auch nicht per Überladung?

      Einen schönen Mittwoch noch.

      Gruß, Mathias

      --
      ie:% fl:| br:< va:) ls:& fo:) rl:( n4:~ ss:) de:] js:| mo:| zu:)
      debian/rules
      1. echo $begrüßung;

        ich hatte grad die Idee, sowas wie __autoload für Funktionien zu implementieren.
        Das wird nicht funktionieren.
        Auch nicht per Überladung?

        Überladen ist meiner Meinung nach nicht das richtige Wort für diese unter PHP so bezeichnete Technik. Während __autoload() eine eigenständige Funktion ist, funktioniert "Überladung" nur mit Klassen. Es wird dabei nichts überschrieben oder verdeckt, sondern nur definierte Methoden aufgerufen, wenn Eigenschaften oder Methoden, auf die zugegriffen werden sollen, nicht existieren. Man kann diese Magie also nur für Methoden und nicht für eigenständige Funktionen verwenden.
        Und dann ist es auch nicht möglich, zur Laufzeit Methoden an Klassen anzuflanschen, so dass bei der nächsten Instantiierung eines Objektes dieser Klasse selbiges mehr Methoden hat als im Ursprungscode definiert sind. (Es gibt die PECL-Extension classkit, doch die wird sicher nicht zur Verfügung stehen und ist außerdem nur im Beta-Stadium.)
        Mit create_function() Funktionen zu erzeugen und die an bereits instantiierte Objekte anzuhängen halte ich auch für alles andere als besonders clever. Es mag im ersten Moment so aussehen, aber schafft nur mehr Verwirrung als nötig ("Wo ist denn jetzt schon wieder diese Methode deklariert?"). Zudem hindern solche Laufzeit-Code-Erweiterungen die PHP-Entwicklungsumgebungen wie beispielsweise Zend Studio und PHPEclipse wirksam am Unterbreiten von Codevervollständigungsvorschlägen, ein Hilfsmittel das ich deutlich mehr schätze als unübersichtliche Automatismen, die möglicherweise mehr Laufzeit fressen, als die ganze Sache Wert ist.

        echo "$verabschiedung $name";

        1. Ich grüsse den Cosmos,

          Mit create_function() Funktionen zu erzeugen und die an bereits instantiierte Objekte anzuhängen halte ich auch für alles andere als besonders clever.

          Allein schon wegen der Codelesbarkeit würde ich das ablehnen. Und es handelt sich ja nicht um Funktionen, deren Parameter erst zur Laufzeit existent sind, also ist das auch nicht nötig.

          Vielleicht ist das Fehlen einer Autoload-Funktion für Funktionen auch ganz gut, dann bin ich quasi gezwungen, ALtlasten abzuwerfen und alles gleich auf OOP umzustellen. Man kann ja alles positiv sehen ;)

          Möge das "Self" mit euch sein

          --
          Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
          ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
    2. Ich grüsse den Cosmos,

      Steig um auf OOP und Klassen, dann kannst du auch autoloaden und andere interessante Dinge machen. (Schon mal die Standard PHP Library (SPL) Functions gesehen?)

      Das meiste ist OOP, aber die API noch nicht. Ist quasi noch ne Altlast aus der vorherigen Version. Und da ich mit der API abwärtskompatibel sein wollte, halt die Einbindungsmöglichkeit für Funktionen, das kann ich aber auch anders lösen.
      Das System selbst ist zu 90% auf OOP umgestellt und die restlichen 10% sind in Arbeit ;)

      Möge das "Self" mit euch sein

      --
      Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
      ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)
  3. Moin!

    ich hatte grad die Idee, sowas wie __autoload für Funktionien zu implementieren. Dummerweise würde ja der Aufruf einer nichtexistierenden Funktion ein E_ERROR auslösen, das man laut Doku nicht abfangen kann. Somit ist es auch nicht möglich, anhand der fehlermeldung die Funktion nachzuladen.

    Korrekt, aber man kann vor dem Funktionsaufruf prüfen, ob diese definiert ist, und ggf. für deren Definition sorgen: function_exists().

    Das bedeutet aber natürlich Eingriff im aufrufenden Teil, nicht im aufgerufenen bzw. dessem allgemeinen Teil.
     - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Ich grüsse den Cosmos,

      Korrekt, aber man kann vor dem Funktionsaufruf prüfen, ob diese definiert ist, und ggf. für deren Definition sorgen: function_exists().

      Das ist mir klar, aber dafür muss ja der Name der Funktion bekannt sein.
      Somit ist ja ein Autoloader wieder nicht realisierbar. Mittlerweile hab ich mir was ausgearbeitet, was ähnlich funktioniert. Es muss halt dann nur der Funktionsname dem Namen der Erweiterung entsprechen, die auf die API zugreift.

      Nicht das, was ich wollte, aber besser als nix ;)

      Möge das "Self" mit euch sein

      --
      Fragt ein Atom das andere: Hast du mein Elektron gesehen? Ich bin heute so positiv.
      ie:{ br:> fl:| va:| ls:& fo:{ rl:( n4:{ de:] ss:) ch:? js:| mo:) sh:( zu:)