Manu: return false im Konstruktor

Hallo zusammen,

stehe hier gerade etwas auf dem Schlauch - ein Objekt wird mit einer Id initialisiert, mit dieser id wird die db abgefragt und im fehlerfall, falls das element mit dieser id nicht gefunden wird, wird false zurückgegeben. das klappt jedoch nicht so wie gewünscht, das objekt ist trotzdem initialisiert. ich lande also nie bei header(...

Kann mir gerade jemand auf die sprünge helfen?

if ($oObj = new CObj($id)) {
 [...]
} else {
header('Location: index.php');
exit();
}

Gruß,
Manu

  1. Liebe(r) Manu,

    falls das element mit dieser id nicht gefunden wird, wird false zurückgegeben. das klappt jedoch nicht so wie gewünscht, das objekt ist trotzdem initialisiert.

    gehe immer davon aus, dass ein Objekt zurückgegeben wird! Das ist die grundsätzliche Idee eines Konstruktors. Du kannst in das Objekt aber eine Eigenschaft einbauen, die Fehlermeldungen oder -codes aufnimmt.

    Prüfe nach der Erstellung des Objektes dieses auf diese Fehlereigenschaft, bevor Du etwas mit dem Objekt anstellst. Das ist die sinnvollste Methode mit Fehlern bei Konstruktorfunktionen umzugehen.

    Ich werde diesbezüglich wohl meinen JavaScript-Artikel korrigieren müssen, wo auch ein new Boolean(false) zurückgegeben wird, anstatt dem Objekt eine Fehlereigenschaft zurückzugeben.

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:° n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Hi Felix (und Manu),

      gehe immer davon aus, dass ein Objekt zurückgegeben wird! Das ist die grundsätzliche Idee eines Konstruktors.

      der Konstruktor kann verhindern, dass das Objekt erzeugt wird, indem er eine Exception wirft. Das waere hier eine vernuenftige Loesung.

        
      try {  
            $oObj = new CObj($id)  
      } catch (Exception $construct_error) {  
      [...]  
      }  
      
      

      Viele Gruesse,
      der Bademeister

  2. Hello,

    Kann mir gerade jemand auf die sprünge helfen?

    if ($oObj = new CObj($id)) {
    [...]
    } else {
    header('Location: index.php');
    exit();
    }

    Ein Konstruktor hat keinen Rückgabewert.

    Du kannst aber eine (private) Eigenschaft des Objektes setzen lassen, ob es vernünftig initialisiert wurde. Das Objekt wird aber auf jeden Fall erzeugt, wenn die Speicherverwaltung nicht schlapp macht.

    if (!is_NULL($oObj = new CObj($id))
       {
           if ($oObj->get_error())
           {
               header('Location': http://ecample.org/index.php);
           }

    ## ...

    }

    Liebe Grüße aus dem schönen Oberharz

    Tom vom Berg

    --
    Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de
    1. Hello,

      header('Location': http://ecample.org/index.php);

      *huch* was ist da denn passiert?

      Das sollte heißen:

      header('Location: http://example.org/index.php);

      Ein Location-Header benötigt immer eine vollständige URL.
      Alle anderen Varianten funktionieren nur zufällig.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hallo Ihr zwei,

        ja klar, der fehlende Rückgabewert wars...oweia... Danke für den Hinweis...

        den kompletten Url in header() beherzige ich eigentlich, hier wars nur das manuelle entfernen :)

        Danke nochmal & Gruß,
        Manu

      2. Hi,

        Hello,

        »»            header('Location': http://ecample.org/index.php);

        *huch* was ist da denn passiert?

        Das sollte heißen:

        header('Location: http://example.org/index.php);

        Nö, sollte es nicht. ) sollte nicht unkodiert in der Url stehen.

        Und irgendwo sollte auch ein Ende des Strings sein ...

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind unverschämt, werden ignoriert. Das Forum existiert.
        1. Hello,

          »»            header('Location': http://ecample.org/index.php);

          *huch* was ist da denn passiert?

          Das sollte heißen:

          header('Location: http://example.org/index.php');

          Nö, sollte es nicht. ) sollte nicht unkodiert in der Url stehen.

          DAS war jetzt aber The Man in the Middle :-P

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hi,

            »» Nö, sollte es nicht. ) sollte nicht unkodiert in der Url stehen.

            DAS war jetzt aber The Man in the Middle :-P

            Man in the middle? Between Ireland and Great Britain?
            Ja, ist ne schöne Insel ;-)

            cu,
            Andreas

            --
            Warum nennt sich Andreas hier MudGuard?
            O o ostern ...
            Fachfragen per Mail sind unverschämt, werden ignoriert. Das Forum existiert.
            1. Hello,

              Man in the middle? Between Ireland and Great Britain?
              Ja, ist ne schöne Insel ;-)

              Gehört die auch noch zu den steuerbegünstigten Inseln?

              Liebe Grüße aus dem schönen Oberharz

              Tom vom Berg

              --
              Nur selber lernen macht schlau
              http://bergpost.annerschbarrich.de
    2. echo $begrüßung;

      Ergänzend:

      Ein Konstruktor hat keinen Rückgabewert.

      Jedenfalls nicht mehr. Wenn ich mich recht erinnere, konnte man bei PHP 4 den Konstruktor mit return was anderes liefern lassen. PHP 5 macht das aber nicht mehr mit.

      Du kannst aber eine (private) Eigenschaft des Objektes setzen lassen, ob es vernünftig initialisiert wurde.

      Das halte ich nicht für eine besonders gute Idee, zumal es mit der Exception oder dem Factory- respektive Singleton-Pattern Möglichkeiten gibt, bei der am Ende kein "unvernünftiges" Objekt entsteht.

      echo "$verabschiedung $name";

      1. Hello,

        Ein Konstruktor hat keinen Rückgabewert.

        Jedenfalls nicht mehr. Wenn ich mich recht erinnere, konnte man bei PHP 4 den Konstruktor mit return was anderes liefern lassen. PHP 5 macht das aber nicht mehr mit.

        Das ist (war) nun sicherlich wieder eine Besonderheit von PHP und anderen Sprachen, die mit varianten Typen umgehen können. Wäre schon lustig, wenn eine OOP-Hochsprache dies zulassen würde, also einen beliebigen Wert anstelle einer Referenz auf das instantiierte Objekt zurückzugeben.

        Du kannst aber eine (private) Eigenschaft des Objektes setzen lassen, ob es vernünftig initialisiert wurde.

        Das halte ich nicht für eine besonders gute Idee, zumal es mit der Exception oder dem Factory- respektive Singleton-Pattern Möglichkeiten gibt, bei der am Ende kein "unvernünftiges" Objekt entsteht.

        Das kommt doch darauf an, was die automatisch vom Konstruktor aufgerufene run()-Methode (oder wie auch immer man sie nennt) des Objektes veranstaltet. Die Initialisierung sollte doch auf jeden Fall erstmal ordnungsgemäß stattfinden.

        Und wie man ein Objekt dann intern gegen Fehlbedienung absichert, ist auch nicht direkt daran gekoppelt, ob man es überhaupt erzeugen kann oder nicht.

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. Und wie man ein Objekt dann intern gegen Fehlbedienung absichert, ist auch nicht direkt daran gekoppelt, ob man es überhaupt erzeugen kann oder nicht.

          Das ist richtig. Nur würde ich persönlich mir hier die Frage stellen ob ich das Objekt überhaupt erzeugen *will*, wenn ich später sowieso nichts damit anfangen kann ;-)

          1. Hello,

            Und wie man ein Objekt dann intern gegen Fehlbedienung absichert, ist auch nicht direkt daran gekoppelt, ob man es überhaupt erzeugen kann oder nicht.
            Das ist richtig. Nur würde ich persönlich mir hier die Frage stellen ob ich das Objekt überhaupt erzeugen *will*, wenn ich später sowieso nichts damit anfangen kann ;-)

            Es ist ja nicht gesagt, dass die Voraussetzungen für eine sinnvolle Benutzung sich nicht nachholen lassen. Nur bei sehr einfachen Objekten würde ich glcieh mit einer Exception und der Ablehnung der Instatiierung reagieren.

            Aber stell Dir mal vor, ein Objekt muss für die Funktionstüchtigkeit mehrere Ressourcen anfordern und sichern. Von sieben bekommt es nur fünf. Zwei sind im Instantiierungszeitpunkt noch belegt.

            Nun könnte es sinnvoll sein, die fünf anderen für einen kurzen Moment festzuhalten und die beiden anderen nachträglich zu holen. Das Programm kann aber zwischendurch noch andere Dinge erledigen und muss nicht stumpf mit Nichtstun auf die Freigabe warten.

            In Multithreading-Umgebungen hat man das mMn öfter. Ich kenne die AUfgabenstellung noch aus der grauen Vergangenheit.

            Da hat man aber noch in (hauptsächlich) singlesthreadorientierten Umgebungen mit Joblists gearbeitet. War ein Job derzeit nicht erfüllbar, wurde ein kleinerer untergeordneter zwischengeschoben.

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

            --
            Nur selber lernen macht schlau
            http://bergpost.annerschbarrich.de
  3. Andere Idee:
    Ruf statt dem Konstruktor eine statische Methode der Klasse auf, die zuerst die Daten prüft und dann entweder ein verwendbares Objekt zurück liefert, oder nichts.
    Beim Aufruf siehst du dann was passiert ist.