php是以c为基础的,所以很多描述都是以c为准。c的字符串里,一种经典的定义就是,以编码0作为字符串的结尾。
c代码示例:
1
2
3
4
5
6
|
main(){
char
ab[] =
"aa\0b"
;
char
ac[] =
"aa\0c"
;
printf
(
"%d\n"
,
strcmp
(ab, ac));
printf
(
"%d\n"
,
strlen
(ab));
}
|
c语言会认为ab和ac是相等的。因为在c语言中是以\0作为结尾的。
同样的在php中。
1
2
3
4
5
6
|
<?php
$ab
=
"hello"
;
$ac
=
"hello\x00Hello"
;
var_dump(
strcmp
(
$ab
,
$ac
));
var_dump(
strlen
(
$ab
));
?>
|
结果依次为0,11.
strcmp是判断两个字符串是否相等非二进制安全,相等会返回0,不等则返回1.
strlen是判断字符串的长度,二进制安全。
会发现非二进制安全会误判为相等。
那么php是如何做到二进制安全的呢。
php会根据type的值决定访问某个成员。为字符串时,php会记录val的指针和字符串的长度len,当需要进行判断时,php会直接获取到type的值不需要和c一样去判断字符串末尾的\0