回答:
これは、任意のバイナリデータ(ASCII以外のバイトやnullバイトを含む文字列)を渡した場合に、関数が正しく機能することを意味します。
たとえば、非バイナリセーフ関数は、nullで終了する文字列を予期するC関数に基づいている場合があるため、文字列にnull文字が含まれている場合、関数はその後のすべてを無視します。
PHPは文字列とバイナリデータを明確に分離しないため、これは重要です。
他のユーザーはすでにbinary safe一般的な意味を述べました。
PHPでは、その意味はより具体的であり、Michaelが例として挙げたものにのみ言及しています。
PHPのすべての文字列には長さが関連付けられています。これは、それを構成するバイト数です。関数が文字列を操作するとき、次のいずれかを実行できます。
0を持つバイトが表示されます。エンジンによって操作されるすべての文字列PHP変数もnullで終了することも事実です。2.に依存する関数の問題は、文字列自体にvalueを含むバイトが含まれている場合、0それを操作する関数は、文字列がその時点で終了したと見なし、その後のすべてを無視することです。
たとえば、PHPのstrlen関数がC標準ライブラリのように機能した場合、strlenここでの結果は正しくありません。
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()はバイナリセーフな関数だと言っていますか?PHPマニュアルページでは、関数strlen()がバイナリセーフ関数であるか非バイナリセーフ関数であるかについて言及されていないため、確認します。PHPマニュアルに欠けているのは、私の心に混乱をもたらしているため、確認させていただきます。ご返信を心よりお待ちしております。ありがとうございました。
php -r 'var_dump("\x00\x00\x00");'を確認するために、しかし、PHPのstrlen関数は、のためにバイナリセーフとなっている非常に(つまり「mb_overload」と呼ばれる醜態がある、と述べたが、ちょうどそれが存在していないふりをすることができます少なくともPHP 4.xのために、長い時間- php.net /manual/en/mbstring.overload.php)
その他の例:
<?php
$string1 = "Hello";
$string2 = "Hello\x00World";
// This function is NOT ! binary safe
echo strcoll($string1, $string2); // gives 0, strings are equal.
// This function is binary safe
echo strcmp($string1, $string2); // gives <0, $string1 is less than $string2.
?>
\x16進表記を示します。参照:PHP文字列
0x00 = NULL
0x04 = EOT (End of transmission)
Hello\r\nWORLDと同じであってはなりませんHelloよね?
strlen() バイナリセーフですか?