PHP contra Perl
-
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.
-
Mein Gott, PHP ist eben anders als andere Sprachen und wer damit programmiert, soll damit leben oder sich eine andere Sprache aussuchen. Damit es geklärt ist, man lese das hier und das hier und vielleicht das hier bzgl Typen