PHP Fehlerhafte IF-Anweisung

Bl4ckbyt3

Cadet 3rd Year
Registriert
Juli 2010
Beiträge
43
Hallo,

ich bin erst letztens über einen Fehler bei mir im Skript gestolptert. Nun bin ich mir aber nicht sicher ob es ein BUG oder ein wirklicher Logik-Fehler ist.

Zudem nun folgenden Code ist noch zu sagen, dass dort wo eine 0 steht eine Variable platziert ist, die normalerweiße ein String ist. Ich habe sie nur durch die Ziffer 0 ersetzt, da nur damit dieser Fehler auftritt.

Gegeben ist folgender Code:
PHP:
<?php
if(0 == "test"){
	echo "sollte eigentlich nicht zutreffen!";
} else {
	echo "DAMN, warum trifft es trotzdem zu?!";
}
?>

Update:
Zu sagen sei vielleicht noch, dass ich folgende PHP-Version einsetze (als Apache-Modul): 5.2.13
Und das als Ergebniss immer "sollte eigentlich nicht zutreffen!" ausgegeben wird.
 
Zuletzt bearbeitet:
PHP:
<?php
if(0 === "test"){
    echo "trifft zu";
} else {
    echo "trifft nicht zu";
}
echo (int)"test"; // Das sollte eigenlich die Erklärung sein ;)
?>

Output: trifft nicht zu

Ist also ein Logik Fehler in deiner Anwendung, kein Bug von PHP :)

so long
 
Zuletzt bearbeitet:
Ich werde aus dem ganzen irgendwie nicht schau, obwohl ich das jetzt bestimmt 5 mal durch gelesen hab.
Was meinst du denn genau? Könntest du das etwas weiter umschreiben?
Du vergleichst eine zahl mit einem String, das gibt meistens Probleme aber ich weiß halt nicht was genau gewünscht ist.
 
was erwartest du denn eigentlich als ausgabe? wenn statt der 0 "test" da steht ist doch irgendwie klar dass immer das ausgegeben wird...

edit: jetzt weiss ich was gemeint war ... denke ich :P
 
@-=Renegade=- : Danke für die Lösung, aber weshalb ist bei dem typen-schwachen Vergleich ein Integer gleich einem String und weshalb tritt nur bei einem typen-starken Vergleich das richtige Ergebniss ein?

@Mika911: Es ist nur gewünscht, dass das gewünschte Ergebniss - sprich 0 ist nicht gleich "test" - eintritt.

Ich glaub, ich sollte für die Zukunft lieber die Finger von PHP lassen. Solche und ähnliche Probleme haben mich nämlich schon Tage gekostet -.-
 
ALLES, außer 0 und false ergibt true
php is wirklich eine sausprache und zum lernen empfehle ich dir echt eine andere
 
@achim89: Deine Aussage ist in mehrere Hinsicht falsch.
Erstens gibt es noch eine Menge mehr, das false ergibt, zB '' (empty String), NULL, array() (empty array), ...

Für diese Überprüfungen eignet sich die Funktion empty()

Zudem ist PHP keine Sausprache, es ist rein das Prinzip der dynamischen Typverwaltung das man verstehen muss. Genauso könnte man aber auch statische Typverwaltung (zB C) als Negativum einer Programmiersprache herhalten.

PHP gibt dem Entwickler (und auch dem Einsteiger) extrem viele Möglichkeiten in die Hand, während andere Sprachen viel restriktiver sind. Dadurch ist PHP leicht erlernbar, erschwert es aber, sauberen und professionellen Code zu schreiben. (Das ist übrigens meine persönliche Meinung :))

@Bl4ckbyt3: Ich hab dir die Lösung ja schon gepostet. Um einen Typschwachen Verlgeich durchführen zu können, muss eine Vergleichsbasis geschaffen werden (sozusagen ein kleinster gemeinsamer Nenner)

Wenn du den String jetzt in einen int castest, kann man beide vergleichen.
Der Cast: echo (int)"test"; ergibt 0, weshalb auch der Vergleich 0 == 0 true ist. Deshalb benötigst du auch noch den typ starken Vergleich, da Integer == String false ergibt.

Die genauen Interna von PHP kenn ich natürlich auch nicht, aber ich denke das hilft mal weiter :)

Noch was aktuelles zum Thema

so long
Renegade
 
Zuletzt bearbeitet:
Ja, das finde ich an PHP auch hässlich gelöst. Hier ist dokumentiert, wie Strings implizit in Integer (wie in deinem Beispiel) umgewandelt werden:

http://www.php.net/manual/de/language.types.string.php#language.types.string.conversion

The value is given by the initial portion of the string. If the string starts with valid numeric data, this will be the value used. Otherwise, the value will be 0 (zero).

Weil also "test" nicht mit einer Zahl beginnt, wird das zu 0 konvertiert.
 
Des is gaaaanz einfach.

Es gibt "null" (Typ string und bool), null (Typ bool), "0" (Typ string, bool und integer) und 0 (Typ integer, bool). Und bevor hier alle aufschreien "aaaa, das stimmt ja gar niiiicht!!!" - ja, recht sollts haben, des hängt von der Prüfmethode ab. Dennoch, deswegen würde folgendes z.B. IMMER als Wahr gelten:

PHP:
if(0 == null):
   echo "ups, des is wahr!";
endif;

if(0 == 0):
   echo "auch das is wahr!";
endif;

if(0 == "null"):
   echo "auch das ist wahr!";
endif;

//usw

Der Grund ist einfach, 0 kann sowohl vom Typ Integer, als auch Bool, als auch String sein, wenn die 0 keine " " oder ' ' , die das beschränken würden (dann wäre nur Integer oder String korrekt), umschließt. Darum gibt es bei PHP drei unterschiedliche Operatoren:

= -> ungleich
== -> gleich (egal ob 0 und "null" sich vom Typ her unterscheiden!)
=== -> identisch (hier muss Inhalt UND Typ gleich sein! also "0" === "0" und "Test" === "Test", nicht "0" === "null")

Darum ist

PHP:
if(0 == "test") echo "ist wahr obwohls per menschlicher Logik falsch ist";


Nimmste dies,

PHP:
if("0" == "test"):
    echo "wirste verar***t, wenn dies hier erscheint..."; 
else:
    echo "dann legst dir nieder, des is ja falsch!";
endif;


Wenn du das hier nimmst,

PHP:
if(0 === "test"):
    echo "dann darf DIES hier nicht zutreffen!"; 
else:
    echo "dann unterscheiden sich beide Werte sowohl vom Inhalt, als auch vom Typ her!";
endif;


Nimmste jetzt aber spaßeshalber das,

PHP:
if("0" == null):
    echo "dann MUSS das wahr sein, denn 0 ist hier ein Integer als auch String, was null weder noch ist!"; 
else:
    echo "dann wirste von PHP wirklich ganz übel aufs Kreuz gelegt...";
endif;


Des ist eigentlich ganz simpel^^

Es gibt aber auch noch ne Besonderheit... Wenn man jetzt z.B. eine Konstante erstellt...

PHP:
define("test", null); 

if(null === test):
   echo "Ei, verbibbsch, des is ja wahr!";
else:
   echo "hah, UNWAHR!";
endif;

Dann wird man sehn, dass test gleich null ist - denn "test" ist in dem Fall eine konstate mit einem Inhalt und keine simple Wertangabe, wie in den obrigen Beispielen, wo keine Variable ist, die den Wert "test" beinhaltet. Nimmt man define("test", null); wieder raus, würde das Ergebnis Unwahr lauten.


Und, alle Klarheiten beseitigt? ;)
 
TchiboMann schrieb:
Darum gibt es bei PHP drei unterschiedliche Operatoren:

= -> ungleich
== -> gleich (egal ob 0 und "null" sich vom Typ her unterscheiden!)
=== -> identisch (hier muss Inhalt UND Typ gleich sein! also "0" === "0" und "Test" === "Test", nicht "0" === "null")

Gefährliches Halbwissen?
= ist in PHP ein Zuweisungsoperator und vermutlich auch in keiner anderen Sprache des Universums ein ungleich Operator (außer vllt in irgendeiner esoterischen Sprache ;))

== führt einen typschwachen Vergleich durch
=== führt einen typstarken Vergleich durch

!= wäre der ungleich Operator, aber nur mit einem typschwachen Vergleich
!== wäre der ungleich Operator, mit einem typstarken Vergleich


so long
Renegade
 
So siehts aus, hab mich schon gewundert.

In der Shell-Programmierung unter Unix/Linux ist das einfache Gleichheitszeichen übrigens auch gerne mal ein Vergleichsoperator, aber moderne Programmiersprachen bei denen das so ist kenne ich keine.

edit: Wenn ich mir TchiboManns Post aber nochmal durchlese, dann denke ich, dass er es schon richtig gemeint hat.. beim ungleich-Operator ausversehen das Ausrufezeichen weggelassen, und die Beschreibung des Typstarken Vergleichs klingt erst komisch, stimmt aber.
 
Zuletzt bearbeitet:
Gefährliches Halbwissen - jein, des funktioniert eben, obwohl das absolut unschön ist. Auf jeden Fall funktionierte das damals, als ich mit PHP begann, aber habs so jaaaaahrelang nicht mehr genutzt, immer nur != und !==. In einer IF-Abfrage nutz ich sowieso absolut ungerne irgendwelche Zuweisungen.

Jedenfalls, sollte nicht so rüberkommen, dass man das so nutzen kann/soll, sorry für die Ungenauigkeit. Und ja, stimmt, ich hätte noch != und !== erwähnen müssen^^
 
Zuletzt bearbeitet:

Ähnliche Themen

N
Antworten
12
Aufrufe
1.309
Nichael-E
N
Antworten
4
Aufrufe
842
Antworten
6
Aufrufe
1.963
Antworten
7
Aufrufe
1.061
Zurück
Oben