phpbar.de logo

Mailinglisten-Archive

AW: [php] kaputter String ( was: Array mit String überschreiben - Bug?)

AW: [php] kaputter String ( was: Array mit String überschreiben - Bug?)

Andreas Müller php at universalware.de
Son Jun 6 13:24:40 CEST 2004


Hallo Peter,
ich hab die Diskussion etwas verfolgt und mich köstlich amüsiert.

In jeder Programmiersprache kann man Unfug anstellen wenn man etwas in einer
Art verwendet wie es nicht vorgesehen ist. Und darüber ewig zu debattieren
macht absolut keinen Sinn.

Strings sind in PHP nunmal binary safe. Und das finde ich richtig gut so!
Wer C und ähnliche Sprachen kennt die Probleme mit
Null-Terminierten-Strings. Bleiben wir mal bei 8 Bit Zeichen dann kann eben
ein String in PHP alle zeichen von 0-255 aufnehmen. Ein String in C nicht -
was ich manchmal recht blöd finde. Und da der String eben alle Zeichen
aufnehmen kann hat nunmal auch ein Zeichen chr(0) die länge von 1. Ist ja
auch genau ein Zeichen nämlich genau das Zeichen mit den Ordinalwert 0. Und
das ist in jeder Programmiersprache so. Auch in C hat ein chr(0) die Länge
1 - nur "erkennt" C an diesem Zeichen das der String hier "aufhören" soll.
Deswegen belegt ein String in C auch immer Länge+1 Bytes an Platz - weil das
letzte Zeichen (chr(0)) ja mitgespeichert werden muss. PHP oder Pascal(z.B.
Delphi) führen halt zu einem String noch eine Längenangabe mit. Somit
entfällt dieses "Endezeichen". Und das hat imense Vorteile: Die Sprache
weiss durch den Zugriff auf einen Speicherbereich wie lang der String ist -
C muss da zählen und man kann alle Zeichen unterbringen. Hat aber auch einen
Nachteil: Man brauch ein paar Byte mehr Platz pro String (z.B. 4 Byte in
Delphi).

Ein paar Sachen finde ich in PHP nicht konsequent genug gelöst/überwacht
z.B.:

$string{1}='' - sollte Prinzipiell einen Fehler liefern. Ein Character (und
das ist $var{1} nunmal)
                kann nicht gleich einem Leerstring sein.

$string{1}='ab' - sollte prinzipiell einen Fehler liefern. Ein Character
kann nur maximal einen anderen
                  Character aufnehmen und nicht mehere.

$string[index]  - sollte prinzipiell einen Fehler liefern. Ein String ist
nunmal kein Array wenn in der
                  Programmiersprache ein anderer Syntax (nämlich mit {}) für
den Einzelzeichenzugriff
                  vorgesehen ist (Array expected). Oder man müsste sämmliche
nicht numerischen Indices als
                  Fehler behandeln (invalid array index). Für alles weitere
gilt wie oben: Ein Character ist
                  ein Character.

Wenn man einfach das beherzigt und alles als das verwendet was es ist:
String als String, Array als Array und Character als Character dann hat man
auch keine Probleme. Wenn man aber anfängt rumzutricksen dann braucht man
sich über Seiteneffekte nicht wundern. Ganz klar ist aber das eine
Programmiersprache (und hier eben PHP) doch etwas strenger sein könnte und
Blödsinn gleich im Keim ersticken sollte. Das ist gerade deswegen notwenig
weil es in PHP keine explizite Typ-Deklaration gibt und somit Probleme
vorprogrammiert sind die entstehen können wenn unterwegs eine Variable mal
ihren Datentyp ändert.

Gruß,
Andreas




php::bar PHP Wiki   -   Listenarchive