PHP contra Perl
-
Optimizer schrieb:
"abc" == 0 und 0 == "xyz"
"abc" == "xyz"
jetzt seh ichs
aber dennoch, kein kriterium für oder gegen die Sprache. Es liegt an der Anwendung, ob == oder sonst ein Vergleichsoperator aufgerufen wird.
Das ist nur Syntax.
-
Optimizer schrieb:
Kann ich nicht nachvollziehen. Ich sehe keine Notwendigkeit "foo" den numerischen Wert 0 zu verpassen. Man hätte den Vergleich 0 == "bar" besser einfach negativ ausfallen lassen sollen und von mir aus 0 == "0" positiv.
Welchen int wert sollte bar denn deiner meinung nach haben?
Man koennte natuerlich nan einfuehren, aber das haette wiederum die komplexitaet erhoeht. denn dann waere ein
var);
nicht mehr moeglich, dann wuerde das uU nan liefern und wir muessten es als
var); if($foo==nan) $foo=0;
schreiben.waere irgendwie doof.
dass intval("foo") zu 0 wird ist auch praktisch, weil 0 eine legale zahl ist und idR einen guten defaultwert abgibt. wenn man das nicht will, kann man immer noch mit is_numeric(var) : $defaultwert; arbeiten.
0 ist per definition in PHP etwas ungueltiges -> leeres. Das erkennt man zB an
v)==true;wir koennen uns natuerlich streiten ob nan hier vielleicht besser waere. das mag sein, mag aber vielleicht auch nicht sein. denn nan bringt eben das problem einer undefinierten zahl mit sich, sowas kann laestig sein.
die transitivitaet wurde bewusst aufgegeben um dem programmierer etwas bequemlichkeit zu schenken.
fuer die wenigen faelle wo das eine rolle spielt, gibt es den op=== mit expliziten casten -> strval(b)
Wieso? Ich bin von der Dokumentation ausgegangen, die etwas mit "Gleichheit" verspricht. Also bin ich von Gleichheit ausgegangen und das ist definiert. Dabei spielt es keine Rolle, wie die Prüfung in der Praxis durchgeführt wird.
Dann nenne es meinetwegen einen Bug in der Doku
Der Begriff Gleichheit ist viel abstrakter definiert und beschreibt nur das Verhalten der Relationen. Und wie gesagt, ich habe noch nirgendwo gesehen, dass das verletzt wird.
Oh, ist ganz einfach das zu verletzen: man nehme einen case insensitiven string der von einem sensitiven erbt.
schont hat man
insensitiv ins="hallo";
sensitiv sen="Hallo";
sensitiv sen2="hallO";
ins==sen
ins==sen2
sen!=sen2hier haengt man also auch schon an diesem problem... laesst sich natuerlich loesen, keine frage.
Das Problem das man hat: der wert einer variablen haengt vom kontext ab. Und ein ungueltiger int wert wird oft als 0 angenommen -> zB in VB oder auch bei der C Funktion atoi()
Trotzdem darf ich ja wohl sagen, dass es mich schon stört.
natuerlich darfst du es sagen. aber in PHP ist es halt so definiert, dass sich der wert einer variablen von kontext zu kontext unterscheiden kann.
wenn intval("foo") == NAN waere, dann haettest du folgendes problem:
NAN == "foo"
NAN == "bar"
"foo" != "bar"in PHP ist der op== halt so definiert:
(is_numeric(a) && is\_numeric(b)) || (is_int(b)) ? intval(b) : b;aber bei einem gebe ich dir recht: es koennte in der doku ruhig etwas expliziter dort stehen.
tatsache ist aber: mir ist es noch nie passiert, dass ich wegen der nicht transitivitaet einen bug oder sonstige probleme hatte oder je gesehen habe.
andererseits habe ich aber schon oft von einem intval("foo) == 0 oder 0=="foo" profitiert.
Edit:
Falls du unterschrieben haben willst, dass PHP unschoen ist -> mache ich sofort.
Allerdings sind viele dieser unschoenheiten verdammt oft verdammt praktisch...
-
Shade Of Mine schrieb:
Welchen int wert sollte bar denn deiner meinung nach haben?
Man koennte natuerlich nan einfuehren, aber das haette wiederum die komplexitaet erhoeht. denn dann waere ein
var);
nicht mehr moeglich, dann wuerde das uU nan liefern und wir muessten es als
var); if($foo==nan) $foo=0;
schreiben.waere irgendwie doof.
Ich würds ja eigentlich besser finden, wenn die zahl in einen string gecastet würde. Das wäre zumindest immer möglich. Macht man wahrscheinlich aber nicht so oft, wie umgekehrt und anscheined soll beim PHP programmieren alles ohne Zutun des Programmierers geschehen.
0 ist per definition in PHP etwas ungueltiges -> leeres. Das erkennt man zB an
v)==true;0 ist mir in PHP (wie auch in C++, nur dort nicht ganz so schlimm) zu viele Sachen.
Doku (sinngemäß) schrieb:
strpos liefert FALSE, falls der Teilstring nicht gefunden wird.
Wir haben jetzt also:
"nicht gefunden" == FALSE == 0 == "an der Stelle 0 gefunden".
Und so läuft es dann auch. Wenn du am Anfang des Strings deinen Teilstring findest, kriegste FALSE. Jetzt kann man natürlich streiten, ob es nicht doch an strpos liegt und nicht an PHP.Letztlich ist die Ursache für die meisten Unschönheiten IMHO das Typsystem. Da wurde schon einiges mehr als die Transitivität von == aufgegeben, um mit dem nicht-Typsystem vernünftig arbeiten zu können. Und was ist der Gewinn? Ich sehe keinen. Vielleicht ist es für die Script-Kiddies ein Gewinn, ich weiß es nicht.
Mich würde mal interessieren, ob das in Perl ein bisschen besser gelöst ist. Vielleicht schau ich mir das doch mal an.
Oh, ist ganz einfach das zu verletzen: man nehme einen case insensitiven string der von einem sensitiven erbt.
Ehrlich gesagt finde ich das eine etwas seltsame Vererbungsbeziehung.
Wie auch immer, ich bestreite ja nicht, dass du mit C++ oder C# einen "komischen" op== bauen kannst. Spätestens mit return rand()%2 == 0 wird dir das schon gelingen. Aber standardmäßig werden solche Regeln keinesfalls verletzt und ich kann mir auch nicht vorstellen, dass du mal in eine so blöde Situation kommst, dass du das willst.Das Problem das man hat: der wert einer variablen haengt vom kontext ab. Und ein ungueltiger int wert wird oft als 0 angenommen -> zB in VB oder auch bei der C Funktion atoi()
Das ist genau das, was man beim Design moderner Programmiersprachen und Bibliotheken vermeidet. Wobei modern relativ ist, eigentlich vermeidet man so etwas schon seit C++... ich frage mich, ob das einen Grund hat?
Allerdings sind viele dieser unschoenheiten verdammt oft verdammt praktisch...
Es ist halt nicht meins. Dafür bin ich zu idealistisch.
-
Optimizer schrieb:
Ja:
"abc" == 0 und 0 == "xyz"
"abc" == "xyz"
Die Folgerung funktioniert aber in PHP nicht, liefert also false, obwohl die beiden Vorausetzungen true geliefert haben. Dass der op== in PHP sich nicht transitiv verhält, bestreitet ja Shade auch nicht. Ihn stört es nur nicht, mich halt schon. Das heißt natürlich nicht, dass ich für "abc" == "xyz" true haben will, sondern mich stört natürlich das ... == 0.
Aber egal, das hab ich ja jetzt gesagt und das darf jeder finden wie er will.
wenn du schon mit Äquivalenzrelationen argumentierst, dann sollest du auch konsistenz bleiben. Mathematisch gesehen muss das auch nicht gelten, weil "abc" und 0 in 2 unterschiedlichen Mengen liegen, somit ist nicht eindeutig definiert, ob "abc" == "xyz". Wären "abc" und 0 (und "xyz" und 0) in der geleichen Menge, dann würde "abc"=="xyz" gelten. Also wäre == sehr wohl transitiv.
PHP geht ein Stückchen im vor und wenn er merkt, dass "xyz" und 0 nicht in der gleichen Menge liegen, dann gibt es eine Typumwandlung. Somit ist die Folgerung "xyz"=="abc" nicht notwendig zu erfüllen.
"abc" == 0 und 0 == "xyz"
(int) "abc" == (int) "xyz"
gilt, PHP wandelt "abc" und "xyz" in ints, sie sind nach PHP Definitionen 0 und somit ist == transitiv, sobald alle Operanden (links und rechts) sich in der gleichen Menge befinden.
Kann ich nicht nachvollziehen. Ich sehe keine Notwendigkeit "foo" den numerischen Wert 0 zu verpassen. Man hätte den Vergleich 0 == "bar" besser einfach negativ ausfallen lassen sollen und von mir aus 0 == "0" positiv.
Kannst du nicht akzeptieren, dass es andere Sprachen gibt, die andere Ansätze haben als deine? In PHP ist es jedenfalls so und wer mit PHP arbeitet soll damit leben, sonst eine andere Sprache wählen.
-
PHP geht ein Stückchen im vor und wenn er merkt, dass "xyz" und 0 nicht in der gleichen Menge liegen, dann gibt es eine Typumwandlung. Somit ist die Folgerung "xyz"=="abc" nicht notwendig zu erfüllen.
Das stimmt jetzt nicht, denn 0 und "xyz" liegen in der selben Menge, amsonsten könntest du den Vergleich gar nicht durchführen. Der Begriff "Typumwandlung" existiert im mathematischen Sinne so nicht und in PHP ist er auch mit Vorsicht zu genießen.
Wenn ich "abc" mit 0 vergleichen kann und "xyz" mit 0, dann muss ich auch "abc" mit "xyz" vergleichen können, sonst kann es ja allein schon keine Äquivalenzrelation sein. Du dagegen folgerst einfach mal daraus, dass, weil es nicht vergleichbar ist, die Folgerung einfach nicht zu erfüllen ist. Nene. Das ist erst schon mal grundlegende Voraussetzung für eine Äquivalenzrelation.Kannst du nicht akzeptieren, dass es andere Sprachen gibt, die andere Ansätze haben als deine? In PHP ist es jedenfalls so und wer mit PHP arbeitet soll damit leben, sonst eine andere Sprache wählen.
Wo ist denn dein Problem? Ich habe gesagt, was mich an PHP stört und dafür muss ich mich jetzt seit 3 Seiten bis ins Detail rechtfertigen. Ich muss sogar erstmal mathematisch begründen, was ich von einem Gleichheitszeichen erwarte, obwohl man woanders nirgendwo etwas anderes erwarten würde. Und diese Erwartung wird hier nicht erfüllt und das stört mich. Mehr habe ich nicht gesagt.
Und das mit "andere Sprache wählen" ist evtl. nicht so leicht. Vielleicht kennst du nen kostenlosen JSP-Server?
-
Optimizer schrieb:
Vielleicht kennst du nen kostenlosen JSP-Server?
Meinst Du einen Server, sprich Container? Dann http://jakarta.apache.org/tomcat/
Meinst Du einen Provider, dann geb ich dir recht. Servlets und JSP sind halt zu kompliziert und komplex für den normalen "Webdesigner".
Mich pers. stört das Variablenhandling in PHP weniger, weil die gesamte Sprache halt auch sehr einfach gehalten ist. PHP soll ideal für einfache Aufgaben wie normale Websites sein.
Aber trotzdem: Servlets + Struts sind das genialste was es für's Web gibt und wahrscheinlich auch das schnellste.
<disclaimer>Ein in C geschriebenes Apache-Modul oder eigener Server ist natürlich schneller.</diclaimer>
-
Optimizer schrieb:
PHP geht ein Stückchen im vor und wenn er merkt, dass "xyz" und 0 nicht in der gleichen Menge liegen, dann gibt es eine Typumwandlung. Somit ist die Folgerung "xyz"=="abc" nicht notwendig zu erfüllen.
Wenn ich "abc" mit 0 vergleichen kann und "xyz" mit 0, dann muss ich auch "abc" mit "xyz" vergleichen können, sonst kann es ja allein schon keine Äquivalenzrelation sein. Du dagegen folgerst einfach mal daraus, dass, weil es nicht vergleichbar ist, die Folgerung einfach nicht zu erfüllen ist. Nene. Das ist erst schon mal grundlegende Voraussetzung für eine Äquivalenzrelation.
weil 0 und "abc" mathematisch nicht vergleichbar ist, wird "abc" in int umgewandelt. == kann auch 0 und "abc" nicht vergleichen, es ist in Wirklichkeit so, als würdest du 0 == (int) "abc" machen und nach PHP ist (int) "beliebige Zeichenkette, die Zeichen enthälten, die keine Zahlen sind" das gleiche wie 0. Und dann kann == die linke 0 mit der rechten 0 vergleichen.
-
Webentwickler schrieb:
Meinst Du einen Provider, dann geb ich dir recht. Servlets und JSP sind halt zu kompliziert und komplex für den normalen "Webdesigner".
Ja, ich meine schon einen Provider. Ich will nämlich nicht 24h bei mir ne Kiste laufen haben.
supertux schrieb:
weil 0 und "abc" mathematisch nicht vergleichbar ist, wird "abc" in int umgewandelt. == kann auch 0 und "abc" nicht vergleichen, es ist in Wirklichkeit so, als würdest du 0 == (int) "abc" machen und nach PHP ist (int) "beliebige Zeichenkette, die Zeichen enthälten, die keine Zahlen sind" das gleiche wie 0. Und dann kann == die linke 0 mit der rechten 0 vergleichen.
Nein, du mogelst dich vorbei. Wenn du a mit vergleichen kannst und b mit c dann musst du auch a mit c vergleichen können, sonst ist es schon mal sicher keine Äquivalenzrelation.
Du dagegen sagst "wenn ich a mit c nicht vergleichen kann, dann muss die Folgerung nicht erfüllt sein und es kann trotzdem eine Äquivalenzrelation sein", was natürlich Unsinn ist. Den letzten Satzteil "... und es kann trotzdem eine Äquivalenzrelation sein" habe ich zugegebenermaßen selber eingefügt, denn wenn du auch der Meinung wärst, dass == nicht transitiv ist, würdest du wohl kaum mit mir diskutieren, oder?
-
@Webentwickler: Über mysteriöse Quellen bin ich gerade auf das hier gestoßen:
http://www.myjavaserver.com/habs aber noch nicht näher angesehen.
-
Optimizer schrieb:
Du dagegen sagst "wenn ich a mit c nicht vergleichen kann, dann muss die Folgerung nicht erfüllt sein und es kann trotzdem eine Äquivalenzrelation sein", was natürlich Unsinn ist.
das ist kein Unsinn, hab lange Zeit mit Äquivalenzklassen und in Algebra viel damit rumgerechnet; du verstehst nicht, was ich meine. A ==> B heißt, dass wenn A gilt so B. Wenn aber A nicht gilt, dann weiß man nicht, ob B gelten muss, vielleicht ja, vielleicht nicht. Und hier meine ich dasselbe.
Mathematisch gesehen kann eine Äquivalenzrelation nur Elementen der selben Menge vergleichen. Sei ~ eine Äquivalnezrealtion auf M und a,b,c Elemente in M. a~b und b~c ==> a~c. Ja, das muss per Definition gelten. Sei d aber Element von einer Menge, die nicht M ist auf die ~ gleich definiert ist wie auf M und du hast: a~d und d~c dann weißt du nicht, ob a~c, es kann gelten oder kann nicht gelten, das weiß man eben nicht.
Bei PHP wäre es dasselbe, wenn es keine Typunwandlung gäbe. In C/C++ ist aber nicht der Fall, weil man explizit umwandeln muss, wenn man bspweise int und floats vergleichen will. D.h. sobald du dem == von PHP 2 Elemente gleicher Menge übergist.
-
Optimizer schrieb:
@Webentwickler: Über mysteriöse Quellen bin ich gerade auf das hier gestoßen:
http://www.myjavaserver.com/habs aber noch nicht näher angesehen.
Wir haben einen eigenen Server. Daher stellt sich mir dieses Problem nicht mehr. Server bekommst Du schon ab 20 € bei seriösen Anbietern. Ist also auch nicht die Welt. Nachteil: Server will gepflegt sein.
-
Mathematisch gesehen kann eine Äquivalenzrelation nur Elementen der selben Menge vergleichen.
Gehst du immer noch davon aus, dass die Elemente nicht in der selben Menge liegen? Das war mir nicht klar. Davon gehe ich allerdings nicht aus, bzw. ist meine Erwartungshaltung an den op== so nicht gewesen. Ist doch auch völlig logsich.
Warum sollte ich vom op== erwarten, dass er sich "seltsam" verhält, weil die Elemente nicht in der selben Menge liegen? Was für eine andere Menge soll das überhaupt sein? Weil du das Beispiel mit ints und floats in C++ gebracht hast:Lässt man die Ungenauigkeit von floats weg, verhält sich der op== absolut transitiv. Das hat auch mit den Typ überhaupt gar nichts zu tun. Wenn die Typen vergleichbar sind, kann ich eine Menge vergleichbarer Typen bilden und feststellen, ob der op== darauf eine Äquivalenzrelation ist. Und ich stelle fest, in PHP ist er keine. Und Shade sagt sogar, das wurde mit Absicht aufgegeben.
Ich sehe jedenfalls nicht, was das mit konkreten Typen zu tun haben soll. Willst du abstreiten, dass <string> mit <string> in PHP vergleichbar ist? Oder <string> mit <zahl> ?
das ist kein Unsinn, hab lange Zeit mit Äquivalenzklassen und in Algebra viel damit rumgerechnet; du verstehst nicht, was ich meine.
Du bist ja nicht der einzige Student.
Jetzt verstehe ich glaub ich schon besser, was du meinst. Ich kann mich aber wie gesagt nicht dem anschließen, dass die Elemente nicht in der selben Menge liegen sollen. Ich bilde eine Menge M aller Elemente, die in PHP vergleichbar sind.
In C++ kann ich auch erstmal praktisch alles vergleichen und bei eigenen Klassen kann ich regeln, mit was sie vergleichbar sind und da entsprechend eine Menge vergleichbarer Typen bilden. Und da achte ich dann natürlich auf Transitivität beim op== innerhalb dieser Menge.
-
Optimizer schrieb:
Mathematisch gesehen kann eine Äquivalenzrelation nur Elementen der selben Menge vergleichen.
Gehst du immer noch davon aus, dass die Elemente nicht in der selben Menge liegen? Das war mir nicht klar. Davon gehe ich allerdings nicht aus, bzw. ist meine Erwartungshaltung an den op== so nicht gewesen. Ist doch auch völlig logsich.
aha, jetzt verstehe ich dich, denn wir gehen offensichtlich von anderen Definitionen aus. Für mch bedeutet "nicht in der gleichen Menge", dass 0 in der Menge der Zahlen liegt und "abc" in der Menge der Zeichenketten.
-
Optimizer schrieb:
Das stimmt jetzt nicht, denn 0 und "xyz" liegen in der selben Menge, amsonsten könntest du den Vergleich gar nicht durchführen.
Hallo? Wovon rede ich eigentlich die ganze Zeit?
Gib es auf, du willst es nicht verstehen, deshalb ist jede Diskussion von vornherein zum scheitern verurteilt und mich mit ScriptKiddies zu vergleichen bringt dir da auch kaum Pluspunkte...
[quote[Der Begriff "Typumwandlung" existiert im mathematischen Sinne so nicht und in PHP ist er auch mit Vorsicht zu genießen.[/quote]
Klar, es gibt keine Typumwandlung. Nur doof dass ++ in der mathematik auch nicht existiert. dh, jede C basierende Sprache ist unlogisch. Halleluja.Wenn ich "abc" mit 0 vergleichen kann und "xyz" mit 0, dann muss ich auch "abc" mit "xyz" vergleichen können, sonst kann es ja allein schon keine Äquivalenzrelation sein.
int main() { void* v; int* i; char* c; v==i; v==c; c==i; }
Wo ist denn dein Problem? Ich habe gesagt, was mich an PHP stört und dafür muss ich mich jetzt seit 3 Seiten bis ins Detail rechtfertigen.
Falsch. Du hast gesagt dass PHP unlogisch sei. Und das musst du logischerweise rechtfertigen (was natuerlich bei diesem Beispiel unmoeglich ist, weil man den op== definieren kann wie man will, man also nicht zwangslaeufig deiner logik folgen muss (logik ist uebrigens nicht absolut)) Du kannst hoechstens ankreiden, dass die php Doku ungenau sei, wenn sie von Gleichheit spricht.
Ich muss sogar erstmal mathematisch begründen, was ich von einem Gleichheitszeichen erwarte
Bingo! Du hast es erfasst: was du erwartest.
Zu dumm, dass du nicht das mass aller dinge bist.obwohl man woanders nirgendwo etwas anderes erwarten würde.
Siehe mein C++ Beispiel.
Und diese Erwartung wird hier nicht erfüllt und das stört mich. Mehr habe ich nicht gesagt.
deine erwartung. PHP verhaelt sich hier genauso wie ich es erwarte.
Du bist ja nicht der einzige Student. Jetzt verstehe ich glaub ich schon besser, was du meinst. Ich kann mich aber wie gesagt nicht dem anschließen, dass die Elemente nicht in der selben Menge liegen sollen. Ich bilde eine Menge M aller Elemente, die in PHP vergleichbar sind.
Das ist falsch. Siehe mein C++ Beispiel.
wenn a==b und a==c wie kann dann b==c nicht gehen? Ist doch unlogisch, oder?Nur zu dumm, dass du ganz auf Typumwandlung vergisst. Das zerstoert naemlich deine gesamte annahmen
-
Du kannst hoechstens ankreiden, dass die php Doku ungenau sei, wenn sie von Gleichheit spricht.
Dann lassen wir es dabei. Das war eigentlich auch die ganze Zeit der Punkt, dass es sich nicht um echte Gleichheit handelt, die definiert ist und zwar nicht von mir.
Bingo! Du hast es erfasst: was du erwartest.
Zu dumm, dass du nicht das mass aller dinge bist.Zu dumm, dass ich das auch nicht behauptet habe. Ich habe nur gesagt, dass, wenn ich was von Gleichheit lese, dass ich Gleichheit erwarte. Vielleicht hätte ich nicht gleich daraus folgern sollen, dass PHP deswegen unlogisch ist, das lass ich mir ja noch eingehen. Letztlich habe ich mich dann eh darauf beschränkt, dass es mich stört, weil es mathematisch nicht korrekt ist. Wenn das in PHP nie so geplant war, bin ich aufgrund der Doku von einer falschen Annahme ausgegangen.
Das Problem mit deinem Beispiel verstehe ich nicht. Ich habe die ganze Zeit gesagt, dass die Typen irrelevant sind. Relevant ist nur, ob sie sich vergleichen lassen und wenn ja, dann bilde ich eine Menge miteinander vergleichbarer Elemente. In PHP ist ein string mit einer Zahl vergleichbar, also kann ich eine Menge vergleichbarer Elemente bilden und feststellen, dass == keine Äquivalenzrelation ist.
Mit den konkreten Typen hat das nichts zu tun. Und noch einmal: JA, ich kann in C# einen operator== schreiben, der einen Zufallswert zurückgibt. Das ist trotzdem kein Argument.Klar, es gibt keine Typumwandlung. Nur doof dass ++ in der mathematik auch nicht existiert. dh, jede C basierende Sprache ist unlogisch. Halleluja.
Also bitte, das ist doch jetzt nur noch an den Haaren vorbei gezogen. Du sagst auf ironische Art, dass C unlogisch ist, weil es ++ gibt. Das ist es aber nicht, weil ++ eine Erfindung von C ist. Wenn ich aber sage "foo prüft a und b auf Gleichheit" dann ist mit dem Begriff "Gleichheit" eine gewisse Erwartungshaltung verbunden, die unter anderem darauf fußt, dass Gleichheit, im Gegensatz zu ++ definiert ist und auch nicht explizit in der Doku anders definiert wurde.
-
Optimizer schrieb:
Das Problem mit deinem Beispiel verstehe ich nicht. Ich habe die ganze Zeit gesagt, dass die Typen irrelevant sind. Relevant ist nur, ob sie sich vergleichen lassen und wenn ja, dann bilde ich eine Menge miteinander vergleichbarer Elemente.
du sagst, dass 0 == "abc" eigentlich nicht gehen müsste und "logische" Sprachen wie C++ sowas nicht machen würde. Oben ist ein Beispiel, bei dem ein char* mit einem int* vergliechen wird, und char* und int* sind unterschiedlich. Also kann man in C/C++ auch unterschiedlichen Typen vergleichen. Auch sowas ist möglich.
char c = 'A'; int x = -8; c==x;
wie kann C ein Zeichen mit einer Zahl vergleichen? Unlogisch, oder? In C++ kannst du == überladen und da kannst könnte ich die ein Bsp anbieten, bei dem deine Transitiviät nicht erfüllt ist.
Optimizer schrieb:
Du sagst auf ironische Art, dass C unlogisch ist, weil es ++ gibt. Das ist es aber nicht, weil ++ eine Erfindung von C ist.
dann sagen wir mal so: 0 == "abc" ist eine Erfindung von PHP und solche typlosen Sprachen.
-
supertux schrieb:
du sagst, dass 0 == "abc" eigentlich nicht gehen müsste und "logische" Sprachen wie C++ sowas nicht machen würde.
Das sage ich nicht. Bitte sieh in Zukunft davon ab, mir was in den Mund zu legen.
-
Auch wenn ich dafür jetzt von mindestens fünf Seiten bombardiert werdet:
Findet ihr nicht, dass sich eure Diskussion auf einem sehr ähmmm... abstrakten Niveau bewegt?
php.net schrieb:
If you compare an integer with a string, the string is converted to a number. If you compare two numerical strings, they are compared as integers.
Damit ist (wie auch schon eine ganze Reihe Posts zuvor) eigentlich alles gesagt. Und "==" bleibt in diesem Fall auch eine Äquivalenzrelation. Denn es wird nicht "abc" bzw. "xyz" mit 0, sondern jeweils 0 mit 0 verglichen. Und aus 0 == 0 und 0 == 0 lässt sich verständlicherweise nicht "abc" == "xyz" folgern. Damit ist dies auch kein Gegenbeispiel für eine Transitivität mehr.
PHP hat auch nie den Anspruch erhoben, dass "==" der mathematischen Äquivalenz entspricht. Es ist schlichtweg eine Abbildung aus der Menge aller Paare aller mgl. Variablenwerte in die Menge der Wahrheitswerte.
-
Dasd schrieb:
PHP hat auch nie den Anspruch erhoben, dass "==" der mathematischen Äquivalenz entspricht. Es ist schlichtweg eine Abbildung aus der Menge aller Paare aller mgl. Variablenwerte in die Menge der Wahrheitswerte.
so sehe ich das auch.
-
Es steht ja auch nirgendwo, das "xyz" mit 0 verglichen werden kann...
Oder ich habe echt falsches php gelernt
Und ich hab auch gelernt, das man mit == nicht 2 gleiche Typen vergleicht, sondern im Zweifelsfall(wenn also keine gleichen Typen bestehen) einen Teil(hier: Der string) nach PHP Konventionen Umgewandelt um verlgeichen zu können.
Willst du dein Beispiel Durchsetzen müsste es (glaub ich ;)) so sein:
"abc" !== 0
"xyz" !== 0
"abc" !== "xyz"Und ja: Das ganze wurde so schonmal gesagt, ich will nur meinen senf dazu geben, auch auf die gefahr mich unbeliebt zu machen.