PHP contra Perl



  • 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.


  • Mod

    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


Anmelden zum Antworten