phpbar.de logo

Mailinglisten-Archive

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

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

Peter Bieling network at media-palette.de
Son Jun 6 11:50:05 CEST 2004


Hallo Johannes,

danke für die ausführlichen Erläuterungen und Deine Geduld. :-)

Johannes Schlueter wrote:

> Durch die _Zuweisung_ von nichts ('') auf $string{1} wird da das entsprechende 
> Zeichen nicht gelöscht sondern durch nichts ersetzt. Nichts wird dabei durch 
> NULL, also das Zeichen mit Ascii-Wert 0 repräsentiert.

Folgendes Beispiel gibt Dir recht:
$var3="ABCDEF";
echo $var3 . "---length: " . strlen($var3) . "<br>";
//length: 6
$var3= substr_replace ($var3, chr(0), 3, 1);
echo $var3 . "---length: " . strlen($var3) . "<br>";
//length: 6

während, wie ja bereits gezeigt, der Tausch eines Zeichens gegen '' mit 
substr_replace den String tatsächlich um eins kürzt.
Hier wird also mit zweierlei Maß gemessen.

Vergleiche mit C und anderen Sprachen sind natürlch interessant. Aber: C 
ist C und PHP ist PHP. Jede Sprache sollte sich schon selbst definieren. 
Wenn ich in PHP einen Datentyp String habe, muss der nicht unbedingt mit 
dem Strings in C vergleichbar sein, die Arrays sind. (Wurde auch schon 
gesagt.) PHP sollte da unbedingt seine eigene in sich logische 
Gesetzmäßigkeit haben. Dazu gehört natürlich auch die Frage, welche 
Länge '' oder chr(0) hat. Wenn chr(0) keine Länge hat, ist '' natürlich 
nicht mehr da, wenn es als Zeichen eingesetzt wurde. Es kann dadurch den 
String faktisch verkürzen, d.h. ein Zeichen ausradieren. Wenn man ein 
Zeichen chr(0) _mit_ Länge 1 zulässt, frage ich mich: Was will man damit?

> Ergebnis: Auch bei "ordentlichen" Programmiersprachen kann man nicht einfach 
> ein Zeichen mit "nichts" überschreiben und somit Teile aus dem String kürzen. 
> Wenn ich _ein_ Zeichen bearbeite will ich, dass auch nur _ein_ Zeichen 
> beabeitet wird. Wenn ich "Wechselwirkungen" mit anderen Zeichen zulassen will 
> nutze ich substr oder ähnliches, die darauf Rücksicht nehemen.

Richtig, ich kann nur empfehlen, Strings ausschließlich so zu 
manipulieren und nicht wie folgt:

> <?php
> $string = 'foo';
> $string{1} = 'bar'; 
> echo $string;
> ?>
> 
> Gibt ja auch "fbo" und nicht "fbar" aus.

Genau! Wer solchen Code schreibt, kann eigentlich nur etwas falsch 
gemacht haben.
Von einer hardwarenahen Sprache erwarte ich _nicht_, dass sie für mich 
mitdenkt. Eine Skriptsprache dagegen sollte solche Fehlerquellen einfach 
verhindern. Noch einmal zur Erinnerung:

$kein_array=array(); //Array
$kein_array['gibtsnich']='Katze';
$kein_array="Katze"; //String
$kein_array['gibtsnich']='Hund';
echo $kein_array['gibtsnich']; //= H
echo $kein_array; //= Hatze

Also mein Vorschlag: Weg mit diesen direkten Schreibzugriffen auf 
einzelne Zeichen in künftigen PHP-Versionen. Das braucht kein Mensch und 
produziert nur Fehler.

Viele Grüße

Peter

PS. Ich werde mir gleich mal ansehen, wie Perl das Zeichen chr(0) 
bewertet. Bin mal gespannt. ;-)






php::bar PHP Wiki   -   Listenarchive