Відповіді:
Це означає, що функція буде правильно працювати при передачі їй довільних двійкових даних (тобто рядків, що містять не-ASCII байти та / або нульові байти).
Наприклад, небінарна безпечна функція може базуватися на функції C, яка очікує нульових кінцевих рядків, тому якщо рядок містить нульовий символ, функція буде ігнорувати що-небудь після неї.
Це актуально, оскільки PHP не чітко відокремлює рядкові та двійкові дані.
Інші користувачі вже згадували, що binary safeозначає взагалі.
У PHP значення більш конкретне, посилаючись лише на те, що Майкл наводить як приклад.
Усі рядки в PHP мають пов’язану довжину, яка є кількістю байтів, що їх складають. Коли функція маніпулює рядком, вона може:
0.Правда також, що всі струнні PHP-змінні, якими маніпулює двигун, також недійсні. Проблема з функціями, які покладаються на 2., полягає в тому, що якщо сам рядок містить байт зі значенням 0, функція, яка ним маніпулює, подумає, що рядок закінчився в цій точці і проігнорує все після цього.
Наприклад, якщо strlenфункція PHP працювала як стандартна бібліотека C strlen, результат тут був би неправильним:
$str = "abc\x00abc";
echo strlen($str); //gives 7, not 3!
strlen()є бінарною безпечною функцією? Я підтверджую, що на сторінці керівництва PHP щодо функції strlen()не було зазначено, що це бінарно безпечна функція або небінарна безпечна функція. Ця єдина річ, що відсутня в Посібнику PHP , створює плутанину в моїй свідомості, тому я хочу підтвердити це від вас. Я з нетерпінням чекаю вашої відповіді. Спасибі.
php -r 'var_dump("\x00\x00\x00");'щоб перевірити, але strlen у strp був бінарним безпечним дуже довгий час, оскільки принаймні php 4.x (що говорив, є гидота під назвою "mb_overload", але дозволяє просто робити вигляд, що її немає - 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.
?>
\xвказує на шістнадцяткові позначення. Дивіться: Рядки PHP
0x00 = NULL
0x04 = EOT (End of transmission)
Таблиця ASCII, щоб побачити список символів ASCII
Hello\r\nWORLDце не повинно бути таким же, як Helloякщо функція є бінарною безпечною, правда?
strlen() безпечна ?