Was bedeutet !==
Michael
- php
0 romy0 David Tibbe0 Richard Voß
Hab mal ne Frage. Was bedeutet !== im folgenden Ausdruck?
while (false !== ($dirfile = readdir ($handle)))
Danke
Hi,
while (false !== ($dirfile = readdir ($handle)))
solange es noch was zu lesen gibt :)
m.E. kann man das Zweite = weglassen.
readdir liesst alle Dateien eines Verzeichnisses aus, und wenn es nichts merh zu lesen gibt, weil keine Dateien mehr enthalten sind, soll die schleife abbrechen.
romy
while (false !== ($dirfile = readdir ($handle)))
m.E. kann man das Zweite = weglassen.
Nein, auf keinen Fall. PHP ist in der Lage, Variablen automatisch von einem Typ in einen anderen umzuwandeln, aus einem Text "123" kann also, wenn notwendig, die Zahl 123 werden. Das mag recht praktisch erscheinen, hat allerdings auch seine Tücken, wie in diesem Beispiel.
readdir() gibt entweder den Namen eines Verzeichniseintrags zurück oder aber den (boolschen) Wert false, sobald das Ende des Verzeichnisses erreicht ist. Der boolsche Wert false entspricht aber in PHP auch dem Text "", dem Text "0", der Zahl 0 und womöglich auch noch dem Text "false".
Mit dem "normalen" Vergleich != würde man über diese automatische Typenumwandlung stolpern, sobald beispielsweise ein Verzeichniseintrag namens "0" gelesen wurde: Der Vergleich != interpretiert den Text "0" als false, die Schleife bricht ab.
Die Operatoren !== und === nehmen hingegen zusätzlich zur Wertprüfung noch einen Vergleich des Typs vor, so daß der Vergleich oben wirklich nur auf das boolsche false anspricht und nicht auf irgendwelche gleichwertigen anderen Daten.
Und weil's so schön war: In der PHP-Anleitung ist genau dieser Sachverhalt in einem Satz erklärt.
Gruß,
soenk.e
Hallo Michael. <-- Dies ist eine begrüßung. Du has sie vergessen!
Hab mal ne Frage. Was bedeutet !== im folgenden Ausdruck?
Lies doch im Manual nach. Dort stößt du auf:
<quote src="http://de3.php.net/manual/de/language.operators.comparison.php">
Bsp: $a !== $b
Name: Nicht identisch
Ergebnis: Gibt TRUE zurück, wenn $a nicht gleich $b ist, oder wenn beide nicht vom gleichen Typ sind (nur PHP 4).
</quote>
Grüße
David
Hab mal ne Frage. Was bedeutet !== im folgenden Ausdruck?
while (false !== ($dirfile = readdir ($handle)))
Das ist wieder etwas schreckliches, was nur in PHP vorkommen kann. Sönke hat das sehr genau erklärt. Diese Zeile springt den normaldenkenden Menschen natürlich sofort an und man fragt sich, warum das nicht equivalent zu
while( $dirfile = readdir($handle) )
ist. Das legt die konzeptionellen Schwächen von PHP offen und widerstrebt jeder bequemen Lesbarkeit des Codes. Ich persönlich finde soetwas grauenhaft.
=== und !=== überprüfen also zunächst Typgleichheit, wodurch (wie gesagt wurde) ungewollte Typkonvertierung vermieden wird. (Heisst nämliche eine Datei "0", würde meine Codezeile das als Ende des Verzeichnisses interpretieren.)
Aber damit die Verwirrung durch diese Überladenheit(warum kann das nicht via isset passieren, wie es in Perl mit defined sehr gut geht?) noch nicht beendet ist, beschreibt das PHP manual den '===' Operator als Prüfung auf Identität (http://php4.globe.de/manual/en/language.operators.comparison.php), was natürlich nicht stimmt, denn $a und $b sind nicht "identisch", das wären sie, wenn $a = & $b...
Abr lass dich davon nicht verwirren. So ist es und vermutlich wird PHP irgendwann auch solche Kinderkrankheiten ablegen.
Abr lass dich davon nicht verwirren. So ist es und vermutlich wird PHP irgendwann auch solche Kinderkrankheiten ablegen.
Mehr als fraglich, denn die Typenlosigkeit ist essentieller Bestandteil von PHP, wie übrigens auch anderer Sprachen, die schnell und einfach zum Ergebnis führen sollen (Stichwort: BASIC).
Gruß,
soenk.e
Abr lass dich davon nicht verwirren. So ist es und vermutlich wird PHP irgendwann auch solche Kinderkrankheiten ablegen.
Mehr als fraglich, denn die Typenlosigkeit ist essentieller Bestandteil von PHP, wie übrigens auch anderer Sprachen, die schnell und einfach zum Ergebnis führen sollen (Stichwort: BASIC).
Die Typenlosigkeit ist nicht das Problem, aber diese flickenartige Umsetzung, diese exotischen Operatoren === mit ihren noch exotischeren Aufgaben, die dann zu den exotischsten Konstrukten (wie der besprochene) führen.
In Perl kann ich schreiben:
while(defined( my $file = readdir( $handle ) ){
Warum geht in PHP nicht:
while(isset( $file = readdir( $handle ) )
? PHP hat nun wirklich kein Programmierkonzept neu erfunden. Was PHP kann, ist bekannt: schlichte prozedurale Programmierung und OO. Warum braucht PHP dann einen === Operator und Java nicht, warum hat Perl keinen, warum hat Python keinen? Weil er überflüssig ist.
Hallo Richard,
In Perl kann ich schreiben:
while(defined( my $file = readdir( $handle ) ){
Warum geht in PHP nicht:
while(isset( $file = readdir( $handle ) )
Ganz einfach: readdir gibt im Fehlerfall false zurück - und das ist ein Wert des Datentyps bool. Isset prüft dagegen nur, ob eine Variable _existiert_. Nachdem ich dieser Variable aber einen Wert zugewiesen habe, muss diese Zwangsläufig existieren. Ich erachte hier die Perl-Variante für unlogischer, da die Variable $file ja eigentlich zwangsläufig existieren müßte, wenn ich ihr etwas zuweise.
Aber wenn es Dich so sehr stört:
function is_not_false ($var) {
return $var !== false;
}
while (is_not_false ($file = readdir ($handle))
Warum braucht PHP dann einen === Operator und Java nicht,
Weil Java streng typisiert ist. (oder wie das jetzt genau heißt) Eine Variable, die einmal definiert ist, kann ihren Typ nicht mehr ändern, [1] man muss den Typ der Variable sogar beim Erstellen der Variable angeben.
warum hat Perl keinen,
Weil es in Perl nur wenige Haupttypen an Variablen gibt: Skalare, Listen, Hashes, Dateidesktriptoren, Objekte und Referenzen. Eine Zahl, ein Bool-Wert und eine Zeichenkette werden alle durch den gleichen "Typ" repräsentiert.
Weil er überflüssig ist.
Nur, wenn keine implizierte Typkonvertierung (von Variablen selbst) stattfindet (Java) oder die Sprache überhaupt keine verschiedenen skalaren Typen kennt. (Perl)
Ich halte den Identitätsoperator innerhalb des Variablen- und Typkonzepts von PHP durchaus für eine logische Notwendigkeit. Dass Dir das Typkonzept nicht unbedingt gefallen muss, ist eine andere Sache.
Viele Grüße,
Christian
[1] Kindklassen lasse ich jetzt einmal unter den Tisch fallen.
Hallo Richard,
In Perl kann ich schreiben:
while(defined( my $file = readdir( $handle ) ){
Warum geht in PHP nicht:
while(isset( $file = readdir( $handle ) )
Ganz einfach: readdir gibt im Fehlerfall false zurück - und das ist ein Wert des Datentyps bool. Isset prüft dagegen nur, ob eine Variable _existiert_. Nachdem ich dieser Variable aber einen Wert zugewiesen habe, muss diese Zwangsläufig existieren. Ich erachte hier die Perl-Variante für unlogischer, da die Variable $file ja eigentlich zwangsläufig existieren müßte, wenn ich ihr etwas zuweise.
Nein, denn in Perl heisst die Funktion defined(), sie prüft also auf Definiertheit, nicht Existenz. In PHP gibt es kein Äquivalent, am näcshten kommt dem isset.
Aber wenn es Dich so sehr stört:
function is_not_false ($var) {
return $var !== false;
}while (is_not_false ($file = readdir ($handle))
Das springt doch immernoch jeden an
while( x )
while( is_not_false( x ) )
sind doch vom Standpunkt des puren Verständnisses des Code, der da steht, identisch. Aber in PHP sind sie verschieden. Das ist zwar in PHP begründet, doch aber eine Schwäche. Hingegen ist
while( defined( x ) )
deutlich etwas anderes und leuchtet ein.
Warum braucht PHP dann einen === Operator und Java nicht,
Weil Java streng typisiert ist.
Natürlich, aber es geht um Programmiertechniken, nicht um interne Umsetzung derselben.
warum hat Perl keinen,
Weil es in Perl nur wenige Haupttypen an Variablen gibt: Skalare, Listen, Hashes, Dateidesktriptoren, Objekte und Referenzen. Eine Zahl, ein Bool-Wert und eine Zeichenkette werden alle durch den gleichen "Typ" repräsentiert.
Nein. Es gibt in Perl Skalare,Arrays und Hashes. Listen existieren nur intern. Intern kann ein skalar eine Menge halten, es gibt dort auch diverse Typen, wie in PHP: strings, integer, floats(und sowas), referenzen, ...
Nur gelingt es Perl, den Programmierer von diesen internen Typen fast nichts spüren zu lassen, dann schliesslich _will_ ich ja diesen typlosen Umgang.
PHP vermengt das. Es hat einerseits generalisierte Variablen, andererseits haben die Variablen Typen, die ich beachten muss. So sehr, dass es sogar Operatoren für Typprobleme gibt, wie ===.
Weil er überflüssig ist.
Nur, wenn keine implizierte Typkonvertierung (von Variablen selbst) stattfindet (Java) oder die Sprache überhaupt keine verschiedenen skalaren Typen kennt. (Perl)
Was ist mit Python. Warum hat Python keinen === Operator?
Ich halte den Identitätsoperator innerhalb des Variablen- und Typkonzepts von PHP durchaus für eine logische Notwendigkeit. Dass Dir das Typkonzept nicht unbedingt gefallen muss, ist eine andere Sache.
Das Problem am Typkonzept ist, dass es inkonstistent ist und den Programmierer mit Dingen belästigt, die er doch eigentlich nicht will. Wenn ich diesen Typquatsch will, nehme ich Java oder C zur Hand Will ich es nicht, nehme ich PHP, aber ich bekomme es trotzdem.
Hallo Richard,
Nein, denn in Perl heisst die Funktion defined(), sie prüft also auf Definiertheit, nicht Existenz.
Ich werde bei Gelegenheit mal perldoc konsultieren, was mit Definiertheit gemeint ist. (im Gegensatz zu Existenz)
[is_not_false]
Das springt doch immernoch jeden an
Verstehe ich nicht.
while( x )
while( is_not_false( x ) )
Sicherlich, die Benennung war vielleicht sehr ungeschickt.
Hingegen ist
while( defined( x ) )
deutlich etwas anderes und leuchtet ein.
Wenn es Dir einleuchtet (mir nicht) dann kannst Du die PHP-Funktion auch gerne defined nennen. (oder is_defined, falls defined ein reserviertes Wort ist, das weiß ich nicht auswendig)
Natürlich, aber es geht um Programmiertechniken, nicht um interne Umsetzung derselben.
Das kann man nicht trennen, da der Programmierer direkt damit in Verbindung kommt. (wie Du auch weiter unten gesagt hast)
Weil es in Perl nur wenige Haupttypen an Variablen gibt: Skalare, Listen, Hashes, Dateidesktriptoren, Objekte und Referenzen. Eine Zahl, ein Bool-Wert und eine Zeichenkette werden alle durch den gleichen "Typ" repräsentiert.
Nein. Es gibt in Perl Skalare,Arrays und Hashes. Listen existieren nur intern.
In SELFHTML heißen die Arrays Listen, daher habe ich sie Listen genannt. Die Variablen mit dem @ davor, um es mal bildlich auszudrücken. Aber mit den Objekten und Referenzen habe ich mich wirklich vertan.
Nur gelingt es Perl, den Programmierer von diesen internen Typen fast nichts spüren zu lassen, dann schliesslich _will_ ich ja diesen typlosen Umgang.
PHP definiert ganz deutlich diese Typen. Wenn Dir das nicht gefällt, dann musst Du PHP auch nicht verwenden.
Was ist mit Python. Warum hat Python keinen === Operator?
Ich kenne Python nicht, daher habe ich absichtlich keine Aussage darüber gemacht.
Das Problem am Typkonzept ist, dass es inkonstistent ist und den Programmierer mit Dingen belästigt, die er doch eigentlich nicht will.
Woher willst Du wissen, was "der Programmierer" will oder nicht?
Ich persönlich finde das Konzept von PHP eigentlich ganz brauchbar. Jeder hat nunmal andere Vorlieben und nur weil Dir etwas nicht gefällt, musst Du es nicht gleich auf die Allgemeinheit übertragen.
Wenn ich diesen Typquatsch will, nehme ich Java oder C zur Hand Will ich es nicht, nehme ich PHP, aber ich bekomme es trotzdem.
Nein. Es ist ganz einfach: Wenn Du diesen "Typquatsch" (wie Du ihn nennst) willst, dann nimmst Du Java, C oder PHP. Wenn Du ihn nicht willst, dann nimmst Du Perl.
Ich verstehe Dein Problem wirklich nicht: Du magst Typen nicht. Gut. Warum bleibst Du dann nicht bei Perl? Wenn Du PHP verwendest, kommst Du zwangsläufig mit Typen in Verbindung. Wenn Du Perl besser findest, warum nimmst Du es dann nicht einfach?
Viele Grüße,
Christian
PS: Im Übrigen ist $a === $b nur eine Abkürzung für ($a == $b) && (gettype ($a) == gettype ($b))
[is_not_false]
Das springt doch immernoch jeden anVerstehe ich nicht.
while( x )
while( is_not_false( x ) )Sicherlich, die Benennung war vielleicht sehr ungeschickt.
Hingegen ist
while( defined( x ) )
deutlich etwas anderes und leuchtet ein.
Wenn es Dir einleuchtet (mir nicht) dann kannst Du die PHP-Funktion auch gerne defined nennen. (oder is_defined, falls defined ein reserviertes Wort ist, das weiß ich nicht auswendig)
Es stimmt aber nicht. Ich prüfe ja nicht auf Definiertheit, sondern daruf, ob der Wert ein boolscher ist und auch noch false. Ich prüfe nicht, ob der Wert false ist, sondern ob er auch den reinen Typ boolean hat.
Die Funktion müsste
is_not_false_boolean( whatever ... )
heissen.
Weil es in Perl nur wenige Haupttypen an Variablen gibt: Skalare, Listen, Hashes, Dateidesktriptoren, Objekte und Referenzen. Eine Zahl, ein Bool-Wert und eine Zeichenkette werden alle durch den gleichen "Typ" repräsentiert.
Nein. Es gibt in Perl Skalare,Arrays und Hashes. Listen existieren nur intern.
In SELFHTML heißen die Arrays Listen, daher habe ich sie Listen genannt. Die Variablen mit dem @ davor, um es mal bildlich auszudrücken. Aber mit den Objekten und Referenzen habe ich mich wirklich vertan.
Das ist an dieser Stelle eigentlich unangebracht, aber der Perl-Abschnitt von Selfhtml ist keiner, der dazu dienen kann, Perl zu lernen :)
Nur gelingt es Perl, den Programmierer von diesen internen Typen fast nichts spüren zu lassen, dann schliesslich _will_ ich ja diesen typlosen Umgang.
PHP definiert ganz deutlich diese Typen. Wenn Dir das nicht gefällt, dann musst Du PHP auch nicht verwenden.
psst: mach ich auch nicht, aber http://www.wikiservice.at/dse/wiki.cgi?NiemandWirdGezwungen
Das Problem am Typkonzept ist, dass es inkonstistent ist und den Programmierer mit Dingen belästigt, die er doch eigentlich nicht will.
Woher willst Du wissen, was "der Programmierer" will oder nicht?
Der Programmierer will Konsistenz, aus dem einfachen Grund, weil Programmieren ohne konsistente Umgebungen keinen Spaß macht und Fehler produziert.
Wenn ich diesen Typquatsch will, nehme ich Java oder C zur Hand Will ich es nicht, nehme ich PHP, aber ich bekomme es trotzdem.
Nein. Es ist ganz einfach: Wenn Du diesen "Typquatsch" (wie Du ihn nennst) willst, dann nimmst Du Java, C oder PHP. Wenn Du ihn nicht willst, dann nimmst Du Perl.
Aber warum macht PHP den typquatsch dann nicht richtig? Nein, es hat, wie Perl, generall automatische Typkonvertierung. Mehr noch: es hat sogar implizite Typkonvertierung, wo nicht einmal Perl eine hat (== vs eq). Es versteckt den Typ einer Variablen, der Typ ist im Code nicht sichtbar. (es gibt kein "int $x = 5")
Trotzdem kann man so eine einfache Aufgabe wie eine while( readdir ) Schleife nicht korreakt realisieren, ohne tiefgreifendes Wissen über interne Typen zu haben. Viel mehr ist die Syntax verwirrend und erzeugt logisch redundante Konstrukte, wie
while( false !== (...) )
Ich verstehe Dein Problem wirklich nicht: Du magst Typen nicht.
Ich mag sie. Ich liebe sie. Die Möglichkeit der fixierten Typisierung in Perl 6 ist eine meiner liebsten Neuerungen. Aber ich mag es eben konsistent und schlüssig.
PS: Im Übrigen ist $a === $b nur eine Abkürzung für ($a == $b) && (gettype ($a) == gettype ($b))
Ja, das ändert nichts an der Imperfektion des Ganzen.
Hallo Richard,
Das ist an dieser Stelle eigentlich unangebracht, aber der Perl-Abschnitt von Selfhtml ist keiner, der dazu dienen kann, Perl zu lernen :)
Wieso ist das an dieser Stelle unangebracht?
Nur gelingt es Perl, den Programmierer von diesen internen Typen fast nichts spüren zu lassen, dann schliesslich _will_ ich ja diesen typlosen Umgang.
PHP definiert ganz deutlich diese Typen. Wenn Dir das nicht gefällt, dann musst Du PHP auch nicht verwenden.
psst: mach ich auch nicht, aber http://www.wikiservice.at/dse/wiki.cgi?NiemandWirdGezwungen
Das passt hier überhaupt nicht. Christian ist nicht PHP-Developer und will nicht verteidigen, dass dein Standpunkt anscheinend von den PHP-Devs nicht berücksichtigt wird. Er hat lediglich dargestellt, dass er persönlich mit dem Konzept leben kann, während andere besser mit anderen Konzepten arbeiten können, ohne damit eventuelle Versäumnisse der PHP-Entwickler verteidigen zu wollen. Das Pseudo-Argument »Niemand wird gezwungen« hingegen könnte höchstens von einem PHP-Developer geäußert werden, welcher sich mit der Kritik tatsächlich nicht sachlich auseinandersetzen will. Was es aber mit dieser unverbindlichen Diskussion zu tun hat, verstehe ich schlichtweg nicht.
Grüße,
Mathias