Manfred: Muss man, oder muss man nicht ? Notice: Undefined variable:

Ich habe eine Rechnung in PHP

$berechnung1=0+$ergebniss_1+$ergebniss_2+$ergebniss_3;

Wenn z.b. der Wert $ergebniss_2 nicht existiert bekommt man

Notice: Undefined variable:

Die Rechnung wird trotzdem ausgeführt. Muss ich die Var $ergebniss_2 vorher löschen, bevor ich die Rechnung durchführen, oder kann ich das vernachlässigen?

  1. Hello,

    Ich habe eine Rechnung in PHP

    $berechnung1=0+$ergebniss_1+$ergebniss_2+$ergebniss_3;

    Wenn z.b. der Wert $ergebniss_2 nicht existiert bekommt man

    Notice: Undefined variable:

    Die Rechnung wird trotzdem ausgeführt. Muss ich die Var $ergebniss_2 vorher löschen, bevor ich die Rechnung durchführen, oder kann ich das vernachlässigen?

    "Ergebnis" schreibt man mit einem "s" ;-)

    Und wenn Du die Variablen vor der Benutzung anlegst und initialisierst, und dies nicht PHP überlässt, tritt dieser Fehler nicht auf.

    Bequemlichkeit war noch nie ein guter Ratgeber für die Programmierung :-O

    Glück Auf
    Tom vom Berg

    --
    Es gibt nichts Gutes, außer man tut es!
    Das Leben selbst ist der Sinn.
    1. @@TS

      "Ergebnis" schreibt man mit einem "s" ;-)

      Zwei Ergebnisse schreibt man mit zwei s.
      Und drei Ergebnissse?

      Bequemlichkeit war noch nie ein guter Ratgeber für die Programmierung :-O

      Das würde ich so nicht sagen. Warum dupliziert man mehrfach benötigten Code nicht einfach, sondert packt ihn in eine Funktion o.ä.? Aus Bequemlichkeit. Und das ist auch gut so.

      Die Bequemlichkeit des Programmierers darf nur nicht über der user experience stehen.

      LLAP 🖖

      --
      Wenn der Faschismus wiederkommt, wird er nicht sagen: Hallo, ich bin der Faschismus! Sondern er wird sagen: Ich nehme die Wahl an.
      1. Hello,

        @@TS

        "Ergebnis" schreibt man mit einem "s" ;-)

        Zwei Ergebnisse schreibt man mit zwei s.
        Und drei Ergebnissse?

        Bequemlichkeit war noch nie ein guter Ratgeber für die Programmierung :-O

        Das würde ich so nicht sagen. Warum dupliziert man mehrfach benötigten Code nicht einfach, sondert packt ihn in eine Funktion o.ä.? Aus Bequemlichkeit. Und das ist auch gut so.

        Die Bequemlichkeit des Programmierers darf nur nicht über der user experience stehen.

        Das ist jetzt höhere Philosophie.

        Ich würde Copy & Paste als bequemes Verhalten ansehen, wohingegen die Gestaltung einer wiederverwendbaren Funktion schon etwas mehr Arbeit und Nachdenken erfordert.

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Ich würde Copy & Paste als bequemes Verhalten ansehen,

          Ber nur so lange Du den kopierten Teil des Textes nicht veränderst... Sonst nochmal c&p oder aber s&r. Macht ab dem dritten Mal keinen Spaß…

    2. Hej TS,

      Bequemlichkeit war noch nie ein guter Ratgeber für die Programmierung :-O

      Sehe ich anders. Ich denke, dass viele gute Ideen dem Wunsch entspringen, sich etwas einfacher machen zu wollen. Auch wenn der Weg dahin nicht immer leicht ist und Anstrengung voraussetzt, ist die zu erwartende Bequemlichkeit womöglich die entscheidende Motivation etwas zu tun.

      Äh - war das jetzt verständlich? - Ist auch nicht wirklich ein Widerspruch…

      Marc (marctrix)

      --
      Ceterum censeo Google esse delendam
      1. Hallo,

        Bequemlichkeit war noch nie ein guter Ratgeber für die Programmierung :-O

        Sehe ich anders. Ich denke, dass viele gute Ideen dem Wunsch entspringen, sich etwas einfacher machen zu wollen.

        ja, das ist eine Ausprägung der These: Die meisten genialen Erfindungen entsehen aus Faulheit.[1]

        Auch wenn der Weg dahin nicht immer leicht ist und Anstrengung voraussetzt, ist die zu erwartende Bequemlichkeit womöglich die entscheidende Motivation etwas zu tun.

        Wie in der Chemie: Es braucht für viele Reaktionen eine gewisse Aktivierungsenergie. Aber wenn's dann mal läuft ... hui!

        Äh - war das jetzt verständlich?

        Beim zweiten Lesen: Ja.

        Ciao,
         Martin

        --
        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.

        1. Manchmal auch durch puren Zufall. ↩︎

      2. Hello,

        damit es bei der Anwendung bequemer wird ohne dabei unsicherer zu werden, muss man sich bei der Programmierung besonders anstrengen.

        Aber ich denke, Du hast das schon so verstanden ;-)

        Glück Auf
        Tom vom Berg

        --
        Es gibt nichts Gutes, außer man tut es!
        Das Leben selbst ist der Sinn.
        1. Hej TS,

          Aber ich denke, Du hast das schon so verstanden ;-)

          Yo. Wie gesagt, es war nicht wirklich ein widersprechen… - eher eine Ergänzung.

          Marc (marctrix)

          --
          Ceterum censeo Google esse delendam
  2. Hallo,

    $berechnung1=0+$ergebniss_1+$ergebniss_2+$ergebniss_3;
    

    Wenn z.b. der Wert $ergebniss_2 nicht existiert bekommt man
    Notice: Undefined variable:

    Die Rechnung wird trotzdem ausgeführt.

    ja, PHP ist gnädig und legt eine noch nicht existierende Variable an, wenn man versucht, sie zu benutzen. Sie hat dann einen Null-Wert.

    Abgesehen davon: Warum beginnst du das Aufsummieren mit der Konstante 0? Du kannst deine Nissen doch direkt addieren.

    Muss ich die Var $ergebniss_2 vorher löschen, bevor ich die Rechnung durchführen, oder kann ich das vernachlässigen?

    Nicht löschen - im Gegenteil, du solltest sie definieren. Dann ist auch die Notice weg.

    Zur Schreibweise siehe Posting von TS.

    So long,
     Martin

    --
    Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
    1. Tach!

      ja, PHP ist gnädig und legt eine noch nicht existierende Variable an, wenn man versucht, sie zu benutzen. Sie hat dann einen Null-Wert.

      Jein. Bei Schreibzugriffen wird sie angelegt, mit dem Wert, der ihr zugewiesen wurde. Bei Lesezugriffen wird nichts angelegt, aber als Ergebnis des Zugriffsversuchs wird Null zurückgegeben.

      Abgesehen davon: Warum beginnst du das Aufsummieren mit der Konstante 0?

      Literal, keine Konstante. Abgesehen davon ist das eine Methode, den numerischen Modus zu erzwingen. Würde bei Javascript helfen, aber da PHP für Addition und Stringverknüpfung unterschiedliche Operatoren nimmt, wird hier sowieso eine Addition ausgeführt und dazu die Variableninhalte als Zahl zu interpretieren versucht. Das 0 + kann man also hier getrost weglassen.

      dedlfix.

      1. Hallo,

        ja, PHP ist gnädig und legt eine noch nicht existierende Variable an, wenn man versucht, sie zu benutzen. Sie hat dann einen Null-Wert.

        Jein. Bei Schreibzugriffen wird sie angelegt, mit dem Wert, der ihr zugewiesen wurde. Bei Lesezugriffen wird nichts angelegt, aber als Ergebnis des Zugriffsversuchs wird Null zurückgegeben.

        ah, so konkret war mir das nicht klar. Ich dachte, der "Fehler" beim Zugriff reichte schon als Trigger, die Variable dann auch anzulegen.

        Abgesehen davon: Warum beginnst du das Aufsummieren mit der Konstante 0?

        Literal, keine Konstante.

        Beides. Ich nehme an, du zielst auf die Abgrenzung zu benannten (symbolischen) Konstanten ab. Aber ob literal oder symbolisch: Beide sind Konstanten, also feste, zur Laufzeit unveränderliche Werte.

        Abgesehen davon ist das eine Methode, den numerischen Modus zu erzwingen. Würde bei Javascript helfen, aber da PHP für Addition und Stringverknüpfung unterschiedliche Operatoren nimmt, wird hier sowieso eine Addition ausgeführt und dazu die Variableninhalte als Zahl zu interpretieren versucht. Das 0 + kann man also hier getrost weglassen.

        Dieser Gedanke kam mir auch, aber mit genau derselben Begründung habe ich das dann als unnötig eingestuft.

        Ciao,
         Martin

        --
        Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
        1. Tach!

          Bei Lesezugriffen wird nichts angelegt, aber als Ergebnis des Zugriffsversuchs wird Null zurückgegeben.

          ah, so konkret war mir das nicht klar. Ich dachte, der "Fehler" beim Zugriff reichte schon als Trigger, die Variable dann auch anzulegen.

          Nein, man kann sie so oft lesen, wie man mag, und bekommt immer wieder die Notice.

          Abgesehen davon: Warum beginnst du das Aufsummieren mit der Konstante 0?

          Literal, keine Konstante.

          Beides. Ich nehme an, du zielst auf die Abgrenzung zu benannten (symbolischen) Konstanten ab. Aber ob literal oder symbolisch: Beide sind Konstanten, also feste, zur Laufzeit unveränderliche Werte.

          Ja, dass ein Literal und eine Konstante jeweils unveränderliche Werte haben, ist ihre Gemeinsamkeit. Man darf das aber durchaus namentlich und funktional auseinanderhalten, der Compiler tut es ja auch. Ein Literal steht immer wieder neu im Kompilat, wann immer es auftaucht, eine Konstante wird nur einmal angelegt und dann immer wiederverwendet.

          dedlfix.

          1. Hallo,

            Ja, dass ein Literal und eine Konstante jeweils unveränderliche Werte haben, ist ihre Gemeinsamkeit. Man darf das aber durchaus namentlich und funktional auseinanderhalten, der Compiler tut es ja auch.

            tut er das wirklich? Ein typischer C-Compiler tut das beispielsweise nicht. Definiere ich da zum Beispiel einen Satz von Konstanten:

            enum
             { cRED   = 0xFF0000,
               cGREEN = 0x00FF00,
               cBLUE  = 0x0000FF
             };
            

            Wo immer ich im weiteren Quellcode eine dieser drei Konstanten verwende, setzt der Compiler direkt den zugehörigen Wert ein, so als ob er als Literal im Code stünde.
            Dasselbe passiert übrigens auch, wenn ich die Konstanten mit der Präprozesser-Direktive #define definiere. Wichtiger Unterschied: Bei der Definition mit enum bleiben die symbolischen Namen zumindest in den Debug-Informationen erhalten, bei #define nicht.

            Ein Literal steht immer wieder neu im Kompilat, wann immer es auftaucht, eine Konstante wird nur einmal angelegt und dann immer wiederverwendet.

            Ich gehe eigentlich davon aus, dass eine benannte Konstante überhaupt nirgends abgelegt wird, sondern vom Compiler überall dort in den Code eingesetzt wird, wo sie auftaucht.
            Und damit wäre der einzige Unterschied zwischen einem Literal und einer benannten Konstanten, dass letztere nur einmal zentral definiert und dann an beliebig vielen Stellen genutzt werden kann, während man Literal-Konstanten an jeder Verwendungsstelle einzeln pflegen muss.

            Ciao,
             Martin

            --
            Ich stamme aus Ironien, einem Land am sarkastischen Ozean.
            1. Hallo Martin,

              Ich gehe eigentlich davon aus, dass eine benannte Konstante überhaupt nirgends abgelegt wird, sondern vom Compiler überall dort in den Code eingesetzt wird, wo sie auftaucht.

              Das hängt von Programmiersprache, Compiler und Konstante ab.

              Eine 32-bit Integer-Konstante 0xdeadbeef lässt sich im x86- und x64-Assembler effizient in den Objectcode einbauen. Bei 6502-Assembler dagegen könnte schon ein LDX mit der Adresse der 32-bit Integerkonstante und ein CALL auf die add32-Subroutine besser sein.

              Eine double-Konstante 1004.2 könnte aber auch auf einem 64-bit Prozessor effizienter im .data Bereich liegen.

              Eine String-Konstante "To boldly go where no man has gone before" dagegen wird immer im .data Bereich liegen und der Compiler setzt nur eine Referenz darauf ein.

              Rolf

              --
              sumpsi - posui - obstruxi
            2. Tach!

              Ja, dass ein Literal und eine Konstante jeweils unveränderliche Werte haben, ist ihre Gemeinsamkeit. Man darf das aber durchaus namentlich und funktional auseinanderhalten, der Compiler tut es ja auch.

              tut er das wirklich? Ein typischer C-Compiler tut das beispielsweise nicht.

              Hmm, sieht auch bei C# so aus. Da habe ich wohl const und readonly zusammengeworfen. readonly wird erst zur Laufzeit berechnet und wird dann wie eine Variable behandelt, ist also nur ein Vorkommen.

              Ein Literal steht immer wieder neu im Kompilat, wann immer es auftaucht, eine Konstante wird nur einmal angelegt und dann immer wiederverwendet.

              Ich gehe eigentlich davon aus, dass eine benannte Konstante überhaupt nirgends abgelegt wird, sondern vom Compiler überall dort in den Code eingesetzt wird, wo sie auftaucht.

              PHP hat mittlerweile zwei Varianten: const und define. Da define zur Laufzeit berechnet wird, kann das nur ähnlich einer Variable verwendet werden. Mit const definiert kann der Wert direkt verwendet werden.

              Und damit wäre der einzige Unterschied zwischen einem Literal und einer benannten Konstanten, dass letztere nur einmal zentral definiert und dann an beliebig vielen Stellen genutzt werden kann, während man Literal-Konstanten an jeder Verwendungsstelle einzeln pflegen muss.

              Vor allem kann man sich sicher sein, dass bei der Verwendung von Konstanten die Werte dieselbe Bedeutung haben. Ein sprehcnder Name hilft beim Verstehen. Einem Literal sieht man das nicht an, ob zwei gleiche Literale dieselbe Bedeutung haben.

              Letztlich ist es mir als Programmierer der Hochsprache meist egal, was der Compiler draus macht. Ich würde er trotzdem sprachlich auseinanderhalten wollen.

              const newline = "\n";

              "Die Konstante newline wird mit der Konstante "\n" initialisiert" klingt seltsam. Inhaltlich besser: "Die Konstante newline wird mit dem Zeichen NL initialisiert, das als Literal "\n" zu notieren ist." (Kann man sicher sprachlich schöner formuieren.)

              dedlfix.

  3. Muss ich die Var $ergebniss_2 vorher löschen, bevor ich die Rechnung durchführen, oder kann ich das vernachlässigen?

    Nein, Du musst sollst diese anlegen. Grund:

    Wenn Du das missachtest, dann weisst Du nicht, ob die als nicht definiert gemeldete Variable $ergebniss_2 ein Tippfehler oder die Folge des Programmablaufs ist.

    Du wirst also viel Spaß bei der Fehlersuche haben.

    Bei PHP bist Du verantwortlich. Also entweder initialisierst Du die Variable - oder aber Du musst damit leben, dass Du Dir irgendwann selbst den Quelltext 100x ausdruckst, fest zusammenrollst und Dir dann selbst um die Ohren haust.