• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Ich erwarte eine 0

freakXHTML

Mitglied
Hallo zusammen,
wenn ich folgenden php Code ausführe, dann erscheint erwartungsgemäß eine 1 auf dem Bildschirm:

PHP:
<?php
 $var = 5;
 echo isset($var);

Wenn ich nun den folgenden Code ausführe, dachte ich eigentlich, dass eine 0 ausgegeben wird, doch es erscheint einfach gar nichts. Woran liegt das?


PHP:
<?php
  echo isset($var);

Vielen Dank
lg, freakXHTML
 
Weil die 0 nicht ausgegeben wird. 0 wird als false interpretiert und wird somit nicht ausgegeben. die 0 an sich Wäre ja schon wieder ein Wert :D
Für Abfragen kannst du diese 0 benutzen. In Ausgaben wirst du sie jedoch nicht sehen.

Edit: Brauchst die 0 denn für irgend was in der Ausgabe?

da wäre dann eine Einfache If-Abfrage nötig.

echo (isset($var)) ? "1" : "0";
 
das ist eine seltsame Angewohnheit unter PHP Programmierern. Warum wandelst du die Zahl in eine Zeichenkette um?
Wie du bereit erwähnt hast. Angewohnheit :) Kein muss. wollte auch zuerst "wahr" und "falsch" nehmen :) hab dann doch die Zahlen genommen. Aber Falsch ist es ja auch nicht =)
 
PHP:
echo (int)isset($var);
Wobei ist mich frage, warum will man etwas boolesches ausgeben?

PHP:
echo (isset($var)) ? "1" : "0";
finde ich jetzt nicht verkehrt, da echo doch eh aus String castet.
 
Mir geht es gar nicht primär um richtig oder falsch, da php für diese spezielle Denkweise sogar irgendeinen Filter eingebuat hat. echo '10' > '9' müßte eigentlich falsch sein. Aber aus irgendeinem Grund macht PHP (im gegensatz z.b. zu JS) hier einen Typecast.

Aber die Schreibweise ist länger, der Speicherverbrauch ist größer und das Programm wird langsamer (ausser wie in diesem Fall, wo sowieso eine Zeichnektte ausgegeben wird) - das sind natürlich alles nur minimale Effekte, aber ohne das es irgendeinen Vorteil hat.
 
Die folgenden Ausdrücke geben alle bool(true) zurück.
mermshaus-albums-emotes-picture1421-emot-pseudo.gif


Code:
var_dump('10' == 10);
var_dump('9' == 9);
var_dump(10 > 9);
var_dump('10' > '9');
var_dump('' == false);
var_dump('0' == false);

http://www.php.net/manual/en/types.comparisons.php

Dieser nicht:

Code:
var_dump('0' == '');

Dieser schon ("Typecast" zu boolean):

Code:
var_dump(!'0' == !'');

PHP ist da wie die deutsche Rechtschreibung: Es befolgt konsequent (mindestens) gefühlt inkonsequente Regeln. ;)
 
Zuletzt bearbeitet:
Naja, bei Gleichheit ist das auch kein Problem, es geht um größer oder kleiner.

In anderen Sprache ist es so, dass die Zeichenkette '10' kleiner ist als '9' und warum das PHP anders sieht kann ich mir nicht erklären. Gibt es da Regeln wie bei JS?
ECMAScript Language Specification (HTML version)

EDIT: ich seh gerade, in Perl ist es auch so. Aber bei einer Sortierung dann wiederum nicht, bei PHP schon.

PHP:
$x = array(0,1,2,3,4, '10', '20', 11, 21);
sort($x);
var_dump($x);
Wobei das zu seltsamen Ergebnissen führt, wenn Zeichenketten die nicht in Zahlen umgewandelt werden können, in dem Array sind.
 
Zuletzt bearbeitet von einem Moderator:
Ich vermute den Ursprung (auch den Ursprung der schwachen Typisierung) irgendwo in dieser Überlegung:

Code:
Es soll gelten...

    $_POST['a'] > $_POST['b'] wenn $_POST['a'] = '10' und $_POST['b'] = '9'

...denn alles Andere können wir dem Anwender nicht zumuten. PHP soll intuitiv sein.

Deshalb habe ich oben '10' == 10 usw. mit aufgenommen. Das hinkt aber etwas, denn '10 Eimer Wasser' ist auch gleich (==) 10, aber '10 Eimer Wasser' ist nicht größer als '9'.

Egal. Genau steht es hier: PHP: Comparison Operators - Manual

Na ja, genauer zumindest... Wenn Operand 1 null oder string ist und Operand 2 string, dann:
'Convert NULL to "", numerical or lexical comparison'

Ich vermute, numerical comparison genau dann, wenn für beide Operanden is_numeric() oder so gilt.

Zum Glück ist sowas von sehr geringer praktischer Relevanz, wenn man ein wenig auf seine Datentypen Acht gibt.

Ich hoffe, das erklärt auch die Sortierung des Arrays. Darüber möchte ich heute aus Angst, dass es sie nicht erklärt, nicht mehr nachdenken. ;)

Edit: Zum Topic, falls das im letzten Post nicht rüberkam:

echo false; gibt vermutlich deshalb "" aus, weil false sowohl gleich (==) dem leeren String ("") ist als auch gleich "0". Warum sich PHP für "" entscheidet und nicht für "0", hat bestimmt Gründe. :)
 
Zuletzt bearbeitet:
Ah, die Erklärung auf der Seite hatte ich gestern nicht gesehen.

If you compare a number with a string or the comparison involves numerical strings, then each string is converted to a number and the comparison performed numerically.

Skriptsprachen sind halt "magic", da es jede aber ein bisschen anders macht, muss man halt aufpassen.
 
Zurück
Oben