Hans: Abfragen von Variablen

Hallo,

ich habe eine grundsätzliche Frage zum korrekten Abfragen einer Variable:

ich habe eine Anwendung gebaut, wobei in jeder PHP-Datei ein Konfigurationsfile includiert ist:

//Basic configuration
require_once("config/config.php");

//Passwort-Schutz
if($clientsafe == true){
include('inc/logauth.inc.php');
}

Die Variable "$clientsafe" ist in der Datei "config.php" definiert.
Wenn die Variable auf true steht, bekommt die Datei einen Passwortschutz.
Ist das ein schlechter Stil oder muß ich auch immer abfragen, ob die Variable überhaupt definiert wurde?

Gruß
Hans

  1. Ist das ein schlechter Stil oder muß ich auch immer abfragen, ob die Variable überhaupt definiert wurde?

    Du solltest hierfür mit Konstanten arbeiten.

    Prinzipiell musst du in PHP aber nicht prüfen, ob eine Variable existiert oder nicht.

    1. echo $begrüßung;

      » Ist das ein schlechter Stil oder muß ich auch immer abfragen, ob die Variable überhaupt definiert wurde?

      Schlechter Stil ist es, einen boolschen Variableninhalt oder ein Ausdrucksergebnis gegen einen der boolschen Werte true/false zu testen. "Ist es wahr, dass $variable wahr ist?" wird nicht wahrer.

      Die Funktion empty() testet sowohl auf Vorhandensein als auch auf Inhalt. Ein false entspricht dabei "leer".

      Prinzipiell musst du in PHP aber nicht prüfen, ob eine Variable existiert oder nicht.

      Das sollte man aber. Am besten beim Entwickeln das error_reporting auf E_ALL stellen, dann bekommt man solche und andere Nicht-Initialisierungs-Sünden angezeigt.
      Bei selbst erstellten Variablen ist es jedoch problemlos möglich, selbige mit einem definierten Anfangswert zu versehen, so dass sich die Ausgangsfrage gar nicht mehr stellt.

      echo "$verabschiedung $name";

      1. Hi,

        Bei selbst erstellten Variablen ist es jedoch problemlos möglich, selbige mit einem definierten Anfangswert zu versehen, so dass sich die Ausgangsfrage gar nicht mehr stellt.

        Darauf zielte die Frage nach meinem Verständnis wohl.
        Klar prüft man da nicht - da würde man ja meschigge bei werden.

        Prüfen sollte man aber bei Werten, deren Vorhandensein man nicht selber im Script sichergestellt hat (/kann) - also bspw. bei von aussen kommenden Parametern, die in $_POST/$_GET/$_COOKIE bereitgestellt werden.

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
        1. echo $begrüßung;

          » Bei selbst erstellten Variablen ist es jedoch problemlos möglich, selbige mit einem definierten Anfangswert zu versehen, so dass sich die Ausgangsfrage gar nicht mehr stellt.

          Darauf zielte die Frage nach meinem Verständnis wohl.
          Klar prüft man da nicht - da würde man ja meschigge bei werden.

          Ich befürchtete eher, dass die Variable nur im Passwortschutz-Fall gesetzt wird und ansonsten nicht.

          if (Passwortschutz nötig)
              $clientsafe = true;

          Auch ein switch-Konstrukt wäre wahrscheinlich.

          Das kann man besser machen:

          $clientsafe = false;
            if (Passwortschutz nötig)
              $clientsafe = true;

          Oder eben mit switch-Konstrukt. Wichtig ist, dass vorher eine unbedingte Initialisierung stattfindet.

          Die Variante

          $clientsafe = Bedingung;

          wird vermutlich nicht möglich sein, weil anzunehmenderweise die Bedingung, welche Dateien zu schützen sind, komplexer als ein Einzeiler formuliert werden muss.

          Prüfen sollte man aber bei Werten, deren Vorhandensein man nicht selber im Script sichergestellt hat (/kann) - also bspw. bei von aussen kommenden Parametern, die in $_POST/$_GET/$_COOKIE bereitgestellt werden.

          Danke für die Ergänzung, das wollte ich noch erwähnen, hab es dann aber doch vergessen.

          echo "$verabschiedung $name";

      2. Hello,

        Schlechter Stil ist es, einen boolschen Variableninhalt oder ein Ausdrucksergebnis gegen einen der boolschen Werte true/false zu testen. "Ist es wahr, dass $variable wahr ist?" wird nicht wahrer.

        Das mag für viele andere Programmiersprachen gelten.
        In PHP wird der Vergleich durchaus "wahrer", wenn man gegen false testet.

        if ( $variable )

        contra

        if ( $variable === true )

        Es ist mir klar, dass Du diesen Widerspruch nur provozieren wolltest ;-)
        Bitteschöööön!

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

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

          » Schlechter Stil ist es, einen boolschen Variableninhalt oder ein Ausdrucksergebnis gegen einen der boolschen Werte true/false zu testen. "Ist es wahr, dass $variable wahr ist?" wird nicht wahrer.

          Das mag für viele andere Programmiersprachen gelten.
          In PHP wird der Vergleich durchaus "wahrer", wenn man gegen false testet.

          if ( $variable )

          contra

          if ( $variable === true )

          Es ist mir klar, dass Du diesen Widerspruch nur provozieren wolltest ;-)

          Das widerspricht meiner Aussage doch nicht, denn ich sprach nur von boolschem Inhalt. Den Fall mit dem Eindeutigkeitsoperator braucht man, wenn man neben boolschem Variableninhalt auch noch anderen erwartet und eine Eindeutigkeit benötigt. 0 == false aber 0 !== false.

          echo "$verabschiedung $name";

          1. Hello,

            » Schlechter Stil ist es, einen boolschen Variableninhalt oder ein Ausdrucksergebnis gegen einen der boolschen Werte true/false zu testen. "Ist es wahr, dass $variable wahr ist?" wird nicht wahrer.

            Das mag für viele andere Programmiersprachen gelten.
            In PHP wird der Vergleich durchaus "wahrer", wenn man gegen false testet.

            if ( $variable )

            contra

            if ( $variable === true )

            Es ist mir klar, dass Du diesen Widerspruch nur provozieren wolltest ;-)

            Das widerspricht meiner Aussage doch nicht, denn ich sprach nur von boolschem Inhalt. Den Fall mit dem Eindeutigkeitsoperator braucht man, wenn man neben boolschem Variableninhalt auch noch anderen erwartet und eine Eindeutigkeit benötigt. 0 == false aber 0 !== false.

            Ich müsste jetzt für Dich zitieren, was Globe neulich mir geschrieben hat :-)

            Da PHP nur eine lose Typbindung für seine Variablen kennt, ist es gerade wichtig bei booleschen Inhalten, dass man sich erst einmal davon überzeugt, dass die Variable denn auch noch den booleschen Typ hat oder die Funktion ein boolesches und _kein_ numerisches Ergenis liefert.

            Bsp.:

            if( !stripos('Hallo Welt, du bist so schön','hallo'))   ## falsch, weil Typ nicht geprüft wurde
                {
                    echo 'Scheiß Welt!';
                }
                else
                {
                    echo "Ach, wie geht's uns gut";
                }

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

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

              Ich müsste jetzt für Dich zitieren, was Globe neulich mir geschrieben hat :-)

              Nein, musst du nicht, denn im vorliegenden Fall geht es reinweg um boolsche Inhalte. Ein anderer ist nicht vorgesehen und so kann auch eine eventuelle 0 nicht mit false verwechselt werden. Bring doch lieber dein Argument da an, wo es hinpasst, beispielsweise zu strpos().

              echo "$verabschiedung $name";

              1. Hello,

                Ich müsste jetzt für Dich zitieren, was Globe neulich mir geschrieben hat :-)

                Nein, musst du nicht, denn im vorliegenden Fall geht es reinweg um boolsche Inhalte. Ein anderer ist nicht vorgesehen und so kann auch eine eventuelle 0 nicht mit false verwechselt werden. Bring doch lieber dein Argument da an, wo es hinpasst, beispielsweise zu strpos().

                Nun musst Du aber nicht beleidigte Leberwurst spielen.

                » Schlechter Stil ist es, einen boolschen Variableninhalt oder ein Ausdrucksergebnis gegen einen der boolschen Werte true/false zu testen

                Diese Aussage ist für PHP nicht in Ordnung, da man nicht sicher sein kann, dass eine Variable, die für einen booleschen Wert vorgesehen war, diesen auch enthält. Schlampigkeit ist kein Zeichen von besonders schlauer Programmierung. Auch, wenn eine explizite Schreibweise "noob" aussehen sollte, ist sie doch einer verkürzten, kryptsichen Schreibweise immer vorzuziehen. Da mögen Profis[tm] darüber grinsen, soviel sie wollen.

                Liebe Grüße aus dem schönen Oberharz

                Tom vom Berg

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

                  Nun musst Du aber nicht beleidigte Leberwurst spielen.

                  Bin ich nicht, bin freundlich gelaunt, nur sachlich. Es war unbeabsichtigt, ich hab schon versucht, es weniger scharf zu formulieren.

                  » » Schlechter Stil ist es, einen boolschen Variableninhalt oder ein Ausdrucksergebnis gegen einen der boolschen Werte true/false zu testen
                  Diese Aussage ist für PHP nicht in Ordnung, da man nicht sicher sein kann, dass eine Variable, die für einen booleschen Wert vorgesehen war, diesen auch enthält.

                  Diese Aussage kann ich so nicht akzeptieren. Sie klingt so, als ob eine Variable einfach aus Lust und Laune ihren Typ ändern würde. Sie enthält genau das, was man in sie hineingelegt hat. Und man muss auch nicht auf einen boolschen Typ testen, wenn jemands aus Faulheit oder Schlampigkeit eine 0 statt eines false in die Variable schreibt. Denn wenn sie nur für den boolschen Kontext vorgesehen ist, dann ist alles richtig, was von der automatischen Typumwandlung als false erkannt wird (oder true im entgegengesetzten Fall).

                  Anders sind die Situationen, in denen festgelegt ist, dass beispielsweise neben einem Integerwert auch ein boolsches false als Funktionsergebnis zurückkommen kann und man dann den Fall 0 versus false unterscheiden können muss. Hier haben wir einen "mixed" Kontext und keinen boolschen mehr. Deshalb erfordert der die etwas andere Herangehensweise mit dem typsicheren Vergleich. Aber genau den Fall hat der OP nicht. Deshalb ist es für ihn im Augenblick auch nicht weiter interessant, dass es einen typsicheren Vergleich gibt. Er bringt hier keine Vorteile, nur mehr Tipparbeit.

                  Schlampigkeit ist kein Zeichen von besonders schlauer Programmierung. Auch, wenn eine explizite Schreibweise "noob" aussehen sollte, ist sie doch einer verkürzten, kryptsichen Schreibweise immer vorzuziehen. Da mögen Profis[tm] darüber grinsen, soviel sie wollen.

                  Das ist richtig. Aus ordentlicher Programmierung kann man deutlich besser den eigentlichen Sinn entnehmen. Dass man sich dessen befleißigen sollte, kann ich nur unterstützen. Das ändert aber nichts an der Arbeitsweise PHPs.

                  echo "$verabschiedung $name";