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.