phpbar.de logo

Mailinglisten-Archive

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

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

Johannes Schlueter schlueter at phpbar.de
Sam Mai 22 14:05:35 CEST 2004


Hi,

On Saturday 22 May 2004 12:41, Norbert Pfeiffer wrote:
> missbilligt - aber nie abgeschafft, auch nicht in PHP5,
> wie der 'erweiterte' Versuch zeigt:

Hatte ich auch schon erwähnt ;-)

> Wieso ist eigentlich '' == "\0" ... <gruebel>

Ist es nicht. 

$ php -r 'var_dump("" == "\0");'
bool(false)
$ php -r 'strlen("");';
0
$ php -r 'strlen("\0");';
1

Das Zeichen \0 entspricht dem Zeichen mit ASCII-Code 0 und dass ist NULL und 
Du siehst es nur nicht, wenn Du die Ausgabe jedoch mit einem HEX-Editor oder 
ählnichem betrachtest wirst  Du es sehen.

> Wenn man in C oder VB in einen String eine \0 einfuegt,
> kann man sich wenigstens darauf verlassen,
> dass er genau dort zu Ende ist.

Mit VB kenne ich mich nicht aus, aber in C ist er dann nicht zu Ende bloß die 
meisten "einfachen" Stringfunktionen von C _interpretieren_ das \0 als Ende 
des Strings - wie schon mal in meiner letzten Mail erwähnt ist in C ein 
String ein Array von chars. Ein solches C Array "trägt" seine Länge aber 
nicht mit sich rum, so dass eine Funktion nicht "weiß" wie lange das Array 
ist und da ist es eine Regel, dass das \0 als Ende gewertet wird - das weiter 
auszufüren ist hier aber OT, daher Rückführung auf PHP: Ein String in PHP ist 
in der internen Darstellung[1] ein C-String zusammen MIT einer Längenangabe 
und ein Großteil der internen Funktionen nutzt jetzt eben diese Längenangabe 
und nicht \0 als Begrenzung wodurch PHP in weiten Teilen "binary safe" ist. 
(Es gibt ein paar Funktionen, die externe Bibliotheken nutzen, die nicht 
binary safe sind und somit ist den den Bereichen PHP auch nicht binary safe, 
daher die Einschränkung auf weite Teile)

johannes

[1] http://lxr.php.net/source/Zend/zend.h#249

php::bar PHP Wiki   -   Listenarchive