Stefan Welscher: Variablenwert wird aus versehen gelöscht??

Hallo!
Habe gerade etwas wie ich finde sehr merkwürdiges:
ich hab ne function, der ich einen parameter "extension" übergebe, der später weiter verwendet werden soll. damit dieser parameter optional belibt, hab ich das ganze so gemacht:

"function copy_image($tmp_pic_nr,$extension=0)"

ich übergebe der funktion jetzt als extension den wert "main"

folgende ausgabe bringt auch das korrekte ergebnis:

function copy_image($tmp_pic_nr,$extension=0)
{echo "1.:".$extension."\n";
...

jetzt will ich sicherstellen, dass, wenn kein wert für extension angegeben wird, aber auch auf keinen fall der wert "0" ist.
also hab ich eine prüfung:

if (strlen($extension)!=0&&$extension==0) {unset ($extension); }

Das verblüffende ist jetzt für mich irgendwie, dass die If-Abfrage immer True ist. Also auch wenn extension den Wert "main" hat, wird die Variable gelöscht.

Kann mir einer sagen wieso und was ich dagegen tun kann?

Dank euch!

  1. Hi,

    "function copy_image($tmp_pic_nr,$extension=0)"

    ich übergebe der funktion jetzt als extension den wert "main"

    Den String "main", den Inhalt der Variable $main oder was?

    folgende ausgabe bringt auch das korrekte ergebnis:

    function copy_image($tmp_pic_nr,$extension=0)
    {echo "1.:".$extension."\n";
    ...

    Ausgabe ist drei Punkte?

    jetzt will ich sicherstellen, dass, wenn kein wert für extension angegeben wird, aber auch auf keinen fall der wert "0" ist.
    also hab ich eine prüfung:

    if (strlen($extension)!=0&&$extension==0) {unset ($extension); }

    $extension ist mit der Zahl 0 vorbelegt, die bleibt also, wenn es nicht geändert wird, der erste Teil ist also immer !=0. Da sich $extension nicht geändert hat ist $extension auch == 0.

    so short

    Christoph Zurnieden

    1. Den String "main", den Inhalt der Variable $main oder was?

      die variable $extension hat den wert "main"

      Ausgabe ist drei Punkte?

      nein, ausgabe ist "1.:main"

      1. Hi,

        Den String "main", den Inhalt der Variable $main oder was?
        die variable $extension hat den wert "main"

        Wenn die Ausgabe ...

        nein, ausgabe ist "1.:main"

        ... ist, ist in $extension der _String_ "main". "Wert" ist zwar keineswegs falsch, aber hier zu ungenau, meine Nachfrage war durchaus ernstgemeint, es hätte alles Gelistete sein können.

        Aber ich schweife ab, das war ja nicht Dein Problem.

        Was kommt denn hierbei raus?

        if( strlen($extension) != 0 && $extension == 0 ) {
          echo "Value:""  .$extension.         ""\n";
          echo "Length:"" .strlen($extension). ""\n";
        }

        Ist jetzt klarer, worauf ich hinaus will?

        so short

        Christoph Zurnieden

        1. Was kommt denn hierbei raus?

          if( strlen($extension) != 0 && $extension == 0 ) {
            echo "Value:""  .$extension.         ""\n";
            echo "Length:"" .strlen($extension). ""\n";
          }

          Ist jetzt klarer, worauf ich hinaus will?

          so short

          Christoph Zurnieden

          Value=main
          Length=4

          Das ist ja grad das komische.. wie kann da "$extension==0" wahr sein???

          1. Hi,

            Value=main
            Length=4

            Das ist ja grad das komische.. wie kann da "$extension==0" wahr sein???

            Das dürfte ein Problem mit der Umwandlung Zahl<->String sein. Wäre möglich, das versucht wird den String "main" in eine Zahl umzuwandeln. Geschieht ds mit den üblichen Mitteln (strto*()) aus der LibC, dann kommt da 0 bei raus. Allerdinsg wird errno gesetzt, versuch mal mit dem Debuggingmittel Deiner Wahl Fehler ausgeben zu lassen.

            Zu Deinem Nutzen könntest Du auch is_number() bzw is_string() gebrauchen, falls Du in $extension Zahlen und Strings mischen willst.

            so short

            Christoph Zurnieden

            1. Das dürfte ein Problem mit der Umwandlung Zahl<->String sein. Wäre möglich, das versucht wird den String "main" in eine Zahl umzuwandeln. Geschieht ds mit den üblichen Mitteln (strto*()) aus der LibC, dann kommt da 0 bei raus. Allerdinsg wird errno gesetzt, versuch mal mit dem Debuggingmittel Deiner Wahl Fehler ausgeben zu lassen.

              Zu Deinem Nutzen könntest Du auch is_number() bzw is_string() gebrauchen, falls Du in $extension Zahlen und Strings mischen willst.

              so short

              Christoph Zurnieden

              Sehr interesant :)
              hast wohl recht, weil mit:

              if (strlen($extension)!=0&&$extension==0&&!is_string($extension))

              geht`s  dann. vielen Dank!

          2. Hello,

            Das ist ja grad das komische.. wie kann da "$extension==0" wahr sein???

            Das ist in PHP durch die automatische Typumwandlung so vorgegeben. Wenn Du wirklich exact überprüfen willst, was in der Variable steht, musst Du === als Operator benutzen.

            Harzliche Grüße aus http://www.annerschbarrich.de

            Tom

            --
            Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
            Nur selber lernen macht schlau
  2. Hello,

    "function copy_image($tmp_pic_nr,$extension=0)"

    PHP kennt beie Aufrufvarianten:

    • mit einer vorgegeben Anzahl Parameter            function foo($bar, $blah, $blubb)
    • mit einer vorgegeben Anzahl Paramter
        einige davon mit Vorbelegung                     function foo($bar, $blah, $blubb=1)
    • mit einer variablen Anzahl von Parametern        function foo()

    in der ersten Variante muss man innerhalb des Namensbereiches der Funktion z.B. nicht nach der Existenz von $blubb fragen, da sie sicher vom Parser angelegt wird. Wenn beim Aufruf kein Wert übergeben wird, meckert der Parser. Im zweiten Falle würde das Argument automatisch mit dem Default 1 gefüllt, wenn kein Paramter übergeben wird.

    Im dritten Falle sollte amn allerdings erstens die Anzahl der Argumente zählen, zweitens ihren Typ bestimmen und drittens etwas damit machen...

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau