Ankündigung

Einklappen
Keine Ankündigung bisher.

new Klassenname gibt NULL zurück

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • new Klassenname gibt NULL zurück

    Hallo,

    ich arbeite seit Jahren an einem großen Projekt, das auch schon zig Jahre im Produktivbetrieb läuft. Nun sind auf zwei Servern (Debian 6, PHP 5.3.7) gelegentlich Fehler aufgetreten, die auf anderen Servern nicht zu beobachten sind.

    Innerhalb einer Klasse wird eine zweite Klasse instanziert. Zuvor wird mit require_once die benötigte Include Datei eingebunden. Der anschließende Aufruf
    $this->db = new DBx($param1, $param2, ...); liefert aber NULL zurück.

    Innerhalb des Konstruktors der DBx Klasse passiert nicht viel: es werden lediglich ein paar membervariablen initialisiert. Das Ganze passiert "still", d.h. es gibt keine errors oder warnings im error.log. Wenn der Fehler auftritt, tritt er aber anschließend permanent auf. D.h. bis der Server neu gestartet wird, schlagen die Versuche die Klasse zu instanzieren fehl.

    Der Speicherverbrauch wird mit Zabbix überwacht und zeigt keine Auffälligkeiten. Im syslog findet sich nichts. Auf den Entwicklungssystemen und dem überwiegenden Teil der Produktivserver tritt der Fehler nicht auf.
    Es läuft kein PHP Cache, suhosin ist installiert - meldet aber nichts im Log

    Was kann ich prüfen? Welche Fehlerquellen kommen in Betracht.

    Grüße Jürgen.

  • #2
    Was kann ich prüfen? ... meldet aber nichts im Log
    Ist das error_reporting hochgedreht, so das Fehler protokolliert werden etc... Sonst mal testweise im Script alles hochdrehen und auf Meldugen warten etc..

    http://php-de.github.io/jumpto/faq/#debugging

    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Was steht denn in DBx genau drinne?
      Kann es sein, dass dort drinne eine Exception geworfen wird (PDO, o.ä.). Wenn im Konstruktor eine Exception geworfen wird, so wird die Klasse nicht instanziert, somit gibt new null zurück.
      "Software is like Sex, it's best if it's free." - Linus Torvalds

      Kommentar


      • #4
        Zitat von JaMa Beitrag anzeigen
        Wenn im Konstruktor eine Exception geworfen wird, so wird die Klasse nicht instanziert, somit gibt new null zurück.
        Nö, sehe ich anders.
        Wird die Exception noch im Konstruktor gefangen, dann wird die Klasse instanziert und new liefert ein Objekt. Wird die Exception dort nicht gefangen, fliegt ihn der Code um die Ohren.
        Ich kenne nur wenige Spezialfälle, wo ein new dann NULL liefert. Dies wird aber mindestens von einer Warnung begleitet.
        Es passt so einiges nicht zusammen, was jues da berichtet. Was genau in DBx getrieben wird bleibt die spannende Frage und wie hat jues ermittelt, das die Klasse Null liefern soll?

        Kommentar


        • #5
          Klar, logisch, wenn eine Exception direkt im Constructor gecatcht wird, dass dann alles weiter funktioniert.
          Aber in der Regel catcht du ja nicht direkt in der Funktion selbst.

          Evtl. hat er einen Fehler bekommen ala "Call to a member function of null" o.ä.
          "Software is like Sex, it's best if it's free." - Linus Torvalds

          Kommentar


          • #6
            Wenn außerhalb des Konstruktors gecatcht wird, dann ist $this->db undefiniert, wenn sie nicht initialisiert wurde. So was in der Richtung vermute ich.
            Sind aber alles Spekulationen, ich warte mal ab ob sich jues nochmal meldet...

            Kommentar


            • #7
              Da es sich bei $this->db um eine Eigenschaft handelt, ist diese bereits deklariert und ist somit Standardmäßig NULL.
              "Software is like Sex, it's best if it's free." - Linus Torvalds

              Kommentar


              • #8
                Ich kenne mich in alten PHP-Versionen nicht aus, aber kann es sein, dass PHP 5.3 und Exceptions ein anderes Vehalten hatten?
                [URL="https://github.com/chrisandchris"]GitHub.com - ChrisAndChris[/URL] - [URL="https://github.com/chrisandchris/symfony-rowmapper"]RowMapper und QueryBuilder für MySQL-Datenbanken[/URL]

                Kommentar


                • #9
                  Nein

                  https://3v4l.org/UC3hs

                  Kommentar

                  Lädt...
                  X