Encoderhi : PHP mit etwas mehr Struktur

Hallo

Nach einigem rumspielen mit PHP frage ich mich, ob man in PHP irgendwas umschalten kann, so dass das Handling von Variablennamen etwas strukturierter verläuft. Damit meine ich dass z.B. eine Variable in irgendeiner Art deklariert werden muss bevor man sie verwendet. So wie man es aus anderen Sprachen kennt. Oder dass eine Variable nicht über Funktionen hinweg einfach existiert, sondern dass Funktionsgrenzen eingehalten werden.

Das wäre um einiges weniger fehler-freundlich als das was ich bisher mache, d.h. mittels trial und error herausfinden dass ich irgendwas falsch geschrieben habe, oder dass ich eine schon für einen anderen Zweck gedachte Variable versehentlich überschreibe.
Gibts da was nettes?

  1. Salve

    Gibts da was nettes?

    Leider nein. Das ist die große Stärke und gleichzeitig Schwäche von PHP.
    Aber meines Wissens nach gelten auch bei PHP Gültigkeitsbereiche. Ich hatte da noch nie Probleme.

    --
    sh:( fo:| ch:? rl:( br:> n4:? ie:{ mo:) va:) js:| de:> zu:} fl:| ss:) ls:[  
  2. Hi,

    Nach einigem rumspielen mit PHP frage ich mich, ob man in PHP irgendwas umschalten kann, so dass das Handling von Variablennamen etwas strukturierter verläuft.

    naja, etwas schlampig und oberflächlich ist PHP von Natur aus schon, das finde ich auch: Keine Deklarationspflicht für Variablen, keine konsequente Unterscheidung von Groß/Kleinschreibung. Aber wenn man sich mit diesen Dingen etwas arrangieren kann ...

    Damit meine ich dass z.B. eine Variable in irgendeiner Art deklariert werden muss bevor man sie verwendet.

    Muss man nicht. Aber wenn man das error_reporting auf E_ALL stellt (was in der Entwicklungsphase unbedingt zu empfehlen ist), dann bekommt man wenigstens eine Notice, wenn man auf undefinierte Variablen oder Objekt-Eigenschaften zugreift.

    Oder dass eine Variable nicht über Funktionen hinweg einfach existiert, sondern dass Funktionsgrenzen eingehalten werden.

    Das ist eigentlich automatisch so. Sogar noch konsequenter, als in manchen anderen Sprachen (C, Javascript): Selbst global definierte Variablen sind ohne ausdrücklichen Wunsch des Programmierers innerhalb einer Funktion nicht sichtbar - in vielen anderen Programmiersprachen werden Scopes (Gültigkeitsbereiche) immerhin von außen nach innen "vererbt".

    Das wäre um einiges weniger fehler-freundlich als das was ich bisher mache, d.h. mittels trial und error herausfinden dass ich irgendwas falsch geschrieben habe, oder dass ich eine schon für einen anderen Zweck gedachte Variable versehentlich überschreibe.

    Gegen das versehentliche Überschreiben von Variablen kann dich keine noch so raffinierte Einrichtung schützen - woher soll ein Debugger wissen, ob das Schreiben eines Variablenwerts an dieser Stelle Absicht oder Versehen ist?

    Gibts da was nettes?

    Ja: Eiserne Disziplin. Sorry, etwas besseres kenne ich für PHP auch nicht.

    So long,
     Martin

    --
    Wenn die Amerikaner eines Tages von jeder Tierart ein Pärchen nach Cape Canaveral treiben ...
    ja, DANN sollte man endlich misstrauisch werden.
    1. Hello,

      Muss man nicht. Aber wenn man das error_reporting auf E_ALL stellt (was in der Entwicklungsphase unbedingt zu empfehlen ist), dann bekommt man wenigstens eine Notice, wenn man auf undefinierte Variablen oder Objekt-Eigenschaften zugreift.

      Aber nur auf der rechten Seite vom Zuweisungsoperator. :-(

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

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

        »» Aber wenn man das error_reporting auf E_ALL stellt (was in der Entwicklungsphase unbedingt zu empfehlen ist), dann bekommt man wenigstens eine Notice, wenn man auf undefinierte Variablen oder Objekt-Eigenschaften zugreift.
        Aber nur auf der rechten Seite vom Zuweisungsoperator. :-(

        logisch - sonst stellt ja ebendiese Anweisung die Definition (=Deklaration einschließlich Wertzuweisung) dar.

        Ciao,
         Martin

        --
        PCMCIA: People Can't Memorize Computer Industry Acronyms
      2. Aber nur auf der rechten Seite vom Zuweisungsoperator. :-(

        Das reicht doch schon. Wenn links was undefiniertes steht und ein Fehler käme, dann könnte man ja einer bisher nicht definierten Variable nie was zuweisen.
        Oder wie meinst du das?

        1. Hello,

          Aber nur auf der rechten Seite vom Zuweisungsoperator. :-(
          Das reicht doch schon. Wenn links was undefiniertes steht und ein Fehler käme, dann könnte man ja einer bisher nicht definierten Variable nie was zuweisen.
          Oder wie meinst du das?

          Ich meine, dass es gerade durch die Eingeschaft von PHP geht, Variablen implizit zu deklarieren, also durch erste Belegung mit einem Wert. Da merkt man dann nicht, wenn man sich verschreiben hat, weil einfach eine neue Variable angelegt wird.

          Beispiel

          $text = "PHP ist eine Schweinesprache";
              $test = str_replace('Schweinesprache', 'bequeme Sprache', $text);

          echo $text;

          *huch*, wieso hat sich denn $text nicht wie gewünscht geändert? Ist die Funktion str_replace() kaputt?

          Solche oder ähnliche Äußerungen kommen dann i.d.R. hier im Forum.

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

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

            Beispiel

            $text = "PHP ist eine Schweinesprache";
                $test = str_replace('Schweinesprache', 'bequeme Sprache', $text);

            echo $text;

            *huch*, wieso hat sich denn $text nicht wie gewünscht geändert? Ist die Funktion str_replace() kaputt?

            Das mag jetzt peinlich sein, aber wieso funktioniert das nicht?
            Habs jetzt nicht getestet, aber wenn du das extra als Beispiel bringst wird es wohl stimmen.

            Auf den ersten Blick sieht es für mich grad logisch aus.

            Danke und Grüße, Matze

            1. Hallo,

              »»     $text = "PHP ist eine Schweinesprache";
              »»     $test = str_replace('Schweinesprache', 'bequeme Sprache', $text);
              »»     echo $text;

              Das mag jetzt peinlich sein, aber wieso funktioniert das nicht?

              achte auf die Schreibweise: $text vs. $test

              Ciao,
               Martin

              --
              Um die Wahrheit zu erfahren, muss man den Menschen widersprechen.
                (George Bernhard Shaw)
              1. Hallo,

                »» »»     $text = "PHP ist eine Schweinesprache";
                »» »»     $test = str_replace('Schweinesprache', 'bequeme Sprache', $text);
                »» »»     echo $text;

                »» Das mag jetzt peinlich sein, aber wieso funktioniert das nicht?

                achte auf die Schreibweise: $text vs. $test

                Hab ich, aber der Inhalt sollte doch übergeben werden, oder nicht? Und wenn nicht, warum nicht?

                Es geht doch auch

                $foo = "Hund";  
                $bar = substr($foo, 1, 4);  
                $foobar = "Katze";  
                echo $foo." ".$bar." ".$foobar;  
                // Ergebnis "Hund und Katze"
                

                Grüße, Matze

                1. Hi Matze,

                  »» »» »»     $text = "PHP ist eine Schweinesprache";
                  »» »» »»     $test = str_replace('Schweinesprache', 'bequeme Sprache', $text);
                  »» »» »»     echo $text;
                  »» achte auf die Schreibweise: $text vs. $test
                  Hab ich, aber der Inhalt sollte doch übergeben werden, oder nicht?

                  welcher Inhalt, und wohin übergeben?
                  Hier ist ein Code-Schnipsel, der in $text einen String speichert. Dann wird eine Ersetzung mit str_replace() durchgeführt, das Ergebnis $test (Tippfehler!) zugewiesen. Und zum Schluss wird $text ausgegeben - diese Variable ist natürlich wegen des Tippfehlers immer noch unverändert, was den unaufmerksamen Programmierer wundert.

                  Es geht doch auch

                  $foo = "Hund";

                  $bar = substr($foo, 1, 4);
                  $foobar = "Katze";
                  echo $foo." ".$bar." ".$foobar;
                  // Ergebnis "Hund und Katze"

                    
                  Natürlich geht das - aber was hat das mit Toms Beispiel zu tun?  
                    
                  So long,  
                   Martin  
                  
                  -- 
                  Wer morgens zerknittert aufsteht, hat den ganzen Tag Gelegenheit, sich zu entfalten.
                  
                  1. Hallo Martin,

                    arg... ich hatte "echo $teSt;" gelesen.
                    Ich dachte es ging um die zweite Zeile lol...

                    Sry.

                    Grüße, Matze

                    1. Hello,

                      arg... ich hatte "echo $teSt;" gelesen.
                      Ich dachte es ging um die zweite Zeile lol...

                      Dieses Mal hatte ich mir auch ganz besonders viel Mühe gegeben, den Schreibfehler an der richtigen[tm] Stelle zu machen ;-)

                      Wenn PHP nun keine implizite Deklaration vür Variablen hätte, oder diese abschaltbar wäre, dann hätte man das Versehen vermutlich gemerkt, wenn nicht $test schon an einer anderen Stelle ebenfalls als Stringtyp deklariert worden ist. Aber sowas sollte im Zeitalter der Zerlegung von Massencode in kleine übersichtliche Funktionen oder Methoden nicht wahrscheinlich sein.

                      Liebe Grüße aus dem schönen Oberharz

                      Tom vom Berg

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

      naja, etwas schlampig und oberflächlich ist PHP von Natur aus schon, das finde ich auch: Keine Deklarationspflicht für Variablen, keine konsequente Unterscheidung von Groß/Kleinschreibung. Aber wenn man sich mit diesen Dingen etwas arrangieren kann ...

      Niemals!!!111 Nein, nein und nochmals nein, nicht mit mir!11! Da bleib ich bei meinen Kamelen und dem wunderschönen camelCode ;-)

      SCNR;
      Hotti

      --
      use strict; # Nur für Müslifresser
      1. Hallo,

        »» naja, etwas schlampig und oberflächlich ist PHP von Natur aus schon, das finde ich auch: Keine Deklarationspflicht für Variablen, keine konsequente Unterscheidung von Groß/Kleinschreibung. Aber wenn man sich mit diesen Dingen etwas arrangieren kann ...
        Niemals!!!111 Nein, nein und nochmals nein, nicht mit mir!11! Da bleib ich bei meinen Kamelen und dem wunderschönen camelCode ;-)

        kannst du doch gern tun, PHP kümmert sich schließlich nicht um solche Details - zumindest nicht bei Funktionsnamen. Bei Variablen AFAIK schon, aber da hast du es ja selbst in der Hand.
        Und nebenbei: Wenn schon CamelCode, dann soll das Kamel bitte auch auf dem Anfangsbuchstaben einen Höcker haben, sonst sieht das irgendwie doof aus.

        Ciao,
         Martin

        --
        Ordnung ist, wenn man etwas findet, was man gar nicht sucht.