Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Warum ISSET($var) nutzen?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Warum ISSET($var) nutzen?

    Soweit ich das verstanden habe, werden Variablen in PHP dann erzeugt, wenn der Interpreter
    zum allerersten mal drüber stolpert. Schreibe ich also irgendwo mal
    $var = "hallo";
    dann existiert diese Variable ab sofort.

    In vielen Codeschnipseln sehe ich, dass der Programmierer solch ein Konstrukt gewählt hat:
    PHP-Code:
    if (isset($var)) {
        if(
    $var == "4711"tuwas();

    Ist das nicht vom Ergebnis her identisch mit:
    PHP-Code:
        if($var == "4711"tuwas(); 
    weil ja, sollte $var bisher noch niemals angesprochen worden sein, die Variable durch die
    if-Anweisung schon erzeugt wird.

    Ähnliches lese ich oft bei GET oder POST :

    PHP-Code:

    if (isset($_POST['Submit']) AND $_POST['Submit']) {
        echo 
    "Formular abgesandt!";

    An welchen Stellen würdet ihr empfehlen, vor der Wertprüfung erst eine Existenzprüfung zu machen und wo ist das unnütz?
    [PHP]if ($var != 0) {
    $var = 0;
    }[/PHP]

  • #2
    Hallo,

    PHP erledigt Deklaration und Initialisierung in einem Schritt.
    Wenn du

    $x = 5;

    schreibst, hast du $x deklariert und initialisiert. Wenn du $x aber benutzt, bevor du dies getan hast, benutzt du eine nicht existierende Variable und das hat eine Notice zur Folge.
    Mit isset() prüfst du, ob eine Variable existiert. Hierbei kannst du eine Variable übergeben und prüfen, ob diese zuvor definiert wurde. Obwohl du hier ja auch eine nicht deklarierte Variable benutzt, geht das aus zwei Gründen ohne Notice über die Bühne:
    • isset() ist keine Funktion, sondern ein Sprachkonstrukt
    • der Parameter für isset() ist ein Call-by-Reference-Parameter und bei einem solchen wird die Variable zunächst deklariert, wenn sie nicht existiert, da man nicht auf eine nicht existierende Variable verweisen kann
    Zu Punkt zwei: die Prüfung funktioniert trotz der vorigen Erzeugung der Variablen, da die Variable notfalls mit null initialisiert wird und null gilt als "nichts" (nicht zu verwechseln mit 0). Das kannst du auch selbst überprüfen:
    PHP-Code:
    $x null;
    print isset(
    $x) ? 'existiert' 'existiert nicht'
    Refining Linux: “[url=http://www.refining-linux.org/archives/65/Performing-push-backups-Part-1-rdiff-backup/]Performing Push Backups – Part 1: rdiff-backup[/url]”

    Kommentar


    • #3
      Du mußt hier Zuweisungen und Bedingungen unterscheiden. Zuweisungen sind eine Art Variablendeklaration, Bedingungsprüfungen stolpern schon über nicht existente Variablen. Mit error_reporting (E_ALL) wirst Du auch schöne saftige notices für jede unbekannte Variable erhalten.

      PHP-Code:
      if (isset($_POST['Submit']) AND $_POST['Submit']) 
      sollte übrigens mit
      PHP-Code:
      if (empty ($_POST['Submit'])) 
      gleichbedeutend sein.
      Für Formulare macht die isset Prüfung Sinn, um bspw. leere (nicht ausgefüllte) Felder von nicht übertragenen Elementen zu unterscheiden. Letztere könnte bei Textfeldern ein Indiz dafür sein, dass Daten nicht über das Formular versandt wurden.
      [COLOR="#F5F5FF"]--[/COLOR]
      [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
      „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
      [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
      [COLOR="#F5F5FF"]
      --[/COLOR]

      Kommentar


      • #4
        Ich bevorzuge zur Prüfung (v.a bei GET/POST-Variablen) nach Möglichkeit empty(), dass einerseits testet, ob die Variable gesetzt, bzw nicht gesetzt, ist, aber auch ob sie keinen Wert enthält (kein WERT == '' == '0' == 0 == null == false)
        Gruss
        L

        Kommentar


        • #5
          Ich vermeide es eh, Variablen als Schalter zu nutzen,
          wenn ich unsicher bin, welchen Wert sie beinhalten und
          würde vielleicht so etwas schreiben:
          PHP-Code:
          $zustand "";
          if(
          bedingung1$zustand="a";
          if(
          bedingung2$zustand="b";
          if(
          bedingung3$zustand="c";

          if(
          $zustandtuwas($zustand); 
          Für Formulare macht die isset Prüfung Sinn, um bspw. leere (nicht ausgefüllte) Felder von nicht übertragenen Elementen zu unterscheiden.
          Dieses Unterscheidungsmerkmal habe ich natürlich nicht bedacht.
          Wenn jemand sein eigenes Formular auf mein Script loslässt und
          dabei ein Feld vergisst, dann kann ich reagieren.
          [PHP]if ($var != 0) {
          $var = 0;
          }[/PHP]

          Kommentar


          • #6
            Zitat von Wolla Beitrag anzeigen
            Ich vermeide es eh, Variablen als Schalter zu nutzen,
            wenn ich unsicher bin, welchen Wert sie beinhalten und
            würde vielleicht so etwas schreiben:
            PHP-Code:
            $zustand "";
            if(
            bedingung1$zustand="a";
            if(
            bedingung2$zustand="b";
            if(
            bedingung3$zustand="c";

            if(
            $zustandtuwas($zustand); 
            Je nach erzielter Logik mußt Du dabei aber aufpassen, nicht diesen Fehler zu machen (erstes Posting): http://www.php.de/php-einsteiger/160...mpfaenger.html . Eine weitere Falle ist hier eine fehlende Initialisierung in Verbindung mit register globals. Ich würde hier i.A. ein switch/case verwenden.
            Zitat von Wolla Beitrag anzeigen
            Dieses Unterscheidungsmerkmal habe ich natürlich nicht bedacht.
            Wenn jemand sein eigenes Formular auf mein Script loslässt und
            dabei ein Feld vergisst, dann kann ich reagieren.
            Alternativ könnte man auch einen Proxy wie Webscarab benutzen, um beliebige POST/GET Parameter zu übertragen/manipulieren
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              Zitat von Wolla Beitrag anzeigen
              Ich vermeide es eh, Variablen als Schalter zu nutzen
              Wie geht denn das? Nimmst du nur Konstanten?
              Zitat von Wolla Beitrag anzeigen
              wenn ich unsicher bin, welchen Wert sie beinhalten und
              würde vielleicht so etwas schreiben:
              PHP-Code:
              $zustand "";
              if(
              bedingung1$zustand="a";
              if(
              bedingung2$zustand="b";
              if(
              bedingung3$zustand="c";
              if(
              $zustandtuwas($zustand); 
              Wie verarbeitest du denn Benutzereingaben mit dieser Methode?

              Bedingungen machen ja nur Sinn, wenn du keine konstanten Werte hast, also muss man da zwangsläufig Variablen verwenden. Vielleicht hab ich dich missverstanden?

              Kommentar


              • #8
                Jo, das hast du missverstanden. Der Satz ging ja weiter.

                Man sollte eh immer genau wissen, welche Variable zur Laufzeit an welcher Programmstelle welche Werte annehmen kann.
                [PHP]if ($var != 0) {
                $var = 0;
                }[/PHP]

                Kommentar


                • #9
                  Zitat von Wolla Beitrag anzeigen
                  Jo, das hast du missverstanden. Der Satz ging ja weiter.
                  Entschuldigung.
                  Zitat von Wolla Beitrag anzeigen
                  Man sollte eh immer genau wissen, welche Variable zur Laufzeit an welcher Programmstelle welche Werte annehmen kann.
                  Bei PHP kann jede Variable an jeder Stelle jeden Wert annehmen Wird Zeit, dass man eine allgemeine Typensicherheit (auch für Skalare) einführt.

                  Kommentar

                  Lädt...
                  X