Mailinglisten-Archive |
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