hawkmaster: While Syntax falsch?

Hallo zusammen,
in vielen Stellen meines PHP Projects habe ich Stellen wie;

$dir=opendir($path);
while ($file = readdir ($dir)) {
...
}

oder
$result = $DBO->query("SELECT id_name from testdb") ;
while ($row = $result->fetch(PDO::FETCH_ASSOC)){

So oder ähnlich findet man das ja auch im PHP manual.
Seit kurzem arbeite ich mit Zend Studio Eclipse. Ich kenne mich noch nicht gut damit aus.
Was mir aber aufgefallen ist, sind viele Warnmeldungen wie:

bool-assign : Assignment in condition

immer in der Zeile wo die While Schleife ist.

In einem Zend Forum sagte man mir man sollte die While Schleife mit zwei zusätzlichen Klammern schreiben, also,
while (($row = $result->fetch(PDO::FETCH_ASSOC))){

und tatsächlich kommt dann in Zend Studio die Meldung nicht mehr.

Zusätzlich wurde auch noch die PHP Doku als fehlerhaft dargestellt.

Ich bin nun etwas verunsichert und weiss nicht so recht ob ich den Code so lassen soll wie bisher oder ob ich alles umstellen soll.
Wie gesagt; ich hatte bisher nie Probleme oder Fehlermeldungen damit.

bin für jeden Tipp dankbar.
vielen Dank und viele Grüße
hawk

  1. Hallo,

    in vielen Stellen meines PHP Projects habe ich Stellen wie;
    $dir=opendir($path);
    while ($file = readdir ($dir)) {
    ...
    }

    Was mir aber aufgefallen ist, sind viele Warnmeldungen wie:
    bool-assign : Assignment in condition

    das ist dann wohl die Fürsorglichkeit des Parsers, der dir sagen will: Du hast da eine Zuweisung, wo man eher einen Vergleich erwarten würde. Merke: Das ist eine Warnung, kein Fehler.

    Dabei ist der zitierte Code natürlich sowohl syntaktisch richtig, als auch sinnbehaftet: "Rufe readdir() auf, weise das Ergebnis gleich zu, und wenn es nicht Null ist, mach mit der Schleife weiter."

    In einem Zend Forum sagte man mir man sollte die While Schleife mit zwei zusätzlichen Klammern schreiben, also,
    while (($row = $result->fetch(PDO::FETCH_ASSOC))){
    und tatsächlich kommt dann in Zend Studio die Meldung nicht mehr.

    Naja, so kann man den Parser auch veräppeln. ;-)

    Zusätzlich wurde auch noch die PHP Doku als fehlerhaft dargestellt.

    Warum? Weil sie die beschriebenen Code-Schnipsel empfiehlt? Unsinn. Das ist völlig korrekt, nur passt es vielleicht manchen Programmierern nicht in ihr Schema, dass das Argument eines if- oder while-Statements immer eine Vergleichsoperation sein müsste. Dabei darf es ein beliebiger Ausdruck sein.

    Ich bin nun etwas verunsichert und weiss nicht so recht ob ich den Code so lassen soll wie bisher oder ob ich alles umstellen soll.

    Lass es so, wie es ist. Daran ist nichts auszusetzen.

    So long,
     Martin

    --
    Die neue E-Mailadresse des Papstes: mailto:urbi@orbi
    1. Hi,

      while ($file = readdir ($dir)) {

      Dabei ist der zitierte Code natürlich sowohl syntaktisch richtig, als auch sinnbehaftet: "Rufe readdir() auf, weise das Ergebnis gleich zu, und wenn es nicht Null ist, mach mit der Schleife weiter."

      Problem: Die Schleife wuerde auch abbrechen, wenn ein Verzeichniseintrag mit dem Namen "0" gelesen wuerde.

      while (($file = readdir ($dir)) !== false)
      waere die bessere Alternative.

      MfG ChrisB

      --
      „This is the author's opinion, not necessarily that of Starbucks.“
      1. Hallo zusammen,

        vielen Dank an alle für die Tipps. Dann bin ich etwas beruhigt. Ich dachte schon ich hätte da grundsätzlich was falsch gemacht.

        Noch etwas anderes das mir Zend Studio auch angemeckert hatte.
        Ich habe an ein paar Stellen im Code bei manchen Variablen folgendes gemacht:

        if(!isset($webadmin)){
          $webadmin = NULL;
        }
        oder
        if(!isset($_SESSION['sel_SelectFront_s'])){
         $_SESSION['sel_SelectFront_s'] = NULL;
        }

        ist das schlechter Programmierstil oder kann man es lassen?
        Ich habe das eigentlich nur gemacht das es keine Meldungen gibt wie;
        Notice: Undefined variable:...
        oder
        Notice: Undefined index:...

        vielen Dank und viele Grüße
        hawk

        1. echo $begrüßung;

          Noch etwas anderes das mir Zend Studio auch angemeckert hatte.

          Was konkret wirft es dir denn vor?

          Ich habe an ein paar Stellen im Code bei manchen Variablen folgendes gemacht:
          if(!isset($webadmin)){
            $webadmin = NULL;
          }
          oder
          if(!isset($_SESSION['sel_SelectFront_s'])){
          $_SESSION['sel_SelectFront_s'] = NULL;
          }
          ist das schlechter Programmierstil oder kann man es lassen?

          Grundsätzlich ist es eine gute Idee, Variablen vor dem Erstgebrauch definiert zu initialisieren. Bei von PHP vor dem Scriptstart gesetzten Variablen ($_GET, $_POST, usw.) kann man dies nur nach einer Existenzprüfung machen, sonst überschreibt man sich ja den Wert. Der Sinn der Prüfung auf $webadmin erschließt sich mir ohne Zusammenhang nicht. Über selbst erstellte Variablen sollte man schon den Überblick behalten und nicht erst fragen müssen, ob man sie schon mal erstellt hat. Wenn die Erzeugung aufgrund von register_globals erfolgte, hast du ab spätestens PHP 6 ein Problem, weil es dieses Feature dann nicht mehr gibt. Auch andere Mechanismen, die unkontrolliert Variablen erzeugen sind nicht besser. Ebenso schlecht ist das Umkopieren aus einem der EGPCS-Arrays in einfache Variablen. Ein isset($foo) liefert zwar nach einem $foo = $_GET['foo']; bei nicht vorhandenem foo-Element ebenfalls false, das aber nur, weil die Zuweisung NULL zuweist und isset() bei NULL an eine Nichtexistenz glaubt. Doch das hast du sicher nicht gemacht, denn dafür hättest du ja eine Notice-Meldung kassiert.

          echo "$verabschiedung $name";

          1. Hallo dedlfix,
            vielen Dank für deine Hilfe.

            Was konkret wirft es dir denn vor?

            Nun, Studiuo for Eclipse meldet z.b. bei;
            if(!isset($saved_arr['BodyPaper'])){
             $saved_arr['BodyPaper'] = NULL;
            }
            die Meldung;
            var-use-before-def-global : Global variable $saved_arr was used before it was defined

            Eine Zeile weiter steht fast das Geliche;
            if(!isset($saved_arr['CoverSelectBack'])){
             $saved_arr['CoverSelectBack'] = NULL;
            }

            das wird dann aber nicht angemeckert.
            Ich verwende auch keine globalen Variabeln und "register_globals" steht auf "off".

            Ich habe die ganze Konstrukte mit;

            if(!isset($VARIABLE)){
             $VARIABLE = NULL;
            }

            eigentlich nur gemacht, weil ich zum entwickeln das Error Reporting auf "All" stehen habe um so auch die "Notice" Fehler zu sehen.

            vielen Dank und viele Grüße
            hawk

            1. echo $begrüßung;

              Nun, Studiuo for Eclipse meldet z.b. bei;
              if(!isset($saved_arr['BodyPaper'])){
              $saved_arr['BodyPaper'] = NULL;
              }
              die Meldung;
              var-use-before-def-global : Global variable $saved_arr was used before it was defined

              Bei einem Lesezugriff auf ein Array-Element ist natürlich die Sachlage eine andere als bei einer "einfachen" Variable. Zuerst erfolgt ein Zugriff auf das Array, dann auf das Element. Der Zugriff auf ein Array-Element scheitert also schon vorher, wenn das Array, in dem es stecken soll, nicht existiert. Dem isset() ist das jedoch egal. Es meckert in dem Fall nicht. Es scheint nur so, als ob das Zend Studio nur die Array-Problematik sieht, nicht aber, dass diese durch das isset() entschärft ist.

              Wenn du kannst, initialisiere $saved_arr einfach als leeres Array. Dann existiert es definitiv und ist nicht auf einen mehr oder weniger zufälligen Schreibzugriff auf ein Element angewiesen, um angelegt zu werden.

              Eine Zeile weiter steht fast das Geliche;
              if(!isset($saved_arr['CoverSelectBack'])){
              $saved_arr['CoverSelectBack'] = NULL;
              }

              das wird dann aber nicht angemeckert.

              Nun wurde das Array ja auch angelegt, zumindest denkt das Zend Studio das. Es kann gut möglich sein, dass es auch schon zufrieden ist, wenn du bei BodyPaper

              if (false)
                  $saved_arr['BodyPaper'] = NULL;

              notierst. Nur wenn es wirklich "schlau" ist, stellt es fest, dass der Zweig nicht abgearbeitet werden kann und damit $saved_arr nicht angelegt werden konnte.

              Ich verwende auch keine globalen Variabeln und "register_globals" steht auf "off".

              Dann ist ja gut. Dein ursprüngliches Beispiel mit der einfachen Variable ließ mich zu der Vermutung kommen. Mit Array wär das nicht passiert.

              echo "$verabschiedung $name";

  2. echo $begrüßung;

    in vielen Stellen meines PHP Projects habe ich Stellen wie;
    while ($file = readdir ($dir)) {
    while ($row = $result->fetch(PDO::FETCH_ASSOC)){
    Seit kurzem arbeite ich mit Zend Studio Eclipse. […] Was mir aber aufgefallen ist, sind viele Warnmeldungen wie:
    bool-assign : Assignment in condition

    Es ist auch komplett legal

    if ($var = ausdruck)

    zu notieren. In manchen Fälle ist das so gewollt, aber oftmals machen Anfänger den Fehler, so eine Zuweisung zu notieren wenn sie einen Vergleich meinen

    if ($var == ausdruck)

    Wenn die IDE einen darauf hinweist ist das nicht unbedingt verkehrt.

    In einem Zend Forum sagte man mir man sollte die While Schleife mit zwei zusätzlichen Klammern schreiben, also,
    while (($row = $result->fetch(PDO::FETCH_ASSOC))){
    und tatsächlich kommt dann in Zend Studio die Meldung nicht mehr.

    Das ist also nur, um das Zend Studio zu beruhigen. Du musst nun entscheiden, was dir weniger Schmerzen bereitet. Die Warnung zu dektivieren, sie zu ignorieren oder die zusätzlichen Klammern.

    Zusätzlich wurde auch noch die PHP Doku als fehlerhaft dargestellt.

    Allgemeiner Konsens, in diesem Fall so zu klammern ist es jedenfalls nicht. Meiner Meinung nach ist dass nicht als Fehler anzurechnen. Es wird auch schwer werden, solche Doppelklammern nun noch einzuführen. Das verträgt sich nicht mit der bisherigen Praxis und den vielen existierenden Scripten und wäre eine ziemliche Besonderheit unter PHP.

    Wichtiger wäre in meinen Augen eine konsistente (Um)benennung von Funktionsnamen und Vereinheitlichung der Parameterreihenfolge besonders bei den Stringfunktionen, doch das macht man aus gutem Grund nicht, bricht das doch zu vielen bisherigen Scripts das Genick.

    echo "$verabschiedung $name";