PHP Wieso ist !== false nicht dasselbe wie === true

  • Ersteller Ersteller Mr. Snoot
  • Erstellt am Erstellt am
M

Mr. Snoot

Gast
Hio,

ja, wie der Titel schon sagt: wieso ist eine Prüfung mit !== false nicht das gleiche wie === true.

Im ersten Fall prüfe ich, ob etwas nicht falsch ist. Das ist doch dasselbe wie wenn ich prüfe, ob etwas richtig ist. Oder nicht? :D

Jedenfalls wird in den Beispielen, die ich bisher mit diesem Operator gesehen habe (zu den verschiedensten Themen), immer auf !== false zurückgegriffen. Und genau das liefert bei mir auch das, was ich will. Prüft man dagegen mit === true, dann kanns passieren, dass die Prüfung ein falsches Ergebnis liefert.


Prüfe ich bspw. mit strpos auf ein Zeichen in einem String, dann liefert mir !== false das richtige Ergebnis, === true dagegen nicht.
PHP:
<?php

  $str = asdfgh;
  echo strpos($str,"a") !== false ? "kommt vor" : "kommt nicht vor"; // findet das a in $str
  echo strpos($str,"a") === true ? "kommt vor" : "kommt nicht vor"; // findet kein a in $str

?>
 
Zuletzt bearbeitet:
Vielleicht, weil strpos im Erfolgsfall eine Zahl >= 0 zurückliefert und kein Boolean?

=== prüft auf Wert- und Typengleichheit, Zahl != Boolean
 
PHP:
<?php

  $str = asdfgh;
  echo strpos($str,"a") ? "kommt vor" : "kommt nicht vor"; // findet das a in $str
  echo strpos($str,"a") ? "kommt vor" : "kommt nicht vor"; // findet kein a in $str

?>

Reicht doch völlig aus.
MfG
 
@ XunnD: ok, das klingt vernünftig :)

@ Destruction: also den Code findet kein 'a', obwohls vorkommt.
 
Mal $str auch wirklich einen String zuweisen :)

Code:
$str = "asdfgh";
 
Antwort auf deine Frage gab dir XunnD. Du vergleichst Äpfel mit Tomaten oder so...

Richtig wäre, warum ist !== false ungleich == true. Dann machts Sinn und dann funktioniert es auch. In diesem Beispiel bist du auf die automatische Typkonvertierung von php reingefallen, genauso wie tRIAS im Übrigen.

Bei strpos("asdfgh","a") kommt 0 (integer) raus, weil das Zeichen an 0ter Position des Strings steht. Wenn du das gegen false prüfst, wandelt der php-Interpreter den Integer zum Boolean und es funzt.
=== prüft wie schon gesagt ob Typgleichheit herrscht und schlägt deshalb fehl.

Wenn du wissen willst, ob ein String in einem anderen enthalten willst prüfst du einfach mit strpos($str,"a") === False (dann ist er nicht enhalten).

Ich empfehle dir dringend, eine Seite wie www.php.net zu nutzen, um dich ein wenig mit den Funktionen vertraut zu machen.
 
Hab mir das auf php.net schon angeschaut, aber trotzdem nicht so ganz den Unterschied verstanden - aber jetzt ist's klar(er) :D

Man dankt!
 
So, nach 9812-fachen lesen hab ich es jetzt endgültig verstanden :>, danke schön!
 
!== prüft auf primitiven elementebene (typebene)! in PHP gibt es das nicht explizit.... also muss man eine konvertierung auf BOOL vornehmen!
kann sein dass es auch an der abgekürzte form liegt...

ich schlage vor
PHP:
$tmp = false;
$tmp = (bool)strpos($str,"a");
if($tmp === true && isbool($tmp))
{
...
}else{
...
}

sollte auf jedenfall hinhauen!

also bei mir geht das.

natürlich hat PHP viele vorteile, da es keinen string, int, bool und sonstiges gibt, aber es ist ein großer nachteil zugleich!
 
Zuletzt bearbeitet:
Na das verkompliziert die Sache ja nur unnötig! Wenn man einfach nur prüfen will, ob der String $b in $a enthalten ist, dann nimmt man der Einfachheit halber besser strstr oder stristr. Diese liefern auf jeden Fall Strings zurück, leere oder nichtleere. Leere Strings evaluieren ebenso zu false, sofern nicht === genutzt wird.

Beispiel:
strstr('foobar','ba') => 'bar' (nichtleerer String, evaluiert zu true)
strstr('foobar','y') => '' (leerer String, evaluiert zu false)

Wenn strpos($a,$b)===false, dann ist $b nicht in $a enthalten.
strpos($a,$b) === true wird niemals eintreffen, da - wenn überhaupt ein Boolean zurückgegeben wird - nur false zurückgegeben wird.

Deshalb würde man folgendermaßen mit strpos nachprüfen, ob $b in $a enthalten ist:

if (!(strpos($a,$b)===false)) ...
 
ja tut mir leid.... hab jetzt im manuel nicht geguckt was strpos zurückgibt :P

aber wenn man === oder !== macht sollte die typen der variablen explizit angegeben werden...

also z.b. wenn man zwei int's vergleicht

PHP:
$x = (int)1;
$y=(int)2;
if($y===$x)
{
....
}else{
...
}

sollte man die var eine typenkonvertierung unterziehen wie beispiel oben.

wenn man noch sicherer sein will....

PHP:
if(isint($y) && isint($x) && $y === $x)

"programmiere" zur zeit nicht in PHP, deswegen sollte man vielleicht in php.net nachschlagen :D

sonst sollte man normales vergleich machen.
 
Naja bei so einem Vergleich ist der "===" Operator meines Erachtens überflüssig.

strpos liefert halt neben dem eigentlichen Index (integer) (falls es den String gibt), auch ein false zurück, was mit 0 (boolean) gleichzusetzen ist. Da ist es sinnvoll den "===" anzuwenden.

Wenn man jetzt auf die Idee kommt Queries mit Arrays und "==" zu vergleichen, dann is sowieso alles zu spät.
 
Zuletzt bearbeitet:
wie queries vergleichen? hmm kenn sowas nicht... wenn ich irgendwas aus der DB vergleiche dann in sql befehl. nebenbei.... wenn man schon mit datenbanken arbeitet sollte man auch mit NF3 das tun.... sonst hat man den salat :D

vergleich auf diese EBENE ist sowieso nur für primitive typen geeignet... also int's und bools, da diese immer eindeutig sind!

finde aber sehr blöd bei PHP gemacht, dass man verschiedene datentypen ohne eine fehlermeldung oder zumindest warnung, vergleichen kann.
 
Zuletzt bearbeitet:
Ich weiss auch nicht ob es das gibt xD, soll aber heißen, wenn man schon mit "==" vergleicht, dann weiss man so ungefähr worum es sich handelt und würfelt net zwei verschiedene Typen zusammen. Naja, ich bin weg, danke nochmals!
 
roker002 schrieb:
PHP:
if(isint($y) && isint($x) && $y === $x)
doppelt gemoppelt? $y === $x würde doch schon in $y == $x && gettype( $y ) == gettype( $x ) evaluieren (rein theoretisch), weshalb machst du ein isint( $y ) && isint( $x ) && $y == $x && gettype( $y ) == gettype( $x ) daraus? ;) === ist gleich vergleich auf gleichheit ("des inhalts") + prüfung auf typengleichheit (was gettype( $y ) == gettype( $x ) ja erledigt).

verdeutlicht:
PHP:
# $y = 5; $x = 9
# dein beispiel:
if( isint( $y ) && isint( $x ) && $y === $x )
-> if( isint( 5 ) && isint( 9 ) && $y == $x && gettype( $y ) == gettype( $x ) )
-> if( isint( 5 ) && isint( 9 ) && 5 == 9 && gettype( 5 ) == gettype( 9 ) )
-> if( isint( 5 ) && isint( 9 ) && 5 == 9 && 'int' == 'int' )
-> if( true && true && false && true )

# verkürzt:
if( $y === $x )
-> if( $y == $x && gettype( $y ) == gettype( $x ) )
-> if( 5 == 9 && gettype( 5 ) == gettype( 9 ) )
-> if( 5 == 9 && 'int' == 'int' )
-> if( false && true )
isint() musst du doch nur fragen, wenn du z.b. input vom user bekommst und dieses auf richtigkeit prüfst. wenn man isint() bei seinem eigenen code brauch, wäre dies imo problematisch (da man selbst nicht weiß mit welchen typen man nun arbeitet [manchmal praktisch, teils aber daneben und auf dauer sinkt die wartbarkeit enorm]). aber das ist ja nicht das thema... :)

btw: das zweite isint() würde ich mir schenken, da $y und $x ja eh typgleichheit haben müssen (wegen ===).
 
Das ganze steht doch dick und fett in der Doku.


Rückgabewerte

Gibt die Position als Integerwert zurück. Wurde needle nicht gefunden, gibt strpos() den boolean-Wert FALSE zurück.

Warnung

Diese Funktion kann sowohl das boolsche FALSE zurückliefern, als auch einen nicht-boolschen Wert, wie zum Beispiel 0 oder "", der von einem einfachen if-Statement als FALSE ausgewertet wird. Weitere Informationen entnehmen Sie bitte dem Abschnitt über die boolschen Typen. Benutzen Sie deshalb den === Operator, um den Rückgabewert dieser Funktion zu überprüfen.


Also wie schon gesagt wurde, auf === false prüfen.

Edit: nochmal was zum nachdenken, wenn ich mir den Threadtitel so anschaue...

!== false ist dasselbe wie === true, nur hast du eine falsche Vorstellung davon, was das überhaupt bedeutet.

Bei === gibt es nur eine Möglichkeit, wie beide Vergleichswerte beschaffen sein müssen, um zu einem wahren Ergebnis zu kommen.
Wenn hingegen !== zutrifft, weißt du aber nicht woran es liegt. Am Typ, Inhalt, beidem?
 
Zuletzt bearbeitet:
roker002 schrieb:
PHP:
$x = (int)1;
$y=(int)2;
if($y===$x)

In diesem Fall ist kannst Du auch gleich ($x == $y) schreiben, da die Variablen-Typen durch den explicit cast bereits gleich sind!

/EDIT: man sollte vielleicht nicht posten, ohne vorher ein letztes Mal aktualisiert zu haben.
 
Zuletzt bearbeitet:
Zurück
Oben